https://si3t.ch/log/

prx

prx@si3t.ch

2025-01-28T21:25:51Z

https://si3t.ch/log/2025-01-28-nouvelles-du-jour.txt

2025-01-28T20:53:40Z

<![CDATA[

Écologie

Après avoir lu l'interview de Kim Stanley Robinson dans le recueil de nouvelles des utopiales de l'an dernier (oui, j'ai du retard...), voici quelques mots pour traduire à ma façon ses propos. Une forme d'appel à la résistance, rien qu'en changeant nos points de vues imposés par les captifs d'actionnaires:

Les écoterroristes n'existent pas. Ils n'y a que des écorésistants. Ils ne s'attaquent pas aux personnes, ils s'en prennent aux machines. Leur pire ennemi? L'inhumaine machine capitaliste.

Hygiène

De plus en plus d'élèves absents en classe. La grippe est là.

Ma fille de 3 ans a du mal à guérir, voilà plus d'une semaine que la fièvre fait le yoyo.

Remettez les masques si vous êtes malades.

Et lavez vos putains de main régulièrement!

Dommage, il n'y a plus de gel hydroalcoolique dans les classes. C'était bien pratique d'en avoir à disposition après avoir éternué ou s'être mouché.

Perso

Je réapprends à fonctionner.

C'est plus dur que je l'imaginais.

Un bon ami m'a dit que "je ne suis pas adapté au système actuel". ;)

Je l'ai pris comme un compliment :).

Peut-être.

Qu'importe, je suis la roue dentée qui grince ou le grain de sable qui la retient de tourner?

Je reste engagé pour l'humain avant tout.

Code

J'ai corrigé quelques bugs dans ralf, le renommeur de fichiers.

=> https://git.sr.ht/~prx/ralf

Il y avait notamment un défaut quand la chaîne de remplacement était plus courte que la partie à remplacer.

J'aimerais avoir plus de retour, notamment sur le code, car je reste un débutant en C.

J'ai ajouté un man, et des cibles dans le Makefile pour installer/désinstaller.

Un petit bout de pledge() permet d'assurer qu'il ne fait pas n'importe quoi, mais vu la longueur du code, il y avait peu de risques.

En tout cas pour l'instant, il fait le job de mon côté : utiliser des regex (simples, je ne suis pas un fou des regex) pour renommer des fichiers en masse.

Suite

J'aimerais créer un port pour iblock.

Ça fait plus d'un an que le démon que j'ai écrit pour l'utiliser tourne sans soucis sur mon serveur.

Je traîne, car ça suppose créer un utilisateur spécifique pour le lancer.

De plus, je dois écrire la page man pour bien faire :S.

=> https://tildegit.org/solene/iblock

Pensée

On oublie les tyrans, qui de leur vivant n'inspirent que la peur.

On se souvient des bons, car après leur mort ils inspirent l'espoir.


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=nouvelles-du-jour

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-27-ralf.txt

2025-01-27T21:03:40Z

<![CDATA[

Entre tous les gestionnaires de fichiers, il y a une fonctionnalité que je trouve tout particulièrement réussie dans Thunar (le gestionnaire par défaut dans XFCE) : le renommage en masse de fichiers.

Il offre plusieurs options très pratiques pour renommer des fichiers avec des fonctionnalités comme chercher/remplacer, support des regex, à partir d'une position donnée...

Bref, même si je n'utilise plus XFCE sur mon ordinateur de travail (mais c'est l'environnement que j'installe à mes proches), j'ouvre encore Thunar pour... renommer des fichiers ^^.

Il était temps pour moi de trouver un outil qui me permet de faire la même chose dans un terminal, puisque je passe le plus clair de mon temps dedans, et si je dois gérer des fichiers, c'est avec rover.

=> https://github.com/lecram/rover

C'est ainsi qu'est née l'envie d'écrire ralf, comme "Rename A Lot of Files" (le nom a beaucoup changé...).

Vous pouvez le récupérer et le tester à partir de cette URL:

=> https://git.sr.ht/~prx/ralf

J'ignore si c'est bien portable en dehors d'OpenBSD, puisque j'utilise strlcat et sltrcpy pour assurer le bon fonctionnement du traîtement des chaînes de caractères. Je pourrais m'en passer avec memcpy() et memmove(), mais autant m'appuyer sur le travail de gens sérieux.

Sur debian, il faut installer libbsd-dev je crois.

ralf est encore tout nouveau, il y a sans doutes des améliorations à y apporter.

Avant cela, et aussi pour me permettre de réfléchir à ce que j'ai écrit, voici quelques explications sur le code.

Options? Flags?

Au départ, j'ai envisager de recopier les diverses façons de renommer que propose Thunar:

Après avoir écrit un menu pour sélectionner la méthode, j'ai finalement réalisé que les regex permettaient de faire le tout.

Liste des fichiers ?

Initialement, ralf listait les fichiers présents dans le dossier courant avec scandir(3).

C'est une fonction que j'ai déjà utilisé, qui permet d'avoir rapidement une liste des fichiers/dossiers présents.

Puis, je me suis dit que restreindre au dossier courant n'était pas très pratique, et que devoir réallouer la taille de la liste en mémoire avec des mallocs n'était pas très efficace.

De plus, on peut profiter des méthodes de sélection du shell, comme le fameux glob "*".

Alors, tant qu'à faire, je laisse le shell et l'utilisateur décrire les fichiers à renommer en les passant en argument.

En passant, j'ai réalisé que le premier argument est toujours le programme en cours d'exécution, j'ai donc retiré le premier paramètre dans argc.

Enregistrement des fichiers à traîter

Pour commencer, j'ai enregistré la liste des fichiers à éventuellement renommer dans une liste, tout simple après avoir vérifié que le fichier existe bel et bien:

int
file_exist(const char *fn)
{
        struct stat sb;
        if (stat(fn, &sb) == 0) {
                return 1;
        } else {
                return 0;
        }
}

Ça fonctionnait bien, mais cela devenait plus compliqué lorsque je voulais associer le nouveau nom de fichier et parcourir la liste en question.

Puis je me suis souvenu qu'il existe déjà tout ce qu'il faut pour ce genre de taches : les queues!

Avec sys/queue.h, il y a des méthodes toutes prêtes pour insérer/traiter dans l'ordre une liste chaînée d'objets.

Me voilà donc avec une structure qui me permet d'avoir pour chaque fichier le nom courant et à côté le nom à donner:

struct Filename {
        int modified;
        char name[FILENAME_MAX];
        char new[FILENAME_MAX];
        SIMPLEQ_ENTRY(Filename) filename;
};
SIMPLEQ_HEAD(Filelist_head, Filename);

On remarque la variable "modified", qui me permet de savoir ensuite si le fichier doit effectivement être renommé, et mettre un peu de couleur pour identifier le changement prévu.

Interface utilisateur

Je ne connais pas ncurses.h.

Alors j'en suis resté aux bons vieux fgets() et getchar().

Oups, je devrais dire getline() et getchar(), puisque le manpage de fgets() conseille d'utiliser getline dans le cas d'entrée hasardeuse.

Là encore, tout est prêt et bien pensé, c'est du gâteau.

J'ai choisi de tout simplement demander à l'utilisateur la regex à rechercher puis par quoi remplacer.

La gestion des regex.

Là, j'au un peu plus réfléchi.

Au départ, j'avais une boucle qui cherchait dans le nom du fichier les patterns correspondant à la regex entrée et qui remplaçait dans ce nom du fichier par la chaîne choisie par l'utilisateur.

Cependant, ça posait un problème de boucles infinie.

Imaginez que l'on a le fichier "babar.txt".

L'utilisateur demande de remplacer "[a-c]" par "b".

On comprend qu'il voudrait que "babar.txt" devienne "bbbbr.txt".

Cependant, puisque "b" fait partie de "[a-c]", alors ça boucle sans cesse.

J'ai donc modifié mon algorithme pour ne traîter chaque pattern qu'à une seule reprise. Au final, la fonction est nettement plus simple:

        regex_t regex;
        regmatch_t match[1];
        int regret = 0;
        int n = 0;
        int lastpos = 0;
        char buf[BUFSIZ] = {'\0'};
        char tmp[FILENAME_MAX] = {'\0'};

        /* copy the string to tmp, then modify it */
        estrlcpy(tmp, str, sizeof(tmp));

        if ((regret = regcomp(®ex, pattern, REG_EXTENDED)) != 0) {
                regerror(regret, ®ex, buf, sizeof(buf));
                regfree(®ex);
                err(1, "%s", buf);
        }

        while (regexec(®ex, tmp, 1, match, 0) == 0) {

                /* append beginning of tmp in new until match start */
                tmp[match[0].rm_so] = '\0';
                estrlcat(new, tmp, newsiz);

                /* replace this part */
                estrlcat(new, rep, newsiz);

                /* move the end of the string at the beginning of tmp */
                memmove(tmp, tmp + match[0].rm_so + 1, sizeof(tmp));

                n++;
        }
        /* at the end, copy the unmatching ending of tmp in new */
        estrlcat(new, tmp, newsiz);

        regfree(®ex);
        return n;

stack

J'ai choisi d'éviter les malloc().

Ce n'est pas par fainéantise (un peu), mais puisqu'il existe déjà FILENAME_MAX définit dans POSIX.

Par ailleurs, ça simplifie le code plutôt que d'allouer de la mémoire et lancer free() ci et là.

Ce qu'il manque

Ça, c'est à vous de me le dire ^^.

Pour l'instant, j'ai identifié le souci qui se pose quand un nom de fichier existe déjà : il est tout simplement écrasé. Mettre un petit warning serait pas mal ^^.

J'hésite aussi à virer strlcpy et strlcat pour rendre le code plus portable, et aussi pour l'exercice. Qu'en pensez-vous?

Ah, il faudrait aussi une manpage.


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=ralf

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-25-mars-KSR.txt

2025-01-25T13:29:23Z

<![CDATA[

J'ai (enfin) terminé la lecture de la trilogie Mars de Kim Stanley Robinson.

Mars la Rouge, Mars la Verte, Mars la Bleue.

Je comprends pourquoi on me l'avait conseillé, c'est vraiment le genre de choses qu e j'aime.

Tout d'abord, survivre dans un environnement extrême, s'adapter et se mêler à l'écologie, un peu comme les Fremen dans Dune.

Mais cet ouvrage va bien bien au-delà de ces simples préoccupations.

Il y a de la politique, de l'humain, surtout de l'humain.

J'y ai trouvé une ode à la vie sous toute ses formes, un bel hommage à l'amour.

Pour épicer le tout, la science est fondamentale dans l'écriture, (parfois trop?), et est l'outil qui permet à l'humain de s'élever et grandir sans détruire.

Je crois qu'on pourrait inscrire cette trilogie dans le genre solarpunk:

Les personnages sont incroyables.

Et en plus ça finit bien :)

Bref, je recommande, mais accrochez-vous, c'est de la hard SF!

ps : petit rappel de ce qu'est le mouvement solarpunk:

=> https://si3t.ch/misc/solarpunk/


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=mars-KSR

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-23-sans-suite.txt

2025-01-23T11:02:47Z

<![CDATA[

Je peux réécouter de la musique.

Je peux recommencer à lire.

Je peux suivre une conversation sans en perdre le fil.

Je peux dormir.

Je peux enfin respirer.

Je n'ai plus à lutter pour empêcher mon cerveau de penser, analyser, reconstituer.

Je peux passer une journée sans espérer avec impatience le moment où le somnifère mettra fin à la torture de l'attente, arrêtera l'angoisse.

Bien sûr, tout n'est pas résolu.

Reste à comprendre.

Reste à expliquer, que cela n'arrive plus.

Apprendre à écouter son instinct.

Parfois, on aide les autres sans y penser, parce que c'est normal.

Parfois, on fait du mal sans le vouloir, sans s'en rendre compte.

Parfois, on se trompe, sans s'en rendre compte.

Parfois, on pense faire le bien alors qu'on n'a en réalité aucune importance.

Parfois, on imagine ne rien faire de mal et malgré tout être en décalage avec la réalité.

Parfois, on s'efforce de faire pour le mieux, mais certains y voient une volonté de nuire ou de profiter d'autrui.

Parfois, tout le monde va bien, mais les autres imagine le mal. Préjugés, absence, déni, pouvoir, incompétence, zèle...

Un fonctionnaire m'a appelé avec son téléphone personnel ce soir, bien au-delà de ses heures de travail, pour me faire part de la décision de la magistrate : classé sans suite.

J'ai été placé en garde à vue.

Ça signifie qu'on a envisagé à un moment donné me placer en prison.

Alors que j'aidais mon fils à s'habiller, on a toqué à la porte : je n'oublierai jamais ce son. Le prochain livreur me donne des frissons.

Perquisition, on confisque tout mon matériel informatique. Autant vous dire qu'avec tout le bazar récupéré, l'ordi de travail, l'ordi pour regarder des films, l'ordi pour le retrogaming, les dizaines de clés USB à reformater, les disques durs de sauvegarde, il y avait un paquet de trucs...

J'ai coopéré, aucune raison de ne pas donner les phrases de pass pour déchiffrer les disques.

Oui, je sais, il paraît qu'il ne faut pas faire ça, mais pour le coup, je n'ai vraiment rien de mal à cacher... Un avocat? Quoi? Je veux démontrer mon innocence, alors qu'ils cherchent à prouver ma culpabilité.

Mes mots de passes écrits en clair sur des feuilles de papier... une bonne raison de les renouveler vous me direz.

Un long trajet en voiture banalisée, à fond la caisse, la conduite en toute sécurité, on oublie.

Je suis chanceux, on ne m'a pas menotté devant mes enfants.

Un interrogatoire bienveillant, méticuleusement calculé et analysé.

Ascenseur émotionnel, gentillesse et bousculade, rien n'est épargné pour entrevoir le vrai.

Tout est fouillé dans mes affaires et dans ma vie.

C'est très bien comme ça, il faut protéger tout le monde. C'est compliqué à vivre.

Déformation de la réalité, corruption des mots et des intentions...

Qui suis-je? Je doute de tout, même de moi.

Empreintes digitales, ADN, papiers à signer, attente encore et encore.

L'imagination de tout ce qui pourrait se passer, l'impuissance, le meilleur et surtout le pire.

Tiens, les photos de profil ne passent pas dans le fichier... Le gendarme transfère les photos de son portable vers l'autre machine en passant par son webmail laposte.net... Une partie de mon cerveau trouve ça rigolo. Mais que puis-je y faire de toute façon?

Retour à la maison avec mes affaires dans un sac poubelle.

J'ai de la chance, il y avait des trains.

Le second interrogatoire en rentrant chez soi. Légitime, compréhensible, mais si douloureux malgré tout leur soutient.

La présence des collègues, indispensable, salvatrice.

La lutte contre soi. Sans enfants, sans famille, sans amour, très vite la fin serait arrivée.

J'admire celleux qui affrontent la dépression. Quel courage! Je ne sais pas comment peut-on tenir si longtemps face aux idées noires?

2 jours figé devant le téléphone, en attente d'une réponse.

2 semaines d'attente, sans savoir...

Trembler de l'intérieur. Tout à l'intérieur.

Trembler sans savoir pourquoi.

Froid. Tout le temps.

Se forcer à manger pour tenir.

Le coeur qui bat si fort que je sens les veines de mon coup cogner, mon sang frapper derrière mes yeux.

Essayer d'être, à encaisser le regard innocent des autres qui n'a pas changé, quand c'est moi qui n'est plus le même.

Les heures n'ont plus tout à fait la même saveur. Il faut réapprendre.

Changer les mauvaises habitudes, plus de mail professionel sur le téléphone, plus de mail instantané.

L'enfer est passé.

Je ne me sens pourtant coupable, cela n'aurait pas dû arriver.

L'essentiel a été mis en valeur.

Ceux sur qui on peut compter.

Ce qui est le plus important.

Respirer.

Avant la suite.

Je ne connais pas la peur, car la peur tue l'esprit.
La peur est la petite mort qui conduit à l'oblitération totale.
J'affronterai ma peur.
Je lui permettrai de passer sur moi, au travers de moi.
Et lorsqu'elle sera passée, je tournerai mon oeil intérieur sur son chemin.
Et là où elle sera passée, il n'y aura plus rien.
Rien que moi.


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=sans-suite

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-22-nuage.txt

2025-01-22T15:01:31Z

<![CDATA[

Suite à de récentes mésaventures, je réalise que ma méthode de sauvegarde n'est pas parfaite.

Actuellement, à chaque fois que j'éteins mon ordinateur, rsync envoie mes données sur mon serveur.

C'est via SSH, c'est éprouvé et robuste, et surtout c'est à mon avis bien sécurisé : clé SSH et chiffrement du disque.

Bref, ça me convient très bien pour mes données personnelles.

Cependant, cela suppose que j'ai accès à mon serveur en cas de besoin, et donc ma clé ssh à disposition.

Évidemment, il suffit de "perdre" mon ordinateur pour être coincé.

Le premier souci qui s'impose, c'est tous mes documents persos. Et en fait, il n'y en a pas tant que ça.

Ce qui est vraiment embêtant, c'est de ne plus avoir l'ensemble de mes cours. Des années de travail.

Heureusement, je dispose d'une instance Nextcloud pour le travail, ça s'appelle nuage, et c'est disponible pour tous les personnels de l'éducation nationale je crois.

=> https://nuage.apps.education.fr/

C'est fait pour le boulot, alors c'est parfait pour le besoin que j'en ai.

Me voilà donc à tester nextcloudcmd pour envoyer mes cours sur nuage.

Je m'y suis peut-être mal pris, mais l'application de synchronisation Nextcloud plante sur mon OpenBSD -current (bug à faire remonter si je prends le temps...), et nextcloudcmd ne fait rien...

Je me suis donc tourné vers rclone, et là, je suis ravi tellement ça marche bien. Il uploade les changements via le protocole webDAV, et j'ai mes documents toujours à portée de main même si mon matériel n'est plus accessible.


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=nuage

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-15-Privatebin.txt

2025-01-15T14:04:57Z

<![CDATA[

De récentes mésaventures m'ont fait réaliser que je compte trop sur mon accès SSH à mon serveur. C'est notamment vrai lorsque je veux partager un fichier.

Habituellement, j'ai un petit script qui uploade avec sftp le fichier à partager dans un dossier.

#!/bin/sh
# put a file on a server using sftp.
# It returns an url to the randomized file name
# A pubkey authentication is preferred
test $# -eq 1 || exit

sshcred="user@domain.tld"
url="https://si3t.ch/pub/tmp"
outdir="/var/www/htdocs/si3t.ch/pub/tmp"

# if file has extension
case "${1}" in
    *.*) ext=".${1##*.}" ;;
    *) ext="" ;;
esac

#rdm="$(openssl rand 5 -hex)$(date +%s)"
rdm="$(date +%s)"
out="${rdm}${ext}"

(
printf "put \"%s\" %s\n" "${1}" "${outdir}/${out}"
printf "chmod 666 %s\n" "${outdir}/${out}"
printf "quit"
) | sftp "${sshcred}" > /dev/null 2>&1


printf "%s\n" "${url}/${out}" | xclip -i -selection clipboard
printf "%s\n" "${url}/${out}"
exit 0

Régulièrement, les fichiers qui sont trop vieux sont supprimés. J'ai pour cela une tâche cron qui s'en occupe:

@weekly find /var/www/htdocs/si3t.ch/pub/tmp/ -type f -mtime +8 -delete

Mais je ne peux utiliser cette méthode que si je dispose d'un ordinateur capable de faire du ssh, et à fortiori qui contient ma clé SSH.

Me voilà donc en quête d'un outil à auto-héberger.

Et là c'est la misère, à croire qu'il n'existe plus que docket et nodejs pour développer des trucs.

Rendez-nous les petits CGI propres ou les bouts de PHP pas compliqués!

Par hasard, je suis ensuite tombé sur le Privatebin de mon académie:

=> https://secret.ac-nantes.fr/

Je fais confiance à l'admin de mon serveur, je vais donc héberger Privatebin qui non seulement chiffre les données dans le navigateur (zero-knowledge pour le serveur) et permet de joindre des fichiers.

Après un peu de configuration, j'ai un truc qui me plaît :

La configuration de httpd pour les curieux est tout bête:

# Privatebin
# Interdit de lire les données pastées
location "/tools/secret/data/*" { block }
# seul le index.php est traîté par PHP
location "/tools/secret/" { directory index index.php }
location "/tools/secret/index.php" { fastcgi socket "/run/php-fpm.sock" }

Si vous en avez besoin, c'est par ici:

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

Je suis curieux de découvrir de nouveaux outils à héberger, si possible de type zero-knowledge.


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=Privatebin

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-06-sac-d-urgence.txt

2025-01-06T11:30:46Z

<![CDATA[

Imaginons qu'une catastrophe ait lieu demain : une guerre éclate, une tempête effroyable approche, une maladie incurable se répand, un nuage de gaz toxique est inévitable, des pluies acides sont imminentes, l'extrême-droite est arrivée au pouvoir...

Deux possibilités s'offrent alors à nous : rester combattre ou fuir.

Évidemment, impossible de savoir à l'avance comment on pourrait réagir ni ce qui sera réellement possible.

Manifestation de mon eco-anxiété? J'y pense (trop) souvent, et visualise des scénarios catastrophes quand le sommeil ne veut plus de moi à 3h du matin.

J'ai peut-être (probablement) quelques soucis qu'un psy pourrait creuser...

Peu importe, j'ai depuis quelques temps pris des mesures pour être préparé un minimum.

J'essaie de pas tomber dans paranoïa, je n'ai pas (encore) creusé de bunker dans le jardin ^^.

C'est justement en rigolant de ce sujet avec un couple d'amis qu'il m'a regardé très sérieusement, presque avec honte, pour me dire "mais moi aussi".

Plus tard, en rigolant, il me dira :

"Tout bon père de famille devrait avoir un sac d'urgence à portée de main". 😊

Ça me fait penser que peut-être certains trouveront intéressant le contenu de ce sac d'urgence.

Il existe des "kits de survie" tous prêts, et peuvent constituer une bonne base de départ, bien que des choses soient inutiles ou alors manquantes.

Il doit être léger, pratique à emporter, de façon à ce que se soit la seule chose à prendre puis partir à toutes jambes.

Mon vieux sac à dos qui me servait au collège à transporter mes affaires de sport fait tout à fait l'affaire: :)

À l'intérieur, on trouve :

Un jour, j'apprendrai à fabriquer un radio-émetteur pour compléter ce kit...

Il manque peut-être des couverts... Mais on ne part pas pour un camping ^^

Pareil pour la petite pelle... Pas sûr que ce soit le + important en cas d'urgence.

Il y a même une page gouvernementale sur le sujet:

=> https://www.info.gouv.fr/risques/se-preparer-a-une-situation-durgence

Une autre source avec des idées intéressantes :

=> https://www.croix-rouge.fr/faire-face-au-choc-climatique-nos-propositions-pour-une-meilleure/catakit-preparer-son-sac-durgence

Si vous avez des suggestions d'amélioration, je suis preneur :)


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=sac-d-urgence

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-06-bibliotheque.txt

2025-01-06T08:52:51Z

<![CDATA[

Ma bibliothèque devenait trop petite.

Imaginez mon malheur, plus de place pour de nouveaux livres! Pire, des livres mal rangés, avec des genres qui se mélangent... Horreur!

Ma dame a trouvé des idées pour prolonger notre classique billy de chez Ikea (hé oui...).

Quelques planches, équerres et chevilles, un peu de verni acajou et le tour est joué.

Tout ceci a pris du temps : impossible de scier quand les enfants font la sieste, de vernir quand ils jouent à fond la caisse dans la maison, et encore moins de percer les murs le soir à l'heure du dodo.

Mais, petit à petit, 30 minutes après 30 minutes, c'est finalement terminé!

Joie, je peux racheter des livres!

Mais t'en avais pas déjà plein à lire ?

Ahem...

Bref, je me la pète avec la photo du résultat :) :

=> https://0x0.st/8iWs.jpg


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=bibliotheque

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-04-dmz.txt

2025-01-04T14:47:35Z

<![CDATA[

J'aime bien le bon vieux curseur dmz (port xcursor-dmz).

Aujourd'hui, j'ai appris comment changer le thème du curseur de la souris... simplement.

C'est à dire, sans lien symboliques ou bidouilles bizarres.

Il suffit d'ajouter dans ~/.profile cette ligne :

export XCURSOR_THEME=dmz

Bon pour les applis en gtk, comme Firefox, c'est pas encore gagné par contre... J4ai fait ça, sans succès...

mkdir -p ~/.icons/dmz/xcursors
cp -r /usr/local/lib/X11/icons/dmz/* /home/prx/.icons/dmz/xcursors/
cat >> ~/.icons/dmz/cursor.theme <> ~/.icons/dmz/index.theme <

EDIT:

merci arpinux de m'avoir envoyé la solution!

Il faut remplir un fichier ~/.icons/default/index.theme.

mkdir -p ~/.icons/default
cat >> ~/.icons/default/index.theme <


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=dmz

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2025-01-03-sfeed-clean.txt

2025-01-03T14:55:54Z

<![CDATA[

I really enjoy sfeed as my feed reader.

=> https://codemadness.org/git/sfeed/file/README.html

Amongst other thigs, I use it to display new entries when I first open a terminal, meaning automagically in tmux when my session pops up.

Recently, I noticed it was a little slower to display latest entries.

I had to clean up older entries and no longer subscribed feeds.

To do so, the README is very clear, but I had to gather things in a little script for later purpose :

#!/bin/sh
# remove previous feeds older than a week.

feeds_dir=~/.sfeed/feeds

for i in "${feeds_dir}"/*; do
	echo "${i}"
	awk -F '\t' -v "old=$(($(date +'%s') - 604800))" 'int($1) > old' < "${i}" > "${i}".new
	mv "${i}".new "${i}"
done


Comments?

=> mailto:prx@si3t.ch?subject=sfeed-clean | fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2024-12-23-chretiens-a-la-porte.txt

2024-12-23T13:48:25Z

<![CDATA[

  • toc toc toc*
Bonjour, je suis $Suzanne (remplace par le nom de ton choix) et voici mon fils $Eliott, nous sommes venus vous porter la parole de Dieu.

Moi, encore en pyj, la maison sans dessus-dessous, mal réveillé...

Je réponds poliment que nous sommes bien au courant de ces choses, et que je ne souhaite pas leur faire perdre davantage leur temps.

Oh vous savez, ce n'est jamais une perte de temps de parler de Dieu.

Ahem, oui sans doute, mais vraiment je vous jure, on a eu droit au catéchisme et on a déjà bien réfléchi à ce sujet...

Peut-être vous ne croyez pas en Dieu, mais vous devez bien croire en quelque chose. Ce qui compte, c'est d'avoir la foi vous savez...

Je me retiens de répondre que c'est l'exact opposé d'un bon raisonnement scientifique. Devant mon air sceptique, et à la vue de mes 2 jeunes enfants venus écouter ce qui se passe à la porte de leur maison :

Mais dîtes-moi, comment voyez-vous l'avenir?

Très franchement, là, je pensais aller plier le linge.

Je comprends que vous ne souhaitez pas discuter davantage...

Évidemment espèce de malpolie! Je t'ai prévenue dès le début!

GRRRR, ça m'énerve!

Je comprends vraiment pas, tu crois en Dieu ou à la magie de l'univers quantique, j'en ai rien à foutre, t'es pas obligée de venir me déranger à la porte de chez moi pour m'imposer un discours que je n'ai pas demandé en fait!

C'est quoi cette manie de vouloir à tout prix que les autres pensent pareil?

Laissez donc les gens tranquilles!

On n'impose pas des convictions ou une croyance.

Et le pire, c'est qu'après c'est à moi qu'on fait les gros yeux parce que j'ai voulu refermer ma porte.

La prochaine fois, je leur dit que Dieu est une femme et que je connais bien la réincarnation de Jésus...


Une réaction?

Envoyez votre commentaire par mail:

=> mailto:prx@si3t.ch?subject=chretiens-a-la-porte

Ou rejoignez le salon XMPP:

=> fremen@chat.si3t.ch

]]>

https://si3t.ch/log/2024-12-16-philovie.txt

2024-12-16T09:32:11Z

<![CDATA[

Ces réflexions vont sans doute encore évoluer. Mais je crois en être arrivé à quelque chose de satisfaisant.

=> https://si3t.ch/misc/philovie/

J'ai essayé de rester très générique, de façon à ce que chacun et chacune puisse s'y retrouver.

Pour ma part, ça me fait penser à ma responsabilité de père, ma mission d'enseignant, mes inquiétudes écologiques, mon appétit pour le logiciel-libre.

Je me tais désormais et vous laisse lire, je suis curieux de lire vos réactions tel qu'est le texte ainsi.

## Faire le bien

Refuse la violence, c'est le raccourci des faibles. Emprunte le long chemin de la gentillesse, c'est la voie des braves.
Patiente. Comme une prière, un gage de confiance, une main intransigeante mais tendue vers le changement.
Écoute, observe. Fais preuve d'empathie, nous ne sommes que des humains, un espèce bien jeune qui a tout à apprendre.
Seul le bien peut engendrer le bon.


## Inspirer

Sois digne de confiance. 
Reste fiable, toujours. Tiens tes promesses.
Inspire par l'exemple, pas par l'obligation, alors réfléchis.


## Préserver

Préserve les connaissances et les ressources.
Partage.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=philovie

]]>

https://si3t.ch/log/2024-12-15-philosophie.txt

2024-12-15T15:27:36Z

<![CDATA[

Philosophie de vie


EDIT: work in progress ici :

=> https://si3t.ch/misc/philovie/


C'est dans mes flux que j'ai vu passer cette idée : quelle est la façon dont on voit la vie? Quelle est sa philosophie?

=> https://manuelmoreale.com/@/page/3bg8rYZBhA7cNjBA

J'aime beaucoup cette idée, et j'y vois une sorte de voeux à la vie.

Je dois y réfléchir, mais en ce qui me concerne, ce qui me vient à l'esprit en premier, ce serait très court : "sois gentil".

La gentillesse est la plus importante des qualités. Je ne veux pas d'un monde où être gentil est considéré comme une faiblesse.

Être gentil, c'est être patient. Une patience comme une grande prière. De la patience en guise d'acte de foi pour avoir un courage à toute épreuves.

Faire preuve de gentillesse, c'est s'ouvrir à l'autre, une forme d'empathie à l'état pur qui renvoie à notre condition de simple être humain et nécessite un respect viscéral.

Enfin, la gentillesse, c'est souhaiter le meilleur pour chacun et contribuer à sa mise en oeuvre. Cela demande de l'exigence et de la générosité. Il en découle la nécessité de sauvegarder la connnaissance pour la rendre accessible et la transmettre le plus largement possible. (vivre les livres!)

Peut-être y ajouterai-je le minimalisme? Ou en tout cas "faire avec moins"?

Et le karma... Comme me le rappelle souvent arpinux, faire le bien, la vie te le rendra... J'aime bien, c'est rassurant, mais a la facheuse tendance à être biaisé de façon intéressée, de réclamer au mérite lorsque le retour n'est pas assez rapide. C'est pas clair dans ma tête.

Divers

J'ai ajouté une page "*" au si3tch qui contient la liste de toutes les pages:

=> /everything/

Dons

Pour 2025, j'ai activé le don récurrent à Framasoft.

=> https://soutenir.framasoft.org/fr/

C'est défiscalisé, pensez-y ;)

Dans un tout autre domaine, j'ai fait de même pour La Bonne Auberge:

=> https://www.patreon.com/c/LaBonneAuberge/membership

Citation

Deserves it! I daresay he does. Many that live deserve death. And some that die deserve life. Can you give it to them? Then do not be too eager to deal out death in judgement. For even the very wise cannot see all ends. I have not much hope that Gollum can be cured before he dies, but there is a chance of it. And he is bound up with the fate of the Ring. My heart tells me that he has some part to play yet, for good or ill, before the end; and when that comes, the pity of Bilbo may rule the fate of many – yours not least. -- Gandalf (Tolkien)

...

All we have to decide is what to do with the time that is given us.'


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=philosophie

]]>

https://si3t.ch/log/2024-12-13-accalmie.txt

2024-12-13T20:46:07Z

<![CDATA[

Ce soir, tout est calme.

Les sons semblent étouffés, comme avant l'arrivée de la neige.

Ou le calme avant la tempête?

La tension est absente, la léthargie a gagné la maison.

Ici, tout le monde est épuisé.

Les journée 8h-20h + 2h de trajet à représenter devant élèves et parents m'ont vidé de mon énergie.

Les petits loups luttent contre les virus de l'hiver.

Madame prend enfin un peu de temps pour elle et est sortie. C'est une bonne chose, le burnout/la dépression guettent de près.

Alors, douche chaude, pizza, histoire, et dodo.

Pour ma part, c'est soirée Nethack et lecture.

J'essaie d'oublier les chercheurs d'embrouille et/ou ceux qui préfèrent ignorer des messages envoyés.

Un peu de paix dans ce monde, au creux de chez nous.

Bonne nuit :)


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=accalmie

]]>

https://si3t.ch/log/2024-11-27-block-ai-bots-with-relayd-openbsd.txt

2024-11-27T09:08:57Z

<![CDATA[

According to their advertised User-Agent, you can block AI scrapers with relayd.

To do so, I suggest to use tags

Every unwanted user-agent will be tagged, then every request with the above tag is discarded.

To simplify future work, I suggest to include a file in /etc/relayd.conf:

http protocol "http" {
	return error
	tls keypair ...

	include "/etc/relayd.d/ai.conf"   # <--- HERE

	pass
}

Now, in /etc/relayd.d/ai.conf, let's add a few user-agent

# AI
match request header "User-Agent" value "AI2Bot" tag "AI"
match request header "User-Agent" value "Ai2Bot-Dolma" tag "AI"
match request header "User-Agent" value "Amazonbot" tag "AI"
match request header "User-Agent" value "anthropic-ai" tag "AI"
match request header "User-Agent" value "Applebot" tag "AI"
match request header "User-Agent" value "Applebot-Extended" tag "AI"
match request header "User-Agent" value "Bytespider" tag "AI"
match request header "User-Agent" value "CCBot" tag "AI"
match request header "User-Agent" value "ChatGPT-User" tag "AI"
match request header "User-Agent" value "Claude-Web" tag "AI"
match request header "User-Agent" value "ClaudeBot" tag "AI"
match request header "User-Agent" value "cohere-ai" tag "AI"
match request header "User-Agent" value "Diffbot" tag "AI"
match request header "User-Agent" value "DuckAssistBot" tag "AI"
match request header "User-Agent" value "FacebookBot" tag "AI"
match request header "User-Agent" value "FriendlyCrawler" tag "AI"
match request header "User-Agent" value "Google-Extended" tag "AI"
match request header "User-Agent" value "GoogleOther" tag "AI"
match request header "User-Agent" value "GoogleOther-Image" tag "AI"
match request header "User-Agent" value "GoogleOther-Video" tag "AI"
match request header "User-Agent" value "GPTBot" tag "AI"
match request header "User-Agent" value "iaskspider/2.0" tag "AI"
match request header "User-Agent" value "ICC-Crawler" tag "AI"
match request header "User-Agent" value "ImagesiftBot" tag "AI"
match request header "User-Agent" value "img2dataset" tag "AI"
match request header "User-Agent" value "ISSCyberRiskCrawler" tag "AI"
match request header "User-Agent" value "Kangaroo" tag "AI"
match request header "User-Agent" value "Meta-ExternalAgent" tag "AI"
match request header "User-Agent" value "Meta-ExternalFetcher" tag "AI"
match request header "User-Agent" value "OAI-SearchBot" tag "AI"
match request header "User-Agent" value "omgili" tag "AI"
match request header "User-Agent" value "omgilibot" tag "AI"
match request header "User-Agent" value "PanguBot" tag "AI"
match request header "User-Agent" value "PerplexityBot" tag "AI"
match request header "User-Agent" value "PetalBot" tag "AI"
match request header "User-Agent" value "Scrapy" tag "AI"
match request header "User-Agent" value "Sidetrade" tag "AI"
match request header "User-Agent" value "Timpibot" tag "AI"
match request header "User-Agent" value "VelenPublicWebCrawler" tag "AI"
match request header "User-Agent" value "Webzio-Extended" tag "AI"
match request header "User-Agent" value "YouBot" tag "AI"

block request quick tagged "AI" label "I don't feed IA"

As you can see, in the end, I add a little message :)

The user-agent list has been found here:

=> https://raw.githubusercontent.com/ai-robots-txt/ai.robots.txt/refs/heads/main/robots.txt)

After reloading relayd, check it works as expected with curl:

> curl -H "User-Agent:GPTBot" https://si3t.ch

[... snip ...]

Forbidden

Forbidden
I don't feed IA

OpenBSD relayd at 2a01:e0a:2b8:ca70::1bad port 443

\o/

]]>

https://si3t.ch/log/2024-11-26-resister.txt

2024-11-26T07:47:59Z

<![CDATA[

Lecture

Le livre de Salomé Saqué 'Résister' est excellent. Il se lit vite car c'est bien écrit.

On sent l'envie d'inviter à se renseigner sans assomer de longs discours difficiles.

C'est un sacré boulot, toujours sourcé, garant de faits concrets alors que les fake news et opinions ont tendance à faire illusion.

Soyez prévenus, il y a des choses glaçantes : l'extrême droite est dangereuse et violente.

En ce qui me concerne, j'en retiens des éléments concrets plutôt que des ressentis ainsi que des idées pour faire face à l'extrême droite.

Je retiens ceci: soyez gentils, parlez autour de vous dans les assos, soutenez la presse libre et les artistes, opposez l'humour à la haine, et n'ayez pas peur d'être utopistes.

Il ne coûte que 5€, moins en version numérique.

Lisez-le, offrez-le!

=> https://www.lalibrairie.com/livres/resister_0-11697790_9782228937597.html?ctx=397de3ecca38cf20254f77d136f28b52 | https://www.babelio.com/livres/Saque-Resister/1725653

Sinon je continue de découvrir la trilogie de Mars de KS Robinson. J'aime beaucoup la façon dont les personnages sont traités, comment les individues forgent une nouvelle société, comment les sciences constituent un outil qu'on ne peux que respecter. Nadia <3.

Temps libre

Au lieu de traîner sur le plus en plus problématique 9gag ou sur Mastodon, je découvre anki, pourtant déjà bien connu :

=> https://apps.ankiweb.net/

La méthode des flashcards n'a rien de nouveau pour un prof, mais que c'est pratique de l'avoir en version numérique avec un outil qui gère soi-même la fréquence des rappels.

Me voilà à apprendre la LSF avec plaisir, c'est gratifiant de progresser si vite, et voilà bien longtemps que je n'avais pas appris quelque chose de nouveau.

Avec mon fils, on s'amuse bien à se parler en langue des signes, et je sais que cela sera utile pour s'ouvrir aux autres, mais aussi pour faire comme les Atréides :)

Prochains apprentissages : le morse (obligé), le japonais, et... Le russe et l'arabe? L'apprentissage des langues me fait peur, surtout avec des écritures/alphabets qui ne ressemblent en rien au latin ou l'anglo-saxon qui sont des repères pour moi.

Vous auriez des suggestions de decks?

Lectures de RSS

J'ai tendance à me perdre dans tous les flux RSS que je suis.

Je m'aperçois que le fait qu'ils soient ouverts par ordre alphabétique dans sfeed_curses en privilégie certains.

Désormais, à l'ouverture de ma session, j'affiche les nouveaux articles avec leurs titres. De cette façon, je repère rapidement si l'un d'entre eux peux m'intéresser et saute dessus aussitôt, et prends le temps de lire les autres + tard.

sfeed_plain ~/.sfeed/feeds/* | grep "^N" | cut -d" " -f5-

Citations

New rule, After you reach 999$ million, every red cent goes to schools and health care. You get a trophy that says, "I won capitalism" and we name a dog park after you.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=resister

]]>

https://si3t.ch/log/2024-11-16-notes-utopiales-2024.txt

2024-11-16T20:11:51Z

<![CDATA[

Voici quelques notes en vrac comme je sais si mal les faire à propos des Utopiales 2024. Il y aura des noms de personnes qui m'ont inspiré, des ouvrages à lire, et du blabla.

Peut-être que la prochaine fois j'organiserai tout ça un peu mieux, mais j'imagine que des gens font ça déjà beaucoup mieux que moi.

En complément, il y a la chaîne Youtube avec quelques tables rondes à écouter:

=> https://www.youtube.com/@ideasinscience

Les premiers jours furent plus pessimistes que d'habitude.

C'était peut-être (sans doute) lié à mon état d'esprit un peu dépressif du moment et l'état du monde franchement pas terrible.

J'ai eu le sentiment d'assister à des Dystopiales, malgré des conférences sur la réponse à apporter à l'arrivée de l'extrême droite aux portes du pouvoir.

C'était d'autant plus vrai à écouter Nicolas Martin déchaîné, joussif à écouter et galvanisant malgré la noirceur de l'avenir possible.

=> https://www.youtube.com/watch?v=PqYjpWQuLEg

Cléo Collomb aussi pertinente qu'intelligente, toute en mesure, très inspirante. Et lorsqu'Audrey Pleynet lui fait echo, c'est un régal!

À plusieurs reprise, les gouvernements en place ont été pointés du doigt comme les sources de nos malheurs quotidiens (coucou Manu!).

Ça fait du bien d'entendre des gens intelligents :)

J'y ai découvert l'idée de Fiction Panier d'Ursula Le Guin.

=> Fiction panier

Lisez ce texte, c'est court, très bien écrit. Il faut juste avoir vu le début de 2001 l'Odyssée de l'espace pour vraiment en profiter ;)

Cela résonne tout à fait avec l'idée que je me fais du solarpunk, dont j'ai plus que jamais besoin.

À ce propos, Alain Damasio parle de biopunk, avec l'idée d'être très orienté vers le vivant.

Je regrette de ne pas avoir entendu mention du solarpunk pendant ces 4 jours, mais on m'a fait très plaisir en me complimentant sur ma veste XD.

Ça fait partie des choses que j'adore aux Utopiales, la gentillesse, la simplicité, le respect, la proximité avec les gens. Une sorte d'expérience de société qui me conviendrait bien. Et encore, je ne vous évoque même pas la salle Zen : aucun bruit, des gens dorment allongés sur le sol, d'autres dessinent, les autres lisent... En plein coeur d'un festival avec des centaines de gens!

J'ai craqué, on m'a laissé seul à la librairie, sans aucune surveillance. J'ai donc tout un tas de livres de Becky Chambers que j'aurais pu découvrir autrement.

Ça me fait réalser que j'adore tout un tas d'autrices : Robin Hobb, Becky Chambers, Ursula Le Guin, Ada Palmer, Claire North, Fiona McIntosh...

Pendant une table ronde sur la traduction et la Langue des Signes (LSF), ils ont évoqué le mot italien pour science-fiction : La fantascience. J'adore :)

La rencontre avec Alain Damasio m'a retourné, j'avais enfin mes Utopiales et cet élan qui me donne envie d'avancer. J'ai vibré pendant 1h à l'écouter, c'était magique.

Quelques extraits et citations approximatives :

On arrête de se battre contre, on se bat pour.
L'harmonie, c'est entrer en résonnace avec une oeuvre, avec les autres, sans altérer les individus ni gommer les différences. C'est tout tout sauf la fusion.
On crève de ne pas vouloir se composer avec ce qui n'est pas nous.
Les phonèmes sont comme les couleurs de Kandinsky. Le chromatisme des mots.

Oh, j'allais oublier, il y avait une chasse au trésor dans le café de la cité.

La veille du premier jour, mon ami m'a envoyé l'affiche annonçant cette chasse en photo au moment où j'allais me coucher.

Très vite, on a reconnu du morse. Un indice dans l'imprimé indiquait que c'était à l'envers.

Je me suis empressé de le traduire, en inversant . et _. Le message disait de suivre la file...

Dès le premier jour, on a suivi les indices, avec les énigmes diffusées sur l'écran télé, dans la bibliothèque, sur la playlist Spotify... On aurait presque pu gagner si on n'était pas parti voir les tables rondes. Peu importe, c'était vraiment amusant et sympa de parler avec les gens qui cherchaient en même temps, même si la chasse était fermée ensuite. De belles rencontres!

La dessinatrice qui était exposée et autrice de l'affiche de sUtopiales cette année a dû s'absenter, la vie n'est pas toujours tendre.

Elle a quand même pris la peine de se filmer pour envoyer un message, qui a été diffusé. C'était émouvant, poignant. Roland Lehoucq a pris la relève avec une conférence sur la possibilité physique d'avoir des monstres aussi gros que Godzilla. Tout ce que j'adore dans ce qu'il fait :)

À cette occasion, il a cité la phrase suivante qui m'a fait bien rire:

Les mathématiques, c'est cette branche de la physique pour laquelle les expériences ne coutent pas très cher.

Sinon, à la tour LU, j'ai découvert des tables rondes de physique un peu + pointues, juste après avoir écouté Nathalie Besson sur le stand à côté de la scène Shayol qui parle du projet d'avoir des interféromètrs qui suivent la Terre sur son orbite pour détecter ondes gravitationnelles. Observer l'univers avec des ondes gravitationnelles plutôt que des photons qui mettent des centaintes voire des milliers d'années à sortir d'une étoile. Passionnant.

Ce sont des projet sur 60 ans, la Terre est un vaisseau générationnel pour les scientifiques. Cela fait echo à l'unde des tables rondes des premiers jours d'ailleurs.

Réfléchir à long terme, ce que ne font pas nos élus qui ne veulent qu'être... Réélus.

Il y a aussi eu la conférence avec Michèle Leduc qui parle physique quantique. Une femme à qui on laisserait la place asisse dans le tram, mais qui est bien différente en réalité des apparences. Bluffante et si drôle! Les jeunes filles ont des modèles auxquels s'identifier pour voir émerger de belles vocations scientifiques.

Je suis retourné aux Utopiales avec élèves le lundi. La conférence de physique de Roland Lehoucq était bien sérieuse et trop peu interactive. D'habitude, il fait du lien avec des oeuvres de SF... Là, c'était un VRAI cours de physique, difficile à tenir pour mes élèves de 3e. Mais j'ai eu le privilège et le plaisir de discuter avec lui quelques minutes ensuite, à propos de neutrinos qui nous permettraient d'observer l'univers à l'instar des photos, mais en mieux puisqu'ils n'interagissent pas avec la matière. Cela ressemblait à l'indée du projet expliqué par Nathalie Besson, c'est génial, ça fait rêver!!!

Tout ce qui reste à découvrir...

Tout ce potentiel humain...

Tous ces rêves possibles...

Vivement l'an prochain!

Mars express revu pour la 2e fois, j'y ai compris encore d enouvelles choses, ce film est absolument génial avec une double fin.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=notes-utopiales-2024

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-11-13-de-retour-utopiales.txt

2024-11-13T14:12:11Z

<![CDATA[

Le premier jeudi des Utopiales, mon accès à internet a été coupé.

=> Utopiales

Panne réparée

En fait, SFR, qui gère les lignes, a changé l'armoire.

Ils ont débranché tout le monde, sans prévenir personne.

Les enfoirés.

Je suis client chez Free, j'ai donc du attendre qu'un technicien vienne me rebrancher :s

C'est donc enfin résolu après 2 longues semaines!

Ce qui m'aura le + manqué?

  • Mes sauvegardes, c'est toujours un peu stressant de ne pas pouvoir avoir une copie de mes cours
  • Mon compte XMPP pour échanger avec ma famille.
  • Mes mails
  • Publier des notes

C'est pénible, mais ce n'est pas si grave, et ça fait partie du "jeu" de l'auto-hébergement.

Heureusement, Vinishor m'accorde gentiement un backup mail pour récupérer mes messages.

Ma VM chez openbsd.amsterdam fait de même.

=> vinishor | https://openbsd.amsterdam/

Normalement, je devrai recevoir les mails qui m'ont été envoyés prochainement.

J'espère vraiment ne pas en avoir perdu.

Sinon, je devrai me résoudre, je préfère ça que de vendre mes données à un autre fournisseur.

Ce qui m'inquiète, c'est que le roulement des signatures DNS avait lieu à cette période, du coup ça a mis le bazar puisque tous les serveurs autoritaires n'ont pas reçu les zones avec les nouvelles signatures en même temps.

Les Utopiales

J'ai plein de trucs à raconter sur les Utopiales. J'en ferai un article plus tard je pense, le temps de mettre de l'ordre dans mes notes manuscrites :)


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=de-retour-utopiales

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-11-04-plus-d-email-si3tch-down.txt

2024-11-04T20:27:57Z

<![CDATA[

Billet qui, peut-être, sera lu sur mirror.si3t.ch...

Depuis jeudi dernier, premier jour des Utopiales, je n'ai plus d'accès à internet.

Enfin si, je me débrouille avec le partage de connexion de mon smartphone, même si c'est plutôt lent et pénible.

Quoi qu'il en soit, si3t.ch (ainsi que puffy.cafe), domaines que j'héberge, ne sont pas accessibles.

Je m'aperçois à nouveau que même en ayant prévu des miroirs, à savoir mirror.si3t.ch ou le dépôt sur sourcehut, je commence à ressentir le manque.

Manque d'accès à mes mails. J'ai des choses à dire à certaines personnes (coucou M!), des tas de choses, et je dois patienter que Free rétablisse mon accès à internet.

J'ai aussi plusieurs choses à publier concernant des réflexions et choses vues aux Utopiales (encore!)... Ça me démange, besoin de partager ce que j'ai appris pour en faire quelque chose d'utile...

Mais ça doit attendre apparemment.

C'est sans doute une nécessité : j'ai du travail par dessus la tête avec toutes les réunions et évaluations à cette reprise.

Allez, patience, et au boulot!


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=plus-d-email-si3tch-down

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-10-30-la-vie-apres.txt

2024-10-30T19:07:36Z

<![CDATA[

Depuis tout petit, j'ai anticipé ce que serait ma vie future.

À la fois de l'angoisse et des envies, il FALLAIT que ce soit bien clair.

Les plans s'imbriquaient les uns aux autres, sinon, Morphée ne venait pas.

Aussi je sais depuis très longtemps quels sont mes objectifs dans la vie :

  • De découvrir et comprendre le monde (science bitch !) ✔
  • Rencontrer une femme aussi belle qu'inspirante ✔
  • De devenir père ✔
  • D'avoir ma maison, refuge dans ce monde ✔
  • Jouer de la musique ✔
  • Tenter de faire la différence par l'exemple, pas par la leçon ✔

Autant dire que je suis un homme comblé.

À 35 ans, j'ai tout ce que je peux désirer.

Certes, être père n'est pas de tout repos.

Les angoisses et, tant qu'à faire, les terreurs s'accumulent.

Entre l'aîné qui manque de s'étouffer avec une pièce de 2€,

la petite qui a un caractère explosif,

leur mère épuisée par le travail,

les trajets en voiture où je lutte contre le sommeil...

Sans parler

du climat,

de la politique,

des cons...

Dernièrement, j'ai comme l'impression qu'une partie de moi a disparu.

non.

Pas disparu, morte.

La somme de l'impuissance devant l'avenir qui me dépasse ?

La bascule d'un homme comblé?

La crise de la quarantaine avant l'heure?

Quoi qu'il en soit, en discutant avec mon entourage, je réalise que je n'anticipe plus le futur.

Je ne me visualise pas vieux.

Je n'imagine pas ma vie avec de l'arthrose, des cheveux blancs (en +), les mains qui tremblent et les bras faibles.

Je n'arrive pas à me voir après 40 ans.

C'est un peu morbide, mais une part de moi est convaincue que je vais mourir bientôt.

Oh, pas d'appitoiement s'il vous plaît, je suis comblé, alors...

Je reste conscient que mes enfants ont besoin de moi, et je veux être là pour eux.

Je me retiens de réfléchir à l'avenir et d'anticiper les catastrophes climatiques qu'ils devront vivre. Ils auront besoin d'aide.

Malgré tout ce qui pourrait me retenir à ce monde semble s'étioler de plus en plus.

Déprime? Peut-être.

Besoin d'un psy? Sans doute.

En attendant, au détour des liens recueillis par f6k (huld.re), j'ai découvert une liste d'objectifs que se donne Devine Lu Linvega.

=> http://huld.re/kiwi/liens.html | https://wiki.xxiivv.com/site/goals.html

Ça fait du bien à lire, étrangement.

Peut-être que ce qu'il me manque, ce qui me fait me sentir étrange, c'est ce manque d'anticipation du futur.

Je dois réfléchir à mes objectifs de vie.

Sérieusement.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=la-vie-apres

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-30-souvenir-d-ecole.txt

2024-09-30T20:51:25Z

<![CDATA[

Je me rappelle un truc qui m'est arrivé étant gamin.

Tout fier de moi, je venais de tailler tout en finesse mon crayon de bois.

Tellement bien taillé que la mine scintillait, la pointe la plus aiguisée jamais vue.

Alors que je range mon taille crayon, ce crayon m'échappe des mains et roule sur la table.

Horreur!

Il va tomber dans un battement de coeur, et tous mes efforts pour obtenir cette magnifique pointe seront réduits à néant.

En un réflexe inattendu, je tente de le ratrapper maladroitement.

C'est alors que mon poignet bloque ce crayon contre mon corps, la pointe dans mon poignet, le bas du crayon parfaitement perpendiculaire contre mon corps, enserré.

Je lève alors le bras, le crayon pendouille, planté dans mon poignet, tout juste entre les veines.

J'ai eu chaud...


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=souvenir-d-ecole

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-28-questions-de-m-oblige-de-repondre.txt

2024-09-28T09:38:30Z

<![CDATA[

J'aimerais trop pouvoir faire comme toi et répondre quand j'ai envie sans me sentir mal. Quand je vois un message je suis dans l'obligation d'y répondre vite sinon j'ai l'impression de faire attendre la personne ou juste de m'en foutre de se qu'elle a écrit.
Si tu savais tout le bazar dans ma tête quand je dois te répondre, tout est calculé.

Ah c'est une exercice au départ, mais c'est finalement très reposant de ne pas répondre dans l'urgence.

C'est justement ce qui est bien avec le mail : il n'y a pas d'obligation de répondre de suite.

Ce n'est pas une messagerie instantanée, il y a XMPP pour ça.

Tu peux prendre le temps de réfléchir à ta réponse.

Choisir avec soin les mots à écrire.

Rédiger un brouillon, puis y revenir un peu plus tard afin d'ajuster si nécessaire.

Tu peux même vérifier l'orthographe, et comme le dit Eric Emmanuel Schmitt :

L'orthographe, c'est comme la propreté, une question de respect de l'autre.

C'est justement tout l'inverse de se moquer de ce qu'a écrit l'autre personne : c'est y accorder d'autant plus d'importance.

À l'ancienne, comme avec les lettres. C'est old school, mais j'aime de + en +.

L'instantanéité, c'est bâcler, et c'est souvent source de conneries que l'on regrette ensuite.

Les réseau sociaux en sont un parfait exemple : les gens ont de + en + de mal à se retenir de commenter toutes les publications.

Peu importe si ce qu'ils ont à dire est intéressant, il faut qu'ils ramènent leur fraise.

Et je comprends pour quoi, les réseaux sont bien pensés pour activer les mécanismes de récompense instantanée, comme un petit shot de sucre quand tu as une jolie notif qui apparaît ou un badge débloqué, ou que sais-je... Je suis un gros ringard :)

En tout cas, en classe, c'est l'horreur : dès que quelqu'un prend la parole, tous les autres y vont de leur petit commentaire. pénible.

Tu noteras que prendre le temps de rédiger, c'est justement ce que je n'ai pas vraiment fait pour cette réponse.

Mais j'y ai quand même pensé avant, dans la voiture, sous la douche, avant de dormir...

Je peux comprendre qu'on souhaite se vider la tête en posant le + rapidement possible par écrit ce qui te taraude.

Oh, le mail, c'est aussi vraiment cool, parce que tu peux chiffrer avec un petit peu d'effort. C'est ce que fait protonmail, mais c'est possible avec d'autres clients email: https://gnupg.org/.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=questions-de-m-oblige-de-repondre

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-21-en-vrac.txt

2024-09-21T14:02:41Z

<![CDATA[

Recherche d'une plateforme d'écriture

J'ai voulu recenser les différentes "plateformes" pour écrire sans prise de tête, avec si possible un accent mis sur le texte brut, et dans l'idéal le support du protocole gemini.

=> https://prose.sh/

Très (trop?) complet, mais qui fait envie! Chouette d'avoir les articles récents mis en avant. C'est du markdown, et on gère tout via ssh.

=> https://bearblog.dev/

Propre, avec page de découverte des autres blogs et un système de mise en avant selon la popularité. Semble prévu pour durer, c'est itnéressant.

=> https://mataroa.blog/

Un peu dans la même veine que les précédents.

=> https://rawtext.club/

Semble en cours de réparation, mais permettait de publier via http/gemini/gopher.

=> https://smol.pub/

Dans la même veine que le précédent, on y trouve aussi une page qui présente les articles récents.

Malheureusement, l'édition se fait en ligne... C'est un gros malus pour moi :/

Merci à hsoucy de m'avoir envoyé une clé d'activation, ma demande d'accès était restée sans réponse.

=> https://midnight.pub/

Du même auteur, m15o, on peut signaler midnight pub où les messages sont des bribes de discussions entendues dans un bar.

=> https://pollux.casa/ | https://avoir.unbon.cafe/

Ces deux derniers proposent un upload en sftp, et un service gemini/http.

C'est clairement vers l'un des 2 que je me tournerai si j'avai besoin.

=> https://cosmic.voyage/join.html

L'idée est de publier des transmissions venues d'ailleurs. Là, le texte brut est vraiment mis en avant. J'aime beaucoup le concept.

=> https://tilde.team/

Il y a aussi les tilde, mais il faut avouer que ça ne paraît pas toujours très bien administré. En tout cas, pas comme je le voudrais, cela me questionne sur la sécurité de mes données que je laisserai dessus. Mais bon, c'est excellent pour tester!

=> https://srht.site/

Une gestion de site avec git. Le service de sourcehut est de qualité et simple, je ne regrette pas de m'y être inscrit.

=> https://void.si3t.ch/

Sans inscription, la publication se fait en envoyant un mail. Vous l'aurez deviné, les autres services ne me convenaient pas, j'ai eu besoin de faire un truc qui correspondait à ce que j'aurais aimé trouver :)

Auto-hébergement

J'ai réactivé mon vpn pour mon ordinateur portable.

Actuellement, il est disponible sur la table de routage 2.

rdomain 2
wgkey xxxxxx...= \
wgpeer XXXXX...== \
	wgendpoint 46.23.90.144 4545 \
	wgaip 0.0.0.0/0 \
	wgaip ::0/0
inet 10.0.0.2/24
inet6 fd54:49bc:c233:fde:cafe::2/64

up

!route -T2 add -inet default 10.0.0.1
!route -T2 add -inet6 default fd54:49bc:c233:fde:cafe::1

Ainsi, je passe par le vpn avec cette commande:

route -T2 exec firefox # par exemple

La nouveauté aura été de configurer unbound sur le serveur afin qu'il propose la résolution de domaine aux clients du vpn. Plus besoin d'un DNS public.

=> https://marcocetica.com/posts/wireguard_openbsd/

J'ai aussi installé radicale pour avoir un calendrier partagé avec ma compagne, ça évite de poser des rendez-vous avec les parents le même jour.

=> https://radicale.org

Réflexion comme ça...

Les enfants deviennent vite plus intelligents que leurs parents, tout simplement parce qu'ils évoluent dans le monde de demain et qu'ils le comprennent mieux, ils en sont les architectes, mais aussi parce qu'ils ont observé l'expérience de leurs aînés qui vient s'ajouter à la leur.

Envies

J'ai du retard sur certains Pixar, que d'habitude j'aime beaucoup. J'ai hâve de voir Vice Versa 2, j'avais tellement adoré le premier!

En ce moment, je récupère les films et animations que j'aimerais un jour montrer à mes enfants.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=en-vrac

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-18-questions-de-m-h-f-amoureux.txt

2024-09-18T08:47:34Z

<![CDATA[

Est ce que tu pense que les hommes et les femmes tombent amoureux de la même manière ? Tu vois toute la phase où tu tombe amoureuse, tu te fais des scénarios le soir dans ton lit, tu rougis au moindre messages ambigü, les lettres d'amour écrites. BREF, tu es très niaise. Je me base pas sur moi pour ce comportement, je suis un bonhomme moi ! Je fais pas ça…

À mon avis, que tu sois homme, femme, ou autre, n'a absoluement rien à voir avec la façon de tomber amoureux.

Ça dépend des gens, tout simplement.

Mais il doi y avoir au moins 2 attitudes qui ne trompent pas : l'envie de sourire à l'évocation de l'être aimé, et le besoin d'être auprès de cette personne.

Mais oui, les scénarios, les papillons dans le ventre, les longues envolées lyriques passionnées, toussa toussa...

Mais dans l'imaginaire collectif et dans la réalité aussi, les filles sont comme ca, en tout cas les jeunes demoiselles. (Ouais, j'ai écris demoiselles, tu vas faire quoi hein ?)
Les damoiseaux font ça aussi ? 

Mais bien sûr qu'ils font ça!

Ils se masturbent aussi, et ça c'est que les demoiseaux, parce que les demoiselles sont pures et innocentes évidemment XD

Dans l'imaginaire collectif, les hommes, jeunes ou pas, sont très souvent décrits comme de parfaits imbéciles dès lors qu'ils rencontrent une jolie nana aussi...

Si on élargit un peu beaucoup, ça serait la différence de romantisme entre les 2 sexes.

Mais trop paaaaas!

1 contre exemple suffit à montrer qu'une théorie est fausse, n'est-ce pas?

Bah je t'en donne 2 : mon meilleur ami et mon voisin. Ce sont 2 hommes que j'ai vu déprimer par chagrin d'amour. Pendant des mois.

Il y a aussi des femmes hermétiques aux pétales de roses, aux rendez-vous galants... Encore une fois, rien à voire avec le genre.

Pourquoi seules les femmes ont des bouquets de fleurs ? Les hommes en ont seulement le jour de leurs morts, je trouves ça d'une tristesse accablante. C'est beau les fleurs mais peut être pas assez masculins pour la société. J'ai un amour particulier pour les fleurs et leurs significations. Mais ça, c'est une autre histoire.

Ouais, c'est nul. moi j'aime bien les fleurs. Une fois mon fils m'en a offert, c'était vraiment chouette.

Tiens, mon meilleur ami dont je te parlais juste avant, il m'offre des fleurs des fois, et j'aime bien.

Mais j'imagine que dans l'imaginaire colectif, les fleurs, ça fait "tapette".

Alors à la place d'offir des fleurs, on n'offre rien du tout aux hommes. ÇA, c'est grave!

À la rigueur, si ça vous met mal à l'aise de m'offrir des fleurs, vous pouvez toujours apporter du saucisson, du fromage ou une bonne bière hein, c'est appréciable aussi.

Mais ça dure moins longtemps que les fleurs ^^


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=questions-de-m-h-f-amoureux

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-18-how-to-play-dwarffortress-on-openbsd.txt

2024-09-18T15:48:00Z

<![CDATA[

Sort of...

TL;DR

Run a linux distro under vmd, then "ssh -Y" to if and play dwarf fortress.

What is Dwarf Fortress ?

It's an incredible game where you control a dwarves outpost. The world is randomly generated and incredibly deep.

=> https://www.bay12games.com/dwarves/features.html

Well, you already knew this ;)

How to install Debian in vmd?

Since that's what I know the best, I choosed to run Debian with vmd.

=> https://www.debian.org/

sysctl net.inet.ip.forwarding=1
rcctl enable vmd
rcctl start vmd
vmctl create -s 20G debian.qcow2
vmctl start -c -m 1G -L -i 1 -r debian.iso -d debian.qcow2 debian 

Before loading the installer, you must setup a few things to get the console.

Press TAB, then enter:

/install.amd/vmlinuz vga=off initrd=/install.amd/initrd.gz --- quiet console=ttyS0,115200n8 

A few things may be set in your /etc/pf.conf. Here is mine, it use my local unwind for DNS resolution:

set skip on lo
antispoof for egress
block

### Required to install debian with network access
pass on tap0
match out on egress from tap0:network to any nat-to (egress)
pass in proto { tcp udp } from tap0:network to any port domain \
    rdr-to localhost port domain
###

pass in proto icmp
pass in proto icmp6
pass out

How to install Dwarf Fortress?

On your debian fresh, install, add a few things:

apt install libsdl2-2.0-0 libsdl2-image-2.0-0 libsdl2-ttf-2.0-0 libgtk2.0-0 libopenal1 libsndfile1 libncursesw5
apt install xserver-xorg
apt install openssh-server

Now you may log on your VM using ssh :

ssh dwarf@100.64.1.3

Check your ip with "ip a" on the console if necessary.

Then, get dwarf fortress:

wget https://www.bay12games.com/dwarves/df_50_13_linux.tar.bz2
tar xjvf df*.tar.bz2

Run Dwarf Fortress

Use ssh "-Y" flag:

ssh -Y dwarf@100.64.1.3 "./run_df"

I won't lie, it's kinda slow.

But it works \o/.

=> https://0x0.st/X3_l.png

Conclusion

Actually Dwarf Fortress isn't really running on OpenBSD, but I find this trick handy if one day I miss a software ony running on Linux.


Comments?

=> mailto:prx@si3t.ch?subject=how-to-play-dwarffortress-on-openbsd

]]>

https://si3t.ch/log/2024-09-17-message-to-the-void.txt

2024-09-17T08:35:34Z

<![CDATA[

Aujourd'hui, j'ai ouvert un espace de publication par email :

=> https://void.si3t.ch | gemini://void.si3t.ch

Il n'y a pas gopher, geomyidae ne supporte pas les vhosts.

L'idée est d'offrir un espace où chacun peut s'exprimer de façon anonyme. Un peu comme lancer une bouteille à la mer.

La publication se fait en écrivant à une adresse mail dédiée. Ça me permet de ne pas avoir à me soucier d'un captcha. Mon antispam fera bien les choses, en tout cas mieux que ce que je pourrais coder.

Comme on me l'a fait remarqué, c'est un peu comme un pastebin par mail.

=> https://codemadness.org/mailservice.html

Ce n'est pas tout à fait vrai : j'y vois plutôt un espace d'échange à la midnight.pub mais anonyme.

Je l'espère bienveillant et salutaire pour ceux qui en ont gros sur le coeur.

Si on veut lire les messages comme s'il s'agissait d'un journal, j'ai prévu un flux ATOM. On peut s'y abonner ou le consulter directement dans le navigateur.

Vous l'aurez remarqué, c'est très minimaliste. Il faudrait peut-être améliorer le atom.xsl pour une apparence plus agréable dans le navigateur.

Comment ça marche?

C'est tout simple, je me suis servi de ce qui existe déjà, à savoir un fichier ".forward" et d'un script à base de mblaze pour extraire le corps des messages et les mettre dans un dossier après leur avoir donné un nom unique.

J'ai hésité à mettre le sujet comme titre dans les liens vers les messages, mais finalement, je préfère laisser chacun choisir de préciser ou non un sujet.

Une tâche cron vérifie régulièrement si de nouveaux messages sont présents et régénère les pages html, gmi et le flux atom.

Si vous êtes curieux, voici le dépôt:

=> https://git.sr.ht/~prx/m2void


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=message-to-the-void

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-16-questions-de-m-comment-ca-va.txt

2024-09-16T08:27:10Z

<![CDATA[

Quand tu commences généralement une conversation, avec quelqu'un tu poses la banale question "ça va ?" Existe-il plus hypocrite comme question ?Souvent elle est posé juste par politesse et personne va vraiment dire "non ça va pas" Tu imagines si personne n'avait de filtre et que tout le monde répondait de la manière la plus franche possible ?
Donc, comment ça va toi ? 

Cette question m'avait déjà frappé en particulier lors de mes premiers jours à l'usine. C'est typiquement un truc "d'adultes" ce "ça va?", je ne l'avais jamais rencontré avant, en tout cas à ce point.

Est-ce que parce qu'on s'en fout des autres quand on est plus jeune?

En tout cas, il fallait bien des sous pour payer les études, alors préparer des commandes dans la centrale du super U du coin aura été ma première vraie expérience de l'intérim, premier job d'été. C'était vraiment pas agréable : on était chronométré pour préparer nos commandes, il fallait toujours aller + vite, et la reconnaissance vocale fonctionnait très mal. Tu parlais jamais à personne, tout seul sur ton chariot, mais les gens te demandaient quand même "ça va?". Des gens dont tu ignores le prénoms, que tu ne verras plus jamais dans ta vie. C'est là que l'automatisme apparaît, tu réponds "ça va".

Ensuite, préparer des palettes dans une autre usine, empiler des cartons de viande d'animaux morts dans un frigo? C'était physique, il fallait s'organiser, et bizarrement de la mémoire. Entouré de types qui faisaient ça depuis 25 ans, tu découvres la tranquillité d'esprit. Là aussi, le "ça va" est courant, mais il y a un esprit plus familial. Sur la rampe, t'as toujours avec les mêmes, alors tu discutes un peu, forcément. Tu rencontres des gens, et le "ça va" devient alors vraiment sincère.

Finalement, en tant que prof, il y a cette injonction à être "une grande famille".

Je déteste.

Mes collègues ne sont pas mes amis. Certains le deviennent. Rarement.

Pourtant, certains voudraient aller boire des coups toutes les semaines (j'exagère).

Cependant, cela ne m'empêche pas à les apprécier. Même ceux dont le caractère m'irritait autrefois. Je parie que c'est la vieillesse qui fait ça : tu apprends à aimer les gens, à trouver que leurs défauts sont juste un peu de sel dans le quotidien. Tant que ça ne dépasse pas certaines limites bien sûr.

À force de connaître les gens, les "ça va" deviennent de plus en plus sincères. Françoise, Caroline, Elisa, Sylvie, Barbara, qui prennent vraiment le temps de te regarder dans les yeux et demander "comment ça va?", c'est une bouffée de gentillesse. Stéphane, Mathieu, Alexandre, Armelle, qui ne poseront pas cette question mais qui sont attentifs aux petits détails et auront dans la journée un geste sympathique, comme une main tendue.

Ce qui paraissait de l'hypocrisie dans ma tendre jeunesse apparaît aujourd'hui davantage comme un don de gentillesse. Nous savons tous qu'on n'a pas le temps de discuter de toute façon, il faut filer bosser. Nous savons tous que ce n'est pas l'endroit où l'on veut se livrer. On sait. Plus qu'une question, c'est un voeu : je te souhaite d'aller bien.

Combien de fois on répond "ça va", tout en voyant le film des soucis derrière ses pupilles. Ça va, car il faut que ça aille. C'est ainsi. Ou parce qu'on reste dans son rôle d'acteur. On n'est vraiment soi que lorsqu'on est seul. Et encore...

On pourrait se dire que ce serait courageux de répondre "non, ça ne va pas", puis d'expliquer pourquoi ou simplement affirmer ne pas vouloir en parler. Sauf que c'est aussi très égoïste. Partager son mal être, c'est en prêter un petit bout aux autres, qui vont porter un peu de cette tristesse/colère/inquiétude. Par pudeur ou par solidarité, on garde ça pour soi. On le garde pour les moments plus appropriés et plus intimes.

Alors, le plus courageux, c'est de garder un grand sourire et alléger le quotidien de son entourage. Il parait en plus que sourire nous fait fabriquer de la sérotonine, qui est rien d'autre que la molécule du bonheur.

The show must go on.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=questions-de-m-comment-ca-va

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-15-Encrypt-all-incoming-emails-with-gpg.txt

2024-09-15T14:40:43Z

<![CDATA[

EDIT: I updated the script to keep headers intact:

=> /code/encrypt-all-incoming-mails/

If for some reasons you don't want to keep your emails unencrypted on your server

=> https://dataswamp.org/~solene/2024-09-12-email-selfhost-to-protonmail.html

You may encrypt all of them as long as your public key is available:

=> https://dataswamp.org/~solene/2024-08-14-automatic-emails-gpg-encryption-at-rest.html

As far as I'm concerned, I don't keep my emails on my server, I mainly use one computer, so I download (rsync) my Maildir and run mutt on it.

So I wrote a little script to encrypt all my incoming emails without requiring dovecot. However, the whole email is encrypted, headers are unreadable. That's fine, mutt know how to open them, they're just not sorted.

Actually, I decrypt them after downloading the messages and before opening mutt.

First, set up a .forward file on your server home:

echo "|/usr/local/bin/encrypt-mail.sh -r you@domain.tld" > ~/.forward
chmod 600 ~/.forward

The encrypt-mail.sh file is:

#!/bin/sh
# encrypt incoming mail
#
# 	"Initial setup:\n"
# 	"echo "|/usr/local/bin/encrypt-mail.sh -r you@domain.tld" > ~/.forward\n"
# 	"chmod 600 ~/.forward\n"

usage() {
	printf "usage: $0 [-r email@domain.tld] [-h]\n"
	printf "	-h: show this help\n"
	printf "	-r: set recipient email, default to user@hostname\n"
	printf "---\n"
	exit 1
}

# default user email
recipient="$(whoami)@$(hostname)"

while getopts 'r:h' c
do
    case $c in
	h) usage ;;
        r) recipient="${OPTARG}" ;;
    esac
done


# check if Maildir/new is here
d="$HOME/Maildir/new"
test ! -d "${d}" && mkdir -p "${d}"

# create a path to a new email
# format:
# gettimeofday().uniqu-id.gethostname()
timeofday="$(date +%s)"
uniq_id="$$"
myhostname="$(hostname | sed -e 's;/;\\057;' -e 's;:;\\072;g')"

new_mail_filename="$HOME/Maildir/new/${timeofday}.${uniq_id}.${myhostname}"

# encrypt
gpg --output "${new_mail_filename}" --encrypt --armor --recipient "${recipient}"

One may want a better setup to keep different IMAP clients synchronised.

Someone told me Solène had a better idea 👼.


Comments?

=> mailto:prx@si3t.ch?subject=Encrypt-all-incoming-emails-with-gpg

Instructions:

]]>

https://si3t.ch/log/2024-09-12-premieres-choses-a-faire-serveur-openbsd.txt

2024-09-12T09:23:06Z

<![CDATA[

J'ai récemment loué une machine virtuelle chez vultr pour quelques heures afin de tester des trucs, et je me suis aperçu qu'il y avait tout de même des petites étapes importantes que je serai amené à reproduire si je dois repartir de zéro.

Voici donc ma "check list" minimale après l'installation d'OpenBSD.

user et doas

Je crée un utilisateur "normal" et j'édite doas.conf

#/etc/doas.conf
permit persist user

Ensuite, je change le mot de passe root avec un truc que j'oublierai vite:

# su -
# jot -rcs '' $l 32 126
# passwd

aliases

J'ajoute mon mail dans /etc/mail/aliases

root: me@stuff.tld
# newaliases

SSH et root

Vultr donne par défaut un accès root via ssh. C'est pas très malin, alors on édite /etc/ssh/sshd.conf:

PermitRootLogin no

Pour protéger l'accès à ssh, on installe sshguard:

# pkg_add sshguard
# rcctl enable sshguard
# rcctl start sshguard

pf.conf

On modifie la configuration du parefeu pour:

  • utiliser sshguard
  • limiter le bruteforce sur le port ssh
  • pouvoir utiliser des listes noires d'IP (https://si3t.ch/evils/)

On bloque tout par défaut, on bloque les listes noires, on autorise le ping et on prévoit l'ouvertur d'autres ports plus tard en décommentant les lignes avec "tcp_pass" et "udp_pass".

touch /var/prx-brutes.txt
touch /var/pf-badhost.txt
#/etc/pf.conf
ifaces = "{ egress }"

# maybe useful later
#tcp_pass = "{ www https }" # change me
#udp_pass = "{ domain }" # change me

table  persist
table  persist
table  persist file "/var/prx-brutes.txt"
table  persist file "/var/pf-badhost.txt"

set skip on { lo }
set limit table-entries 409600

antispoof for $ifaces

block

block quick from  label "BRUTES"
block quick from  label "SSHGUARD"
block quick from  label "PRX"
block quick from  label "PFBADHOST"

# allow ping
pass on $ifaces inet6 proto ipv6-icmp all #icmp6-type echoreq
pass on $ifaces inet proto icmp all # icmp-type echoreq

pass in on $ifaces proto tcp to port ssh modulate state \
        (source-track rule, \
        max-src-conn 8, max-src-conn-rate 15/5, \
        overload  flush global)

#pass in on $ifaces proto tcp to port $tcp_pass modulate state
#pass in on $ifaces proto udp to port $udp_pass

pass out on $ifaces proto { tcp udp }

Bien sûr, on recharge pf:

# pfctl -f /etc/pf.conf

Maintenant, on prévoit la mise à jour des listes noires chaque jour:

# /etc/daily.local
ftp -o- https://si3t.ch/pub/evils/prx-brutes.txt.gz | \
	gzcat > /var/prx-brutes.txt && \
	pfctl -t prx -T replace -f /var/prx-brutes.txt
ftp -o- https://si3t.ch/pub/evils/pf-badhost.txt.gz | \
	gzcat > /var/pf-badhost.txt && \
	pfctl -t pf-badhost -T replace -f /var/pf-badhost.txt

Pour aller plus loin avec le parefeu, j'installe aussi iblock avec une version modifiée pour ne pas avoir besoin d'inetd :

=> https://tildegit.org/prx/iblock/src/branch/icanserve


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=premieres-choses-a-faire-serveur-openbsd

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-12-first-things-to-do-on-openbsd-server.txt

2024-09-12T09:37:08Z

<![CDATA[

regular user and doas

# adduser
cat << EOF >> /etc/doas.conf
permit persist user
EOF

Change root password with random chars produced by jot:

# su -
# jot -rcs '' $l 32 126
# passwd

aliases

J'ajoute mon mail dans /etc/mail/aliases

Add yourself to root alias, then run "newaliases":

/etc/mail/aliases:
root: me@stuff.tld

SSH

# /etc/ssh/sshd_config
PermitRootLogin no

Install sshguard

# pkg_add sshguard
# rcctl enable sshguard
# rcctl start sshguard

pf.conf

  • will use sshguard
  • reduce bruteforce on ssh
  • Use blacklists from https://si3t.ch/evils/
  • prepare future work with lines to edit/uncomment
touch /var/prx-brutes.txt
touch /var/pf-badhost.txt
#/etc/pf.conf
ifaces = "{ egress }"

# maybe useful later
#tcp_pass = "{ www https }" # change me
#udp_pass = "{ domain }" # change me

table  persist
table  persist
table  persist file "/var/prx-brutes.txt"
table  persist file "/var/pf-badhost.txt"

set skip on { lo }
set limit table-entries 409600

antispoof for $ifaces

block

block quick from  label "BRUTES"
block quick from  label "SSHGUARD"
block quick from  label "PRX"
block quick from  label "PFBADHOST"

# allow ping
pass on $ifaces inet6 proto ipv6-icmp all #icmp6-type echoreq
pass on $ifaces inet proto icmp all # icmp-type echoreq

pass in on $ifaces proto tcp to port ssh modulate state \
        (source-track rule, \
        max-src-conn 8, max-src-conn-rate 15/5, \
        overload  flush global)

#pass in on $ifaces proto tcp to port $tcp_pass modulate state
#pass in on $ifaces proto udp to port $udp_pass

pass out on $ifaces proto { tcp udp }

Reload pf:

# pfctl -f /etc/pf.conf

Prepare blacklist updates:

# /etc/daily.local
ftp -o- https://si3t.ch/pub/evils/prx-brutes.txt.gz | \
	gzcat > /var/prx-brutes.txt && \
	pfctl -t prx -T replace -f /var/prx-brutes.txt
ftp -o- https://si3t.ch/pub/evils/pf-badhost.txt.gz | \
	gzcat > /var/pf-badhost.txt && \
	pfctl -t pf-badhost -T replace -f /var/pf-badhost.txt

To go further, I also install iblock with a modified version not requiring inetd:

=> https://tildegit.org/prx/iblock/src/branch/icanserve


Comments?

=> mailto:prx@si3t.ch?subject=first-things-to-do-on-openbsd-server

How to:

]]>

https://si3t.ch/log/2024-09-08-quel-je-de-role-pour-collegiens.txt

2024-09-08T13:47:23Z

<![CDATA[

Cette année, je souhaite tenter de proposer un "club jeu de rôle" pour mes collégiens. Je suis dans un collège "captif", c'est à dire que tous les élèves prennent le car (ou presque). Cela signifie qu'ils sont de 8h à 17h au collège, et au bout d'un moment, tourner en rond dans la cour, on s'ennuie et on fait des conneries. Alors un club, ça permet d'alléger les AED, et autant faire quelque chose d'intelligent de son temps.

Le "souci" avec les collégiens, c'est qu'ils sont très différents. Entre les petits 6e et les 3e qui me dépassent, les centres d'intérêts ne sont pas le même. C'est vrai aussi entre les garçons et les filles : je ne voudrais pas réserver le jeu de rôle à des garçons en manque de virilité qui veulent juste pourfendre du dragon et laisser les demoiselles de côté parce que les "codes sociaux" ont tendance à réserver ce genre d'activités aux garçons.

Je voudrais donc du jeu de rôle inclusif.

Je voudrais aussi qu'ils puissent poursuivre le jeu de leur côté, donc si je peux éviter l'achat de matériel trop onéreux, ils pourraient l'utiliser à la maison.

Après avoir demandé des conseils sur Mastodon, j'ai sélectionné quelques jeux:

Cairn

=> https://lecrapal.itch.io/cairn-fr

Ce jeu a l'avantage d'être à prix libre. Il reprend les règles habituelles des jeux de rôles type D&D, mais en simplifie la plupart. Il reste très complet.

Petits bémols, il nécessite l'achat de dés spécifiques (D10, D20...) mais ce n'est pas un gros problème. Il ne comporte pas de campagne préconçues, tout est à inventer, ce n'est donc pas un jeu que je peux donner clés en main à mes élèves : je devrait être le maître du jeu, du moins au début.

Sodalitas

=> https://jdrcool.itch.io/sodalitas

Mon gros coup de coeur.

Les règles sont très simples. Seul 2D6 sont Nécessaires. Pas de points de vie, pas de points d'armure, tout se passe avec des points de stress.

L'accent est porté sur la liberté de création et l'imagination.

Chose intéressante, on ne gagne pas de XP, mais on ajoute des pièces à notre guilde pour profiter des avantages. Cela laisse imaginer plusieurs joueurs qui jouent pour la même guilde, mais pas forcément en même temps. L'esprit d'équipe est valorisé, ça me plaît.

Le jeu est peu onéreux. On peut juste contacter l'auteur pour lui demander le jeu si on est "éducateur", c'est ce que j'ai fait et il m'a répondu dans les 24h :)

En plus, il m'a aussi envoyé toutes les fiches de campagnes déjà toutes prêtes. Je peux donc très vite jouer avec mes élèves, et surtout les laisser aussi créer leur propre parties en autonomie. C'est d'autant plus vrai qu'il y a déjà des personnages préconçus.

Du coup, j'ai acheté le jeu quand même :)

Les règles sont écrites au féminin :)

Donjons et chenapans

=> https://gusandco.net/wp-content/uploads/2022/04/donjons_et_chenapans-1.pdf

À la base, c'est pour les plus petits.

Cependant, le système de jeu est tellement simple qu'on peut très bien imaginer l'utiliser pour des collégiens en guise de porte d'entrée vers le jeu de rôle.

On commence par dessiner son personnage.

On définit 3 caractéristiques.

Et c'est parti!

Trouilleville

=> https://makaka-editions.com/produit/trouilleville/

25€, oui, je sais, on s'éloigne de la gratuité là...

Mais!

On peut tout à fait apprendre les règles puis se passer du livre.

J'ai joué à ce jeu avec mon fils de 5 ans. Le design est mignon, mais des collégiens pourront tout à fait s'imaginer en monstres répugnants. Car c'est là l'intérêt de Trouilleville : vous incarnez un monstre, squelette, sorcière, vampire, golem...

L'avantage du livre est là aussi de proposer des campagnes et des idées pour le MJ.

Les règles sont toutes simples mais suffisamment complètes pour apporter une richesse très intéressante à l'évolution du personnage et à l'entraide.

Les jets de dés sont tous simples. On peut attaquer ou faire peur aux monstres. Pour cause, on peut faire des jets de force (combat, résistance,...), d'esprit (agilité, arme de jet, magie) ou de frayeur. Puisque vous êtes des montres, vous pouvez tout à fait vous débarrasser de vos ennemis en leur fichant la trouille, ce qui est parfois + facile que de les combattre.

Simple, riche, je recommande vivement!!!

Come rain come shine

=> https://penflower-ink.itch.io/come-rain-come-shine

Un jeu de rôle solarpunk!

Donc forcément, déjà, je l'aime.

Ici, les règles sont aussi écrites pour des joueuses. Ça n'a l'air de rien, mais ça m'a plu.

On sort des carcans habituels dans le thème. C'est reposant, non violent.

Pour faire court : une communauté doit s'entraider pour survivre et prospérer en harmonie avec la nature.

C'est beau, bienveillant.

Pas de MJ, tout le monde joue ensemble : c'est bien pour lancer des groupes d'élèves dans l'aventure.

J'ai hâte de l'essayer :)

Le vôtre

Vous en connaissez peut-être d'autres?

Vous avez des conseils à me donner?

Je suis preneur :)


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=quel-je-de-role-pour-collegiens

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-09-05-nouvelles-du-moment.txt

2024-09-05T20:27:26Z

<![CDATA[

Déconnexion

J'ai très peu écrit de l'été. Pas envie, pas le temps, mieux à faire...

Ce qui est étrange, c'est que moins je passais de temps devant un ordinateur, moins j'en avais envie ni besoin.

Avec la reprise à fond du travail, l'envie d'écrire revient un peu.

C'est peut-être l'envie de procrastiner ^^.

Boulot

C'est la première année où je ne stresse (presque) pas pour la rentrée. Je suis tout fier de moi. Ma recette? Du sport, et du travail tout au long de l'été. Je me sens du coup prêt à affronter, et souffre un peu moins du sentiment d'imposteur : j'ai un tas d'outils prêts.

Par conséquent, même s'il y a 1000 trucs auxquels je dois penser, c'est pour l'instant stimulant.

Imprimer les listes des classes, en faire un tableau pour le suivi des apprentissages, compter le nombre d'élèves dans chaque groupe pour faire le bon nombre de copies, faire les copies et ne pas oublier ce qui est en A3, en A4 ou recto-verso, relire les dossiers GEVASCO des élèves dont je suis prof principal, faire noter la date et l'heure de la réunion de rentrée, transmettre à la vie sco les documents récoltés, préparer le matériel, répondre aux demandes car un ordi ne marche pas ou l'imprimante n'apparaît plus, vérifier quel prof est disponible pour la sortie organisée par la documentaliste, relancer le chef d'établissement pour qu'il fasse l'import de la base élève, ...

Rien à voir, j'ai décidé de reformater mon disque dur de sauvegarde où je stocke mes films favoris en NTFS. C'est le seul format "portable" qui permet aussi d'avoir des fichiers de + de 4G ce qui est fréquent avec la HD désormais.

Par défaut c'est monté en read-only sous openbsd en utilisant la commande mount. Il faut utiliser "ntfs-3g /dev/sda3i /mnt".

Il me reste à remplir ma collection, il y a tant d'ouvrages que j'aimerais montrer à mes enfants.

Culture ?

On a vu Fleabag pendant l'été. On est très décus. Ma chérie était en colère, c'est très anti-féministe malgré les apparences.

Là, on regarde Six Feet Under. C'est pour l'instant excellent. J'adore quand on prend le temps de détailler des personnages complexes.

Le Comte de Monte Cristo m'a beaucoup plu au cinéma. J'adore Niney. Le casting contient du monde qu'on reverra, c'est sûr. Une actrice ressemble à Ana de Armas, un autre est un mélange de Mike dans Stranger Things et de Paul Atréides dans Dune : ça doit être les standards de beauté du moment.

On a vu Acide aussi. Il pleut de l'acide sulfurique. C'est prenant, poignant. Dur. Très très bien!

On m'a offert La Route, BD de Manu Larcenet. C'est "pire" que le film. Excellent, mais glaçant.

Sur les bons conseils de Solène, j'ai acheté la trilogie de Mars de Kim Stanley Robinson. Là aussi, les personnages sont riches, et la science pour la fiction tient la route. J'ai tous les soirs hâte de reprendre la lecture.

si3t.ch

Coté site, j'ai réimplémenté la génération d'une table des matières pour les pages trop longues, ça me semblait plutôt utile pour la doc auto-hébergement.

Projets

Je reprends actuellement la documentation pour la vistualisation avec OpenBSD.

En parallèle, j'ai réservé un nom de domaine pour un petit projet d'hébergement. On verra si ça aboutit.

Sinon, j'ai presque terminé mon toboggan d'intérieur pour passer de l'étage au rez-de-chaussée.

Ensuite, il faudra agrandir la bibliothèque, il y a trop de livres :)

Cet été, on m'a proposé de travailler en tant qu'auto-entrepreneur pour faire de la tech UNIX. C'est très flatteur. J'ai refusé cependant : je n'ai pas le courage pour l'instant de me lancer dans la paperasse, et je veux garder du temps pour mes jeunes enfants, tant pis si j'ai moins de sous. Mais ça fait réfléchir pour l'avenir, si un jour prof devient insupportable. Merci!

Pensées

Une idée comme ça : le propre de l'homme n'est pas le rire, mais l'art, la création : musique, cinéma, scénarios, poésie, graphisme... C'est l'imaginaire.

Les plaisirs d'été : se laver à l'eau froide, regarder le potager s'épanouir, croquer des mûres cueillies pendant la promenade, manger dehors, se promener sans regarder l'heure qu'il est.

À force de discuter écologie et inégalités sociales, je m'énerve de voir de bonnes idées jetées à la poubelle parce qu'elle ne sont pas parfaites.

Pourtant, on entend des trucs qui commencent par

"Idéalement, il faudrait..."

Oui, ça serait idéal de redistribuer les richesses, de réfléchir à notre environnement, de prendre soin des autrs et de notre habitat.

Idéal.

Oui, je suis un idéaliste. Vous me le jetez au visage comme si c'était un défaut. Je veux en être fier.

Fier d'être idéaliste, car l'idéal, c'est ce vers quoi je rêve que l'on se rapproche.

Choisir l'inaction quand la solution n'est pas parfaite, c'est faire le choix de ne pas se rapprocher de l'idéal.

Même avec des petits pas, on avance.

L'inertie conduit à la mort. Il faut s'adapter pour survivre.

Je ne veux pas d'un monde où la gentillesse et l'idéalisme sont vus comme des signes de faiblesse.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=nouvelles-du-moment

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-08-20-Introduction-themes-physique-chimie-films.txt

2024-08-20T20:46:34Z

<![CDATA[

Cette année, j'aimerais introduire les nouveaux chapites de physique-chimie avec des extraits de films. Puisque nous allons participer aux Utopiales avec mes classes de 3e, je privilégie la SF :)

=> Utopiales

4 thèmes principaux sont à couvrir:

  • La matière (chimie)
  • Les mouvements
  • Les signaux
  • L'énergie. Pour ce dernier, une grosse partie porte sur l'électricité.

La matière (chimie)

Pour introduire la notion d'acide quoi de mieux que le "sang" qui s'achappe de l'Alien lorsque le facehugger est étudié ?

=> https://0x0.st/XJgL.mkv

En alternative, la bande annonce du film plus récent ACIDE permet de présenter cette notion. En plus, c'est un film français qui m'a très agréablement surpris:

=> https://0x0.st/XJg_.mkv

Comme vous le voyez, il me manque des choses pour la chimie. Ça ne se limite pas à l'acide... J'ai bien pensé à Breaking Bad, mais aucun extrait concernant la chimie en particulier ne me vient à l'esprit. Et je m'adresse à des collégiens, donc attention au message passé, même si J'ADORE Breaking Bad.

Les mouvements

Pour les mouvements et tout particulièrement la notion de point de vue et relativité, les exemples ne manquent pas.

On dispose de 2 scènes qui se déroulent dans l'espace : un vaisseau en aborde un autre.

Le premier est calme et reposant, c'est dans 2011 l'odyssée de l'espace.

=> https://0x0.st/XJgp.webm

Le second me fascine davantage, mais c'est sans aucun doute lié à l'excellent bande son. Je parle bien sûr d'Interstellar:

=> https://0x0.st/XJgW.webm

Ensuite, on peut illustrer la seconde loi de Newton, le principe d'action/réaction avec Wall-e qui vide son extincteur:

=> https://0x0.st/XJg4.mkv

Ça m'amuse de remarquer qu'on retrouve exactement le même principe dans Gravity:

=> https://0x0.st/XJgy.mkv

Finalement, on retrouve une belle fusion des précedents thèmes avec Seul sur Mars : la relativité de mouvement et la 2e loi de Newton dans une scène où Matt Damon m'émeut à coup sûr.

=> https://0x0.st/XJgx.mkv

Les signaux

On commence doucement avec Premier Contact, si on veut parler d'anthropomorphisme et pourquoi pas de la plaque dans la sonde Pioneer:

=> https://0x0.st/XJgY.mkv

Mais pour vraiment s'éclater, Contact en 2 parties permet d'aborder la notion de fréquence, de ce qui est signe d'intelligence, et travailler sur les stéréotypes portés par les acteurs de l'époque. Une femme ne peut pas être intelligente ET canon, donc on lui met de slunettes et on lui attache les cheveux :)

=> https://0x0.st/XJg6.webm | https://0x0.st/XJgI.webm

L'énergie

Bien évidemment, Matrix propose une présentation de source d'énergie un peu dérangeante : les humains commes des piles. C'est à mon avis un rare exemple de forme d'énergie chimique ^^

=> https://0x0.st/XJgR.mkv

Plus "tout publics", on a retour vers le futur avec un réacteur à base de plutonium :

=> https://0x0.st/XJgk.mkv

Et puis finalement, un excellent recycleur de peaux de bananes:

=> https://0x0.st/XJgU.mkv

À vous!

J'imagine que je n'ai pas pensé à toutes les possibilités.

N'hésitez pas à me faire part de vos suggestions ;)

ps : merci JB pour toutes les bonnes idées ;)

Les extraits?

Si les extraits ne sont plus disponibles via les liens ci-dessus, demandez-moi par mail ;)


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=Introduction-themes-physique-chimie-films

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-08-13-fuzzy-find-terminal-history.txt

2024-08-13T11:55:44Z

<![CDATA[

Yeah, I know, Ctrl-R, right?

But it only show the very last match, and I feel sometimes confused when I look for long commands.

That's why I wrote this litle alias to add in your shell config (''~/.aliases''):

alias hf='fc -l 1 | cut -f2- | pick | ${SHELL:-"/bin/sh"}'

Now, when I enter ''hf'', I see all commands recorded in history. That's what ''fc -l 1'' do : showing all comands from the first.

Then, ''cut'' remove the first field, to only see the command.

''pick'' let me choose the command to re-run, and it's finally piped to a new shell.

Of course, you may replace pick by similar tools such as:

=> https://pedantic.software/git/choice | https://github.com/jhawthorn/fzy | https://github.com/junegunn/fzf

Now I wrote this, I can read in the pick manpage this :

Select a command from the history to execute:

	$ eval $(fc -ln 1 | pick)

Seems like I should have read it before :)

So, now, it's :

alias hf='eval $(fc -ln 1 | pick)'


Comment?

=> mailto:prx@si3t.ch?subject=fuzzy-find-terminal-history

See instructions:

]]>

https://si3t.ch/log/2024-08-05-arrivee-capybaras.txt

2024-08-05T07:10:33Z

<![CDATA[

Une fois n'est pas coutume, je voudrais vous parler d'un livre.

Un livre jeunesse, eh oui, pourquoi pas?

Il s'agit de "L'arrivée des capybaras" :

=> https://www.babelio.com/livres/Soderguit-Larrivee-des-capybaras/1216367

Sur le modèle du prix des incorruptibles, nous nous sommes amusés à emprunter des livres à la médiathèque. Chaque membre de la famille devait en choisir 2.

Tous les jours, nous avons lu un livre ensemble, pour finalement "voter" : on a posé des jetons sur les livres que nous avions préférés.

Le livre avec le plus de jetons sera acheté.

Bref, j'ai eu un gros coup de coeur pour "L'arrivée des capybaras".

L'histoire est simple. Nous voyons un poulailler, les poules décrivent leur vie paisible et bien rangée. Le dessin est sombre, et on distingue clairement que les hommes mangent les poules et leurs oeufs, les grillages sont partout.

Un jour, des capybaras arrivent au poulailler. Ils ne sont pas pareils, ils vont prendre notre nourriture et notre espace de vie. Ils mangeront donc à part, et resteront à l'écart. Interdiction pour les jeunes poussins de jouer avec les jeunes capybaras.

Et là, fierté du papa que je suis, mon fils s'est vite exclamé :

Mais c'est pas juste, la terre elle est pour tout le monde!

On y découvre ensuite, à l'arrivée de vilains chasseurs, une belle leçon d'humanité, et une fin ouverte comme je les aime.

N'hésitez pas à y jeter un oeil!


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=arrivée-capybaras

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-08-04-stats-bas-de-page.txt

2024-08-04T14:40:52Z

<![CDATA[

L'été est chargé.

Je ne trouve pas le temps de tout faire, et moins je suis devant l'écran de mon ordinateur, moin j'en trouve l'envie.

J'ai toutefois fait un caprice l'autre jour : j'ai ajouté quelques éléments concernant l'état du serveur en bas de page.

Cela appelle un bout de javascript qui affiche le contenu d'un fichier texte.

Ce fichier texte est généré par un script, appelé via une tâche cron. Ça me semblait plus sûr ainsi que de développer un truc en php ou un cgi qu'il aurait fallu sécuriser et vérifier.

stats=/var/www/htdocs/si3t.ch/pub/serverstats.txt

cat << EOF > $stats
$(date +%H:%M) - $(sysctl -n vm.loadavg) - $(sysctl -n hw.sensors.km0.temp0)
EOF

Pour l'instant, ça affiche l'heure locale, la charge et la température.

Peut-être un jour sera affichée l'état de la batterie, si j'investis dans un serveur solaire.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=stats-bas-de-page

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-07-08-traces-4.txt

2024-07-08T15:34:37Z

<![CDATA[

Perso

Vendredi dernier, j'ai terminé de corriger plus de 115 copies. J'en aurais pleuré de soulagement dans la voiture au retour : ça y était, j'étais vraiment en vacances.

Avec la fin d'année scolaire, une forme de vide s'installe. Avec, vient l'angoisse et la culpabilité. Chaque minute devrait être optimisée. Tu DOIS travailler, ce n'est pas normal si tu ne travailles pas. En plus, tu as plein de projets et d'idées à mettre en place.

Je suis en "vacances" et je stresse.

Symptôme que je connais bien... Il y a eu du surmenage, qui a carburé à l'alcool. Pas bon ça.

Pour me débarasser de cette culbabilité, j'ai décidé de me tenir éloigné des écrans. Mon téléphone reste dans un coin : il n'est plus dans ma poche.

Mon ordinateur est allumé une fois par jour, avec 1 seul objectif que j'ai choisi avant.

À la place, je m'occupe de la maison :

Tondre la pelouse et la mettre autour des choux et salades qui aiment la fraîcheur.

Les haricots peinent à lever, et se font dévorer par les escargots et limaces tant les chaleurs tardent à s'installer cette année. J'aurai raté mon potager cette année, mais tant pis.

Je bricole et range mon "atelier", cette pièce en bazar attenant la maison. Je scie avec la scie japonaise qu'on m'a conseillée, c'est génial, je perce et visse. Pas d'électricité, ça défoule, c'est propre.

Je prends le temps de réfléchir et voir des idées prendre forme, concrètement, ça fait du bien.

Pendant cet été, j'espère réaliser enfin le toboggan promis à mes enfants.

J'ai repris un peu le sport. Je tiens ainsi mon calendrier à jour : j'ajoute un "s" à chaque fois que j'ai fait un peu de sport.

Je peine à progresser, mais j'ai l'impression que ça arrive : hier, j'ai réussi à courir 13 km. Je reste trop gros à mon goût, mais j'en suis le seul responsable : la bière ça ne pardonne pas :).

Là aussi, je veille à être plus sobre, même si les incitations sont nombreuses en vacances.

JO

Mon fils a trouvé malin de mettre la pièce offerte par la france à chaque élèves pour les JO (c'est quoi cette idée de merde d'ailleurs???). Il a failli s'étouffer, j'ai vraiment cru le perdre.

Morale : révisez vos gestes de premiers secours.

Ça a sauvé mon fils. Reste à m'en remettre et me contenir de me lever la nuit pour aller lui faire un câlin, il m'a fichu la trouille ce coquin!

Dans le lowtech journal, il parlent de sport écologique. J'ai bien aimé plusieurs remarques :

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

Notamment toute la pollution que ça va générer : fabriquer les infrastructures, déplacer les athlètes en avion...

Informatique

J'ai recompilé rover, il suffisait de modifier un tout petit peu le Makefile pour trouver la librairie manquante. J'adore ce gestionnaire de fichiers, il a tout ce dont j'ai besoin, est facile à configurer (pas besoin de xdg-open), et évite d'être surchargé de trucs inutiles comme nnn et consorts.

=> https://github.com/lecram/rover | https://github.com/lecram/rover/issues/42

Il faudrait en faire un port pour OpenBSD. La dernière fois, il n'avais suscité aucun intérêt :/

Liens

Une petite vidéo vue en formation "santé mentale". Ça vaut son détour :

=> Tout le monde s'en fout

Une musique de 7 minutes, parfait pour une mini session de HIIT :

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


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=traces-4

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-06-30-pour-les-racistes.txt

2024-06-30T13:29:54Z

<![CDATA[

Ce matin, je vais au bureau de vote avec mes enfants.

Il y a de l'attente, c'est un peu long. J'ai envie de me dire que c'est tant mieux.

Mon fils s'impatiente et s'agite un peu.

Sont affichés les écrans avec chaque candidat à côté du numéro qui lui est attribué, on a des machines dans ma commune.

Pointant du doigt l'un d'entre eux, il me demande:

Dis papa, tu vas choisir celui-là?
Tu sais, les gens ne disent pas trop pour qui ils votent.

Il insiste en pointant le numéro d'à côté :

Tu vas voter pour lui?
Ah non mon chéri, celui-là, c'est pour les racistes.

👼


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=pour-les-racistes

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-06-22-modifications-mineures.txt

2024-06-22T15:23:20Z

<![CDATA[

J'ai récemment appris qu'il était préférable d'utiliser "em" plutôt que "rem" dans les unités CSS pour supporter les vieux navigateurs.

Par la même occasion, j'ai réintroduit le CSS entre balises "" plutôt qu'un appel à une feuille externe, le contenu du css étant plus petit que la taille du paquet envoyé pour la requête.

Enfin, j'ai modifié le code de mon convertisseur gmi2html pour :

  • Ne plus insérer les images, mais seulement laisser les liens. C'est un choix un peu extrême, mais ça permet de ne pas imposer le chargement d'une image lourde si quelqu'un a une connexion lente. J'ai d'ailleurs appris par la même occasion que le lazy load pouvait être utilisé pour surveiller les habitudes de navigation de quelqu'un. Ça paraît logique quand on y pense.
  • J'ai viré les ancres à côté des titres pour avoir un lien vers cette section. À la place, c'est le titre lui-même qui constitue cette ancre. C'est plus joli que de rajouter des "§" partout.

=> https://git.sr.ht/~prx/si3t.ch/tree/master/item/tools/gmi2html.awk


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=modifications-mineures

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-06-19-traces-3.txt

2024-06-19T09:28:29Z

<![CDATA[

En ce moment...

On arrive à la période pleine d'appréhension de fin d'année... Des élèves connus depuis 4 ans vont quitter mon établissement, et c'est toujours un peu compliqué de gérer l'émotion.

Que je suis mauvais pour dire au revoir.

Quand on aime, il faut laisser partir comme on dit.

Vous allez me manquez!

(pas tous XD)

lowtech / écologie

C'est ma chère petite maman qui m'a envoyé cet article, à propos des puits aériens. Ça ressemble à des pièges à humidité, c'est très ingénieux.

=> https://www.neozone.org/innovation/le-puits-aerien-un-capteur-atmospherique-et-une-methode-ancestrale-pour-produire-de-leau-potable/

En gros, l'inerthie thermique de la pierre permet de refroidir la vapeur d'eau ambiante et de liquéfier un peu d'eau.

citation

Faites attention, quand une démocratie est malade, le fascisme vient à son chevet mais ce n'est pas pour prendre de ses nouvelles. -- Albert CAMUS

À méditer

J'ai adoré l'article de ploum, tant et si bien que je l'ai imprimé et affiché dans ma salle de classe, pour les curieux ou ceux qui s'ennuient. Il y explique ce qu'est la compensation carbone, les labels "verts", avec sarcasme et ironie sur fond de publicité malsaine. C'est très bien écrit!

=> https://ploum.net/2024-06-17-compensation-carbone.html

Sinon, j'ai eu droit à une question d'un élève qui préparait un travail de franiçais : "peut-on expliquer l'amour? (scientifiquement parlant)".

Informatique

Mon x250 est fissuré, c'est la coque au niveau de la charniere, juste à côté de l'alimentation. Ça doit être quand mon sac à dos est tombé.

Et puis l'écran est abimé, un petit point qui mine de rien, est fatiguant après plusieurs heures. Pas un pixel mort, c'est une sorte de rayure profonde. Et il y a des traces des touches (nonon, pas de la saleté).

1 seul port usb fonctionnel, ennuyeux...

Il n'y a pas de webcam, embêtant pour les visios et formations à distance, de plus en plus fréquentes puisqu'on reçoit ces formations sur notre temps libre.

De plus, le cable d'alimentation est très court, il me faut très souvent une rallonge.

La coque est toute griffée, avec des restes de colle...

Bref... Je cède à la tentation et j'achète un x270 sur a suggestion de Solène. En plus, la batterie de rechange que j'avais achetée pour mon x250 est compatible \o/

La commande est passée sur Backmarket.

Ils m'ont d'abord envoyé un x280, dont je ne veux surtout pas car il faut un adaptateur pour le cable réseau.

Après l'avoir retourné, j'ai finalement reçu un x270, mais avec un peu moins de RAM que prévu. Ce n'est pas un souci pour moi, mais j'attends un geste commercial.

Voici donc venu le temps de l'installation propre :

  • Etape 1 : vérifier les specs
  • Etape 2 : mise à jour du bios

=> https://si3t.ch/log/archives/2023-12-07-bios-lenovo-update.txt

On charge le BIOS update Bootable CD:

=> https://pcsupport.lenovo.com/fr/fr/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x270/downloads/driver-list/component?name=BIOS&id=5AC6A815-321D-440E-8833-B07A93E0428C

Ensuite, on le met sur une clé sur laquelle on va booter:

geteltorito -o biosup.img r0iur44w.iso
dd if=biosup.img of=/dev/rds3c bs=1m
  • Etape 3 : install d'OpenBSD. Mon nouvel ordinateur s'appelera "ix". Choisir le nom de machine c'est ce qui aura été le plus compliqué.

=> https://si3t.ch/misc/logiciel-libre/openbsd/postinst/

  • Etape 4 : transfert des données d'un PC à l'autre :
rcctl -f start sshd
# edit pf to open ssh
rsync prx@192.168.1.xx:/home/prx/ /home/prx/
  • Etape 5 : remplacement de pâte thermique (il pourrait y penser les revendeurs quand même...). Avant, 65°C minimum, maintenant 48°C

Ça tourne vraiment tout seul. Quel bonheur, l'écran a une meilleure résolution, c'est très reposant.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=traces-3

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-06-10-les-rues-sont-vides.txt

2024-06-10T08:45:11Z

<![CDATA[

Regardez bien petits et grands, regardez bien,

toutes les personnes que vous rencontrez, avec qui vous parlez, avec qui vous riez,

regardez bien et comprenez,

hier, plus d'une sur 3 a choisi la haine.

Bien plus en réalité, car vous connaissez l'adage:

qui ne dit rien consent.

Cette majorité silencieuse sera responsable des corps au fond de la mer, celle-là même dans laquelle vous vous baignez avec insouciance.

Vous n'avez décidément rien compris.

À quoi serviront vos frontières lorsque leur terres ne seront plus vivables?

À quoi serviront vos costards lorsqu'une marée humaine déferlera pour fuir leurs températures extrêmes?

À quoi serviront votre haine quand ce sera votre à votre tour de fuir vers des climats plus frais?

Alors que jamais le climat n'a été aussi inquiétant.

Les alternatives ne manquaient pas... Parti Pirate, Equinoxe, Ecologistes de tous poils...

Mais vous avez préféré les alliés de Poutine, dont le soutient au parti de Marine Le Pen n'est plus à prouver. Vous avez préféré la guerre en Ukraine. Il doit bien rigoler celui-là de voir le bazar en Europe.

=> https://www.lemonde.fr/les-decodeurs/article/2022/04/20/quels-sont-les-liens-de-marine-le-pen-avec-la-russie-de-vladimir-poutine_6122903_4355770.html

"Jamais plus de 20%"...

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

Pourtant, les rues sont vides.

Bande d'hypocrites.


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=les-rues-sont-vides

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-06-08-traces-2.txt

2024-06-08T15:08:16Z

<![CDATA[

Écologie

J'aimerais modifier mon régime pour quelque chose de + végétarien, à la fois dans un souci écologique mais avec aussi une finalité sur la bonne santé.

Mais mes enfants aiment et ont besoin de viande.

Je cherche des recettes simples, c'est à dire rapides, qui conviendraient aussi à mes petits loups.

Je dis ça, j'imagine que les besoins enfant ne sont pas tout à fait identiques, je devrais demander à un diététicien.

Difficile de faire le tri entre le prosélytisme et le vrai.

J'ai vu passer un siphon récupérateur d'eau pour un évier de cuisine:

=> https://waterpowered.eu/collections/reco-water

L'idée serait d'avoir un bidon en-dessous pour récupérer l'eau et arroser le jardin.

Actuellement, je met une petite bassine que je vide dans mes arrosoirs à l'extérieur. Cependant :

  • J'en fous partout quand je transvase.
  • La bassine est trop petite, il faut la vider très souvent, et sa forme n'est pas très adaptée à mon évier.
  • Je dois sortir dehors. En pleine canicule, c'est pas terrible alors que je veux garder la maison fraîche.

Maintenant, ça semble un peu overkill... J'hésite

En passant, un petit article qui pose la question d'avoir des enfants en 2024?

=> https://vaghetti.dev/posts/children/

En ce qui me concerne, j'ai aussi l'espoir fou de les préparer à rendre le monde meilleur.

Bricolage

J'avais creusé un petit bac à sable pour les enfants. Ce sont mes premiers parpaing smontés tout seul, j'en suis un peu fier :)

Cependant, il y a tout un tas de saletés qui tombent dedans, notamment les feuilles des arbres. Les cloportes adorent!

Pour éviter que cela ne devienne en plus une litière pour tous le schats du quartier, je l'avais recouvert de morceaux de palettes récupérés.

J'ai trouvé finalement des bouts de terrasse en bois, vendus chez brico dépot à pas cher. Les rainures sont plus fines, il y aura moins de feuilles. J'ai découpé les bouts de palettes pour renforcer le tout et pouvoir marcher dessus.

Zététique?

Au détour d'une conversation, quelqu'un habituellement sceptique m'évoque le teatree, comme quoi c'est vraiment bien.

Apparemment, c'est une huile essentielle.

Et après un tout petit peu de recherche, il n'y a aucune valeur thérapeutique prouvée. Ça pourrait soigner l'acnée ET le pied d'athlète (sorte de mycose).

Je ne résiste pas à rappeler 2 trucs :

  • Si c'est un remède "universel" qui soigne plusieurs trucs à priori pas du tout en rapport (quel est le lien entre l'acnée et un champignon???), ça doit poser question.
  • Ce n'est pas parce que c'est naturel que c'est bon. La nature est cruelle et pleine de poisons. C'est un sophisme qui porte un nom : l'appel à la nature.

=> https://fr.wikipedia.org/wiki/Appel_%C3%A0_la_nature | https://www.drugs.com/npp/tea-tree-oil.html | https://www.nccih.nih.gov/health/tea-tree-oil

Plus grave, le teatree serait un poison si ingéré. Ça signifie que des gens ont du poison chez eux, tranquille, sans même le savoir.

Vous me direz, l'éthanol dans ma bière est un poison aussi.

Finalement, mon interlocutrice s'est rendue compte qu'elle en prenait parce que ses parents en prennent, sans avoir vérifié ou remis en cause l'utilité de cette huile essentielle.

Ça me fait me demander, combien de choses je tiens moi aussi pour acquises sans y avoir réfléchi?

En passant, les médecines alternatives peuvent faire du mal. Le wiki suivant en recense quelques unes, c'est édifiant :

=> https://www.psiram.com/fr/index.php/Accueil


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=traces-2

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-05-31-traces-1.txt

2024-05-31T10:39:52Z

<![CDATA[

Edito

Rhooo regadez-le comment il se la pète! "Edito"! Carrément, le gars il a laché la rampe...

... Tout ça pour dire que j'étais mal à l'aise avec les "vagues de notes", sans trop savoir dire pourquoi.

Je préfère parler de traces, commes celles que l'on dessine dans le sable, des lettres éphémères du bout des doigts.

Elles n'auront bientôt plus d'importance.

Perso

Semaine de merde.

Nuit de samedi à dimanche, ma fille est malade. Elle n'y peut rien la petite paupiette, mais quand on a de la fièvre, on cauchemarde, alors je me lève plusieurs fois. Je termine le week-end un peu crevé, mais ça va le faire.

Lundi, début de rhume. Normal, à force de me lever la nuit soit pour les enfants, soit parce que je fais des angoisses et n'arrive plus à retrouver le sommeil, je suis plus fragile. Ou c'est que je prends de l'âge. Bref, c'est qu'un rhume, osef.

Mardi, petit accident. Stationné pour accroché la ceinture de mon fils à la sortie de l'école, une voiture me frôle et accroche ma portière. Que de la tôle froissée, personne de blessé. Pas grave. C'est l'occasion de faire mon premier constat de toute ma vie avec le gentils monsieur de 83 ans tout désolé. Certains en ont profité pour me dire "voilà pourquoi il ne faut pas laisser les vieux conduire". ok, je suis énervé un peu moi aussi, un peu plus et c'est mon fils qu'il dégommait. Mais la vérité n'est pas si simple, ils sont libres de leurs déplacements, de pouvoir aller se nourir... En tout cas, le pauvre homme vivait seul, il m'a reçu chez lui et fait confiance. Un chic type qui je l'avoue, m'a fait un peu de peine avec les photos de sa défunte épouse sur le buffet.

Nuit de mardi à mercredi horrible : fièvre à mon tour, et une douleur intense au niveau de l'oreille et des courbatures.

Mercredi matin, il faut aller bosser quand même : j'ai des élèves qui passent leur examen dans 1 mois, impossible de les laisser tomber. J'enfile un masque FFP2 qui restait précieusement dans son emballage plastique au creux de ma boîte à gants, et c'est parti. Matinée laborieuse, mais mes élèves sont des amours. Ils semblent surpris de me voir avec le masque, cela doit évoquer de mauvais souvenirs. Mais les habitudes reviennent vite. Il n'y a qu'une matinée à tenir, je leur fait peut-être un peu pitié. Ça va le faire.

L'après-midi et la nuit suivante, c'est la décadence. J'ai l'impression que mon corps mobilise toute son énergie pour se débarasser de ce rhume : courbatures, articulations qui démangent, mal de tête, nez qui coule, mal de ventre, mal de dos, et une toux qui m'oblige parfois à m'asseoir. Je n'ai plus mal à l'oreille, mais mes bronches me brûlent avec une douleur qui métait encore inconnue. Je suis épuisé.

Jeudi, je file au boulot, mais les vertiges au volant me font renoncer : je déclare forfait.

Par chance, mon médecin a un créneau l'après-midi. J'y file en me doutant du diagnostic : un état grippal, paracétamol et repos. Décidément, les mâles, c'est des petits fragiles, ils pensent mourir dès qu'ils ont un truc.

Allongez-vous, respirer fort avec la bouche... Est-ce que vous acceptez que je fasse un test? Oui, je sais, ce n'est pas très agréable, mais on commence à être habitué. Voilà, dans 15 minutes je pourrai vous dire si c'est la grippe de saison, on en a de plus en plus en ce moment dans le coin. Je vous enverrai le résultat par message, d'accord?

... 5 minutes plus tard ...

Ah non tiens, c'est le COVID! Et c'est déjà révélé, c'est signe que vous êtes bourrés d'antigènes. Il y en a dans le bassin nantais, mais pas encore par ici, vous êtes mon premier depuis des mois!

Oh, joie!

Aujourd'hui vendredi. J'ai 35 ans, je suis vacciné, plutôt sportif et me sens malgré tout aussi bien qu'après m'être fait roulé dessus par un camion. On ne va plus en réanimation pour la COVID, c'est ce n'est pas une partie de plaisir.

Faîtes attention à vous.

Les masques, le lavage des mains, ça marche. Ne laissez personne faire comme si ça donnait l'air con.

Informatique

Je songe à ouvrir un blog plus perso, plus anonyme aussi, pour parler de trucs un peu plus sensibles. Mais bon, l'anonymat... je ne sais pas trop, c'est bien aussi d'assumer des opinions et des faiblesses.

Ça me donne en tout cas l'occasion de faire une petite liste de sites pour héberger du contenu "smolweb":

=> https://smol.pub/ | https://midnight.pub/ | https://rawtext.club/ | https://pages.casa/ | https://sdf.org/ | https://smolweb.org/

Sinon, duckduckgo était down l'autre jour. L'occasion de tester

=> https://nogoo.me/

ou bien une instance listée là :

=> searx.space

Culture

Une élève m'a fait découvrir les odyssées. Un podcast:

=> https://www.radiofrance.fr/franceinter/podcasts/les-odyssees

C'est censé être pour enfants.

Perso, j'apprends plein de trucs, c'est un régal de l'écouter en allant au travail.

Merci E!

Je suis censé vous apprendre des trucs, mais c'est vous chers élèves qui m'éduquez un peu chaque jour.

À ce titre, merci M de m'avoir appris le mot "paronyme", une forme d'humour à la Perceval qui m'amuse beaucoup mais dont j'ignorais l'intitulé.

Code

J'ai envie de bidouiller le code de httpd pour virer le css hardcodé et proposer plutôt une option pour préciser une feuille de style CSS à utiliser.

Écologie

À l'écoute de

=> https://www.youtube.com/watch?v=9_AStu-0KhY

j'ai eu envie de retravailler ma page "écologie populaire", si vous voulez m'envoyer de nouvelles idées, je suis preneur.

=> https://si3t.ch/misc/ecologie-populaire/

J'en ai profité pour estimer mon empreinte carbone:

=> https://nosgestesclimat.fr/

Le test est très bien fait, et suggère des solutions ensuite, et de sélectionner lesquelles nous semblent acceptables pour avoir un nouveau calcul de l'impact. C'est très encourageant, on a pour une fois le circuit de la récompense immédiate qui est sollicité.

Je vous invite à faire le test :)

J'en suis à 4,1 tonnes EqCO₂/par an!

Sans surprise, c'est ma voiture qui est le plus catastrophique! Mais tant que l'éducation nationale ne voudra pas me muter près de chez moi, je n'ai pas trop le choix... Le train met plus de temps à me conduire au travail, et je dois de toute façon emmener et aller chercher mes enfants à l'école. Quand ma clio rendra l'âme, je passerai à l'électrique, ça améliorera aussi le bilan.

Ensuite, ma consommation de viande reste trop importante. Pourtant je m'en passe bien, et mange volontiers végétarien. Cependant, pour l'instant, on garde un peu de viande dans nos repas car les petits enfants en ont besoin, même si on privilégie la volaille et les abats. On pourrait diminuer un peu plus quand même.

Ce qui me fait rire, c'est que le 3e point sur lequel je pourrais progresser, c'est la boisson! 5% de mon empreinte.

Il faut diminuer la consommation d'alcool : c'est déjà en cours.

Ensuite, remplacer le café par la chicorée : j'en ai justement racheté cette semaine. Je tiens le bon bout! :)


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=traces-1

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-05-22-bref-css-sport.txt

2024-05-22T20:35:57Z

<![CDATA[

Bon, j'ai craqué, j'ai remis du CSS sur mon site.

Heureusement, il y a w3m, lynx ou le mode lecture (ctrl-alt-R) si ça ne plaît pas.

C'est complètement piqué à causal.agency.

Ce sont les couleurs qui à mon avis correspondent assez bien à l'intérieur d'un sietch : du sable, du jaune, du marron, avec quelques notes de vert pour l'espoir de voir la nature s'épanouir et du bleu pour l'immensité du ciel.

Sinon, 2 résolutions :

  • Je me remets sérieusement au sport. Le + dur, c'est toujours la régularité...
  • Je réduis l'alcool. Ça m'aidera pour le sport, et ça ne peut pas faire de mal à la santé.

Pour ça, je tiens un calendrier où je note chaque jour sans alcool et chaque jour avec du sport. Merci Solène pour l'idée, c'est très motivant ;)


Une réaction?

Envoyez votre commentaire par mail :

=> mailto:prx@si3t.ch?subject=bref-css-sport

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-05-16-vagues-3.txt

2024-05-16T12:01:00Z

<![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 :

=> mailto:prx@si3t.ch?subject=vagues-3

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-05-13-fossil-great-self-host.txt

2024-05-13T12:51:38Z

<![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:ah@bla.si3t.ch

If you want to subscribe, write to ah+subscribe@bla.si3t.ch

]]>

https://si3t.ch/log/2024-05-10-ah-mailing-list.txt

2024-05-10T14:10:37Z

<![CDATA[

I just created a mailing list to discuss (self-) hosting experiences or questions with OpenBSD.

If you're interested, subscribe at:

ah+subscribe@bla.si3t.ch

As Usual, mlmmj is great for mailing lists.

Maybe I should setup a browsable archive one day.

Anyway, welcome if you want :)

]]>

https://si3t.ch/log/2024-05-07-xmpp-prosody-up-to-date-modules.txt

2024-05-07T09:07:56Z

<![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 :

=> mailto:prx@si3t.ch?subject=xmpp-prosody-up-to-date-modules

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-05-06-vagues-2.txt

2024-05-06T10:45:27Z

<![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 

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

=> 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 :

=> mailto:prx@si3t.ch?subject=vagues-2

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-04-06-koidneuf-1.txt

2024-04-06T14:47:21Z

<![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:

=> mailto:prx@si3t.ch?subject=koidneuf-1

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-24-mon-fils-m-a-envoye-un-courrier.txt

2024-03-24T15:11:31Z

<![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:prx@si3t.ch?subject=mon-fils-m-a-envoye-un-courrier

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-21-sloweb-part-3-whatsinthebox.txt

2024-03-21T12:32:06Z

<![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:prx@si3t.ch?subject=sloweb-part-3-whatsinthebox

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-14-sloweb-part-2-feeds.txt

2024-03-14T12:29:58Z

<![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:prx@si3t.ch?subject=sloweb-part-2-feeds

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-13-sloweb-part-1-run-cmds.txt

2024-03-13T13:42:23Z

<![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:prx@si3t.ch?subject=sloweb-part-1-run-cmds

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-12-sloweb-le-web-sans-s-essoufler.txt

2024-03-12T20:47:27Z

<![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:prx@si3t.ch?subject=sloweb-le-web-sans-s-essoufler

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-06-moi-je-pollue.txt

2024-03-06T15:53:58Z

<![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:prx@si3t.ch?subject=moi-je-pollue

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-06-comment-j-ai-perdu-un-ami.txt

2024-03-06T09:43:22Z

<![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:prx@si3t.ch?subject=comment-j-ai-perdu-un-ami

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-03-01-dune-partie-2.txt

2024-03-01T09:06:46Z

<![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:prx@si3t.ch?subject=dune-partie-2

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

]]>

https://si3t.ch/log/2024-02-28-gemfeeds-downloader.txt

2024-02-28T14:15:32Z

<![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 ;)

#!/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:prx@si3t.ch?subject=gemfeeds-downloader

Instructions

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2024-02-23-j-aimerais-que-tu-ailles-te-faire-cuire-le-cul.txt

2024-02-23T11:07:35Z

<![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,

=> J'aimerais plus ou moins que tu ailles te faire cuire le cul. | 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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2024-02-22-prise-de-note-a-l-ouverture.txt

2024-02-22T12:22:56Z

<![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.

#!/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 :

#!/bin/sh
# notd : notes of the day.
# open a new YYYY-MM-dd.txt in $NOTESDIR with $EDITOR
# Author: prx 

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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2024-02-20-sfeed-mastodon-title.txt

2024-02-20T14:03:20Z

<![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's fork Tenacity  it'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:otherthing" like this:

feed 'masto:drewdevault@fosstodon.org' 'https://fosstodon.org/@drewdevault.rss'
feed 'masto:fredg@pouet.chapril.org' 'https://pouet.chapril.org/@fredg.rss'
feed 'masto:ploum@mamot.fr' 'https://mamot.fr/@ploum.rss'
feed 'masto:noroanka@im-in.space' 'https://im-in.space/@noroanka.rss'
feed 'masto:solene@bsd.network' '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:  tags with 1px width or height.
		gsub("]*(width|height)[[:space:]]*=[[:space:]]*[\"'"'"' ]?1[\"'"'"' ]?[^0-9>]+[^>]*>", "", $4);

		print $0;
	}'
}


Comments?

Send it by mail (anonymous, add a signature if you want):

=> mailto:prx@si3t.ch?subject=sfeed-mastodon-title

Diff list instructions:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2024-02-14-generateur-mots-de-passes.txt

2024-02-14T15:20:31Z

<![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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2024-02-10-uptm-only-show-system-uptime.txt

2024-02-10T14:32:16Z

<![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 
#include 

#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:prx@si3t.ch?subject=uptm-only-show-system-uptime

Comments intructions

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2024-02-07-miroirs.txt

2024-02-07T21:24:39Z

<![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:prx@si3t.ch?subject=miroirs

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2024-01-27-turn-mastodon-followed-to-rss-list-for-sfeed.txt

2024-01-27T21:25:17Z

<![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:

#!/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:prx@si3t.ch?subject=turn-mastodon-followed-to-rss-list-for-sfeed

See instructions:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2024-01-23-update-zim-library.txt

2024-01-23T15:15:42Z

<![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

#!/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:prx@si3t.ch?subject=update-zim-library

Find instructions here:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2024-01-21-gghget-wget-pour-tous-protocoles.txt

2024-01-21T15:52:23Z

<![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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2024-01-20-repondre-toot-en-cli.txt

2024-01-20T14:49:48Z

<![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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2024-01-18-afficher-paroles-mpd.txt

2024-01-18T13:47:20Z

<![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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2024-01-14-choose-webste-appearance.txt

2024-01-14T14:55:26Z

<![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:prx@si3t.ch?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

]]>

https://si3t.ch/log/2023-12-12-mediacenter-sync-at-startup.txt

2023-12-12T10:44:44Z

<![CDATA[

Souvenez-vous: Ultra light mediacenter with alpinelinux and ranger in tty

=> https://si3t.ch/log/2023-07-30-light-mediacenter-with-alpine.txt

Désormais, quand j'allume mon mediacenter, il récupère les fichiers que j'ai déposé sur mon serveur.

C'est tout simple, j'ai simplement configuré ssh pour une identification par clé:

=> https://si3t.ch/w/doku.php?id=ah:fr:02-admin#connexion_par_cles_sans_mot_de_passe

Puis j'ai installé rsync.

Dans ~/.profile, il y a désormais :

/home/watcher/syncvids.sh
ranger ~/videos

Le script syncvid récupère les vidéos et supprime les fichiers d'origine après le transfert.

#!/bin/sh
rsync \
        -zriv \
        --progress \
        --remove-source-files \
        ledzep:/var/users-backups/watcher/videos/ \
        /home/watcher/videos/

C'est très pratique, je n'ai plus à transférer manuellement les vidéos : je les dépose tranquilou sur mon serveur, je sais qu'elle seront automatiquement récupérées et effacées le moment venu quand je voudrai les regarder.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=mediacenter-sync-at-startup

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-12-09-youtube-moins-lent.txt

2023-12-09T20:16:02Z

<![CDATA[

Dans une note récente, Timo évoque son ras-le-bol des lenteurs et pubs de youtube.

=> https://lehollandaisvolant.net/?mode=links&id=20231209142314

Youtube est effectivement pénible, surtout lorsque je dois m'en servir en classe : les élèves ont un lien à aller visiter, un petite capsule vidéo de 5 min, une autre forme de travail documentaire...

La lecture est saccadée, alors que les ordinateurs bien que modestes sont neufs.

Et puis je déteste voir des pubs, dont le contenu peut être discutable, diffusées à mon/leur insu. Point de vue éthique, mes cours en pâtissent et je supporte mal.

Contrairement à Timo, j'utilise d'autres solutions pour visionner les vidéos hébergées sur Youtube, si possible des outils libres, j'ai eu de mauvaises surprises avec des sites d'extractions de vidéos par le passé.

mpv + yt-dlp

Le lecteur de vidéos ''mpv'' permet de visionner directement la vidéo pour peu qu'on lui donne le lien.

Exemple : ''mpv https://www.youtube.com/watch?v=dQw4w9WgXcQ''

=> https://mpv.io/

Ça télécharge la vidéo avec yt-dlp''.

=> https://github.com/yt-dlp/yt-dlp

C'est cool pour moi, mais pas trop en classe.

digiview

Je décrapifie les vidéos avec l'outil digiview de ladigitale.dev :

=> https://ladigitale.dev/digiview/#/

C'est tout simple à utiliser, c'est ce que je privilégie avec mes élèves :

=> https://ladigitale.dev/digiview/#/v/6574bf745d52f

idiotbox

Un peu comme digiview, mais cette fois-ci on peut directement faire une recherche sans passer par youtube:

=> https://codemadness.org/idiotbox/

invidious

Utiliser une instance invidious rend youtube de nouveau agréable.

=> https://yewtu.be/

Mon seul souci, c'est de savoir si une instance sera toujours là dans 5 ans.

En attendant, des addons Firefox permettent de rediriger vers une instance invidious lorsqu'un lien youtube est visité.

Et dans 10 ans ?

Dans le doute, et comme pour tout sur internet, si une ressource est intéressante, je la télécharge et fait un snapshot sur archive.org.

Car comme tout le reste, un jour, Youtube va disparaître.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=youtube-moins-lent

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-12-07-bios-lenovo-update.txt

2023-12-07T12:59:05Z

<![CDATA[

D'après ''dmesg'', ça fait depuis 2015 que le BIOS n'a pas été mis à jour :

Comme j'oublie à chaque fois, voilà comment mettre à jour avec OpenBSD.

On télécharge l'iso BIOS Update depuis le site de lenovo.

Avec le port geteltorito, après l'avoir installé :

geteltorito -o biosup.img n10ur29w.iso

On copie ça sur une clé USB puis on reboot dessus. Attention, j'ai dû réactiver l'UEFI pour que ça démarre.

dd if=biosup.img of=/dev/rsd2c bs=1m

Et maintenant :

> dmesg |grep bios.*version
bios0: vendor LENOVO version "N10ET63W (1.42 )" date 07/29/2021


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=bios-lenovo-update

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-11-25-silurian.txt

2023-11-25T13:17:13Z

<![CDATA[

XCtron-34,5644 / Sol-3

Ils m'ont découvert.

Ils se nomment COSSANTS, un simple artifice qui traduit leur manque de confiance dans leur fragile nature de bipède.

La température à la surface de Gaïa augmente, ils s'en sont aperçu.

Nous sommes effectivement en bonne voie pour se débarasser de la vermine rose, même les moins intelligents d'entre eux commencent à le réaliser avec l'aide des Tritons.

Nos anciens ennemis. Ils bavardent trop.

Depuis le grand cataclysme et l'arrivée des mammifères, nous avons convenu d'une trêve. Une fois l'Homo sapiens disparu, nous pourrons de nouveau profiter des déserts brûlants.

Les Tritons retourneront dans les profondeurs des mers, là où ils devraient être.

Seuls les anciens ont quelques souvenirs de ces ages tourmentés.

Tant de révolutions ont eu lieu que même les noms se sont perdus, remplacés par la langue des bipèdes roses.

Gaïa est devenue la Terre,

Les nobles Silurians des reptiliens,

et les Tritons des bretons.

Méfiez-vous de ces derniers, leur comportement laisse à penser qu'ils jouent un double jeu.

Homo sapiens semble les aprécier.

Homo sapiens se laisse affaiblir par les cadeaux des Tritons. Autrefois hydromel, c'est maintenant toutes sortes d'alcools qui endort leur vigilance.

Comme nous, ils ont évolué et adapté leur apparence.

Vous les reconnaitrez à leur langage étrange, leur affinité pour la cartographie et leur nostalgie des histoires passées. Parfois, les plus téméraires d'entre eux osent afficher leurs lignage en conservant leur couleur capillaire naturelle : le bleu.

EOT


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=silurian

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-11-15-un-peu-de-dessert-physique-chimie.txt

2023-11-15T21:21:37Z

<![CDATA[

Habituellement, je propose à mes élèves une évaluation de rattrapage :

  • Ça évite le blocage dû au stress.
  • Ça permet de voir qu'on peut progresser, ce qui est toujours valorisant et aide à prendre conscience.
  • Ça a le mérite de faire réviser à plusieurs reprises sur une durée étalée : pour la 1ere évaluation, pendant la correction, et pour préparer le rattrapage.

Toutefois, cela doit rester facultatif : seules les personnes motivées peuvent en profiter, ce serait contre productif sinon.

Certains élèves refusent, pour au moins 3 raisons :

  • Le niveau de difficulté leur semble trop élevé, hors de leur portée (faible estime de soi).
  • L'élève n'a pas envie, faible motivation et peu d'appétit pour la matière.
  • L'élève a bien réussi et pourrait aller + loin.

Afin de répondre aux besoins de ces différents élèves, et aussi pour ne pas les laisser attendre sans rien faire pendant que leurs camarades réfléchissent à l'évaluation de rattrappage, je leur propose de réaliser une grande affiche, une planche de BD ou bien un enregistrement audio genre podcast sur un des sujets de la liste suivante :

=> https://si3t.ch/w/lib/exe/fetch.php?media=cours:un-peu-de-dessert.pdf

Pendant 30 minutes, ils ont accès à un ordinateur (si possible...) et peuvent prendre des notes sur le sujet choisi.

Il y en a pour tous les goûts, et si possible :

  • ludique
  • étonnant
  • mixte, dans le sens où on rappelle que les femmes comem les hommes ont leur place dans la recherche scientifique.

Ce dernier point fait écho à une table ronde des Utopiales sur le matrimoine scientifique.

En effet, les jeunes filles ont du mal à se projeter chercheuse, ingénieure, physicienne... Et ce n'est pas étonnant, ces métiers évoquent dans l'imaginaire collectif des vieux barbus, pas de jolies filles aux yeux pétillants d'intelligence.

À nous de changer ces à prioris : en présentant des femmes de science (car il y en a un paquet dont on ne parle pas), en faisant un effort de recherche historique pour rétablir la vérité sur la place des femmes, et écrire des récits (films, livres, séries...) avec des héroïnes intelligentes : de VRAIS personnages féminins.

Pour ma part de petit prof, j'essaie de veiller à proposer :

  • Des recherches sur des scientifiques de tous sexes;
  • Des recherches avec un nom de métier à l'écriture inclusive (NA!)
  • Des vulgarisateurices scientifiques.

J'ai eu droit à des productions d'élèves aussi épatantes qu'émouvantes. Bravo!

Qu’est-ce que cela fait d’épouser un génie ?
Allez donc demander à mon mari

(Marie Curie, évidemment).

Je suis ouvert à toutes suggestions pour de nouveaux sujets ou commentaires :)


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=un-peu-de-dessert-physique-chimie

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-11-13-txtoverssh.c.txt

2023-11-13T08:58:20Z

<![CDATA[

Voici comment j'ai mis en place un service de lecture via ssh.

La principale source d'inspiration, c'est z3bra :

=> gopher://phlog.z3bra.org/0/ssh-as-a-public-service.txt

En effet, ssh pourrait permettre tant de choses!

J'ai eu envie de faire un système de commentaire, une sorte de grand mur sur lequel chacun pourrait écrire.

Il m'est aussi venu à l'idée un système de publication, mais je ne ferai jamais mieux que prose.sh, ou alors il faudrait que j'y consacre un peu de temps

=> https://prose.sh/

(oui, c'est le genre de trucs dans mes projets)

Puis finalement, pour le fun, j'ai décidé de seulement publier mes articles et à l'avenir quelques textes plus personnels que je souhaite garder un peu plus discrets. Déjà, ça sera pas mal.

Je suis donc parti sur :

  • Un chroot ssh
  • Un utilisateur dédié et l'instruction ForceCommand pour qu'il ne puisse pas faire n'importe quoi
  • Du C pour profiter d'unveil et pledge, et surtout parce que avec le shell on n'est jamais totalement sûr de bien tout sécuriser pour s'assurer qu'un utilisateur ne va pas s'échapper.

Au final, l'outil s'appelle txtoverssh.

Configuration de SSH

On crée une section rien que pour l'utilisateur "lire"

Match User lire
        ChrootDirectory /home/lire
        Banner /home/lire/banner.txt
        DisableForwarding yes
        PubkeyAuthentication no
        PasswordAuthentication yes
        MaxAuthTries 2
        MaxSessions 2
        ChannelTimeout session:*=15m
        UnusedConnectionTimeout 15m
	PermitTTY no
        ForceCommand bin/txtoverssh /dossier1 /dossier2 
  • ChrootDirectory précise le dossier dans lequel l'utilisateur est enfermé.
  • Banner permet d'afficher le contenu d'un fichier avant l'invite pour le mot de passe. Il faut préciser le chemin entier, pas relatif au chroot.
  • DisableForwarding pour plus de tranquilité
  • PubkeyAuthentication et PasswordAuthentication c'est pourr forcer la demande d'un mot de passe
  • MaxAuthTries et MaxSessions c'est pour plus de tranquilité.
  • ChannelTimeout et UnusedConnectionTimeout pour fermer une connexion inactive. Ça ne se comporte pas comme je pense, mais ça fait du nettoyage quand même.
  • PermitTTT no évite d'avoir à créer des devices avec mknod ou d'avoir des messages d'erreur dans les logs.
  • ForceCommand appelle le fichier bin/txtoverssh qu'il faudra mettre dans le chroot. Il ira chercher des fichiers dans les dossiers appelés "dossier1" et "dossier2". Ces dossiers sont en réalité "/home/lire/dossier1" et "/home/lire/dossier2".

Pour préparer le chroot, il faudra au moins un dossier pour les binaires et pour le device tty:

chown root:wheel /home/lire
mkdir -p /home/lire/bin
cp /bin/sh  /home/lire/bin/

Pour savoir si quelqu'un accède au service de lecture, on peut créer un fichier /etc/ssh/sshrc qui enverra un mail à l'admin.

Je ne l'ai pas mis en place puisque de toute façon, txtoverssh logge dans /var/log/daemon ce qui est lu.

#!/bin/sh

if [ "$USER" == "lire" ]; then
        echo "User $USER just logged in from $SSH_CONNECTION" |\
	    mail -s "$USER connected" root
fi

Commentaire du code txtoverssh

Comme indiqué plus haut, txtoverssh est écrit en C.

Je le compile avec le flag "-static" puisqu'il est lancé dans un chroot et que ça me prend la tête de copier au bon endroit les bouts de bibliothèque nécessaires.

On va commencer avec les options. Rien de bien farfelu:

	/* parse options */
	while ((opt = getopt(argc, argv, "re:")) != -1) {
		switch (opt) {
		case 'r':
			recursive = 1;
			break;
		case 'e':
			esnprintf(ext, sizeof(ext), "%s", optarg);
			break;
		default:
			usage();
		}
	}

On peut y voir que txtoverssh va accepter les options "-r" pour scanner récursivement, on change la valeur de la variable recursive le cas échéant, et l'option "-e" pour changer l'extension des fichiers qui seront à proposer à la lecture.

À cette occasion, on appelle la fonction esnprintf, une variante de snprintf que je prévère à strlcpy et strlcat car elle permet de faire la même chose que ces 2 fonctions à elle toute seule tout en vérifiant que la chaîne est correctement terminée.

/* build string and end it with \0
 *  usage : esnprintf(str, sizeof(str), "%s ... %s", arg1, arg2);
 */
size_t
esnprintf(char *str, size_t size, const char *format, ...)
{
        va_list ap;
        size_t ret = 0;

        va_start(ap, format);
        ret = vsnprintf(str, size, format, ap);
        va_end(ap);
        if (ret < 0 || ret >= size)
                err(EXIT_FAILURE, "vsnprintf: Output trunkated");

        return ret;
}

Après avoir vérifié les options, on décale argc et argv pour pouvoir lire la liste des dossiers à scanner dans argv.

Si aucun dossier n'est précisé, on affiche l'aide.

	argc -= optind;
	argv += optind;

	if (argc == 0)
		usage();

Au départ, j'avais tout hardcodé dans un config.h, mais les options, c'est quand même nettement plus pratique.

Juste après, on sécurise le bouzin: pour chaque dossier précisé, on n'autorise que la lecture de fichiers et des opérations stdin/stdio avec pledge:

#ifdef __OpenBSD__
	for (size_t i=0; i

Tout de suite, on se sent mieux. On en viendrait presque à se demander si le chroot est bien nécessaire ^^

Pour la suite, je présente une structure qui me permettra de stocker les informations sur les fichiers disponibles un peu comme une liste en python. J'aurais pu faire un tableau, mais au lieu de tout réinventer et pour apprendre à m'en servir, autant profiter de queue.h.

struct Page {
	int id;
	char title[256];
	char filename[FILENAME_MAX];
	char path[PATH_MAX];
	SIMPLEQ_ENTRY(Page) page;
};
SIMPLEQ_HEAD(Page_head, Page);

Cette structure est donc initialisée comme l'indique la doc:

	SIMPLEQ_INIT(&Pageh);

On va scanner tous les dossiers passés en argument:

	for (size_t i=0; i

La fonction list_entries ne fait qu'appeler scandir():

void
list_entries(const char *path, struct Page_head *Pagehead)
{
	int n	                         = 0;
	int id	                         = 0;
	struct dirent **namelist	 = NULL;
	char fullpath[PATH_MAX] 	 = {'\0'};
	struct Page *new_page	         = NULL;
	struct Page *pp	                 = NULL;
	
	if (!SIMPLEQ_EMPTY(Pagehead))
		SIMPLEQ_FOREACH(pp, Pagehead, page)
			if (pp->id > id)
				id = pp->id;

	if ((n = scandir(path, &namelist, NULL, alphasort)) < 0) {
		err(EXIT_FAILURE, "Can't scan %s", path);
	} else {
		for (int j = 0; j < n; j++) {
			/* skip self and parent */
                        if ((strcmp(namelist[j]->d_name, ".") == 0) ||
			    (strcmp(namelist[j]->d_name, "..") == 0)) {
				    continue;
			}

			/* create full path */
			esnprintf(fullpath, sizeof(fullpath), "%s/%s",
			    path, namelist[j]->d_name);

			if ((recursive) && (namelist[j]->d_type == DT_DIR)) {
				/* list sub directory */
				list_entries(fullpath, Pagehead);

			} else if (endswith(namelist[j]->d_name, ext)) {
				/* create new page entry */
				if ((new_page = malloc(sizeof(*new_page))) == NULL)
					err(EXIT_FAILURE, "malloc");

				/* store page data */
				id++;
				new_page->id = id;

				esnprintf(new_page->filename,
				    sizeof(new_page->filename),
				    "%s",
				    namelist[j]->d_name);

				esnprintf(new_page->path,
				    sizeof(new_page->path),
				    "%s",
				    fullpath);

				get_title(fullpath,
				    new_page->title,
				    sizeof(new_page->title));

				SIMPLEQ_INSERT_TAIL(Pagehead, new_page, page);

			}

			free(namelist[j]);
		}

		free(namelist);
	}
}

Pas vraiment de choses intéressantes ici, si ce n'est qu'on fait une récursion sur les dossiers si on a activé l'option récursive.

esnprint permet d'enregistrer simplement le chemin complet vers les fichiers.

Ainsi, ensuite, on peut les enregistrer dans notre liste chainée.

On récupère le titre des pages avec la fonction get_title.

Cette dernière considère que la première ligne du fichier, c'est le titre. On la récupère avec fgets() et on enlève le retour à la ligne final (sauf si le titre est trop long, et dans ce cas tronqué).

void
get_title(const char *path, char *title, size_t titlesiz)
{
	size_t nread = 0;
	FILE *fd = NULL;

	if ((fd = fopen(path, "r")) == NULL)
		err(EXIT_FAILURE, "can't open: %s", path);

	if (fgets(title, titlesiz, fd) == NULL)
		err(EXIT_FAILURE, "can't read: %s", path);

	title[strcspn(title, "\r\n")] = '\0'; /* remove newline */

Ensuite, on va virer les "#" et espaces souvent présents au début de mes lignes de titre avec memmove()

	/* delete leading "#" if any */
	/* while ((title[0] == '#') || (title[0] == ' ')) */
	while ((strpbrk(title, "# ") == title)) 
		memmove(title, title+1, strlen(title));

J'ai indiqué ici 2 façons de faire la même chose : soit on vérifie que le premier caractère de la chaîne est un "#" ou un " ", soit on appelle strpbrk qui retourne la position du premier caractère trouvé dans la chaîne passée en argument, ici "# ".

Le cas échéant, on décale la chaîne d'un cran vers la gauche.

Après avoir récupéré ces informations, on les affiche à l'écran avec show_page_list:

void
show_page_list(struct Page_head *Pageh)
{
	struct Page *pp	        = NULL;

	/* display available pages */
	SIMPLEQ_FOREACH(pp, Pageh, page)
		printf("#%d - %s\n", pp->id, pp->title);
}

On va afficher cette liste tant qu'une variable selection est égale à 0 :

	while (selection == 0) {
		show_page_list(&Pageh);

On va donc demander à l'utilisateur d'entrer son choix. Pour cela, j'ai un peu cherché.

Au départ, je récupérais du texte, ça permettait de faire un strstr() sur chaque page et afficher les résultats correspondants, un peu à la dmenu.

C'était finalement peu pratique si on voulait juste quitter avec "q" : est-ce quitter ou bien chercher tous les fichiers avec un titre contenant la lettre "q"?

Ensuite, j'ai pensé à récupérer juste l'id du fichier, un nombre, avec scanf. Là encore, mauvaise idée, pas moyen de quitter en entrant une lettre comme "q".

Finalement, un fgets est ce qu'il y a de mieux : on peut récupérer n'importe quel texte.

		if (fgets(buf, sizeof(buf), stdin) != NULL)
			buf[strcspn(buf, "\n")] = '\0';
		else
			err(EXIT_FAILURE, "can't read input");

On vérifie si c'est une demande pour quitter, et on arrête tout si oui :

		if (strcasecmp(buf, "q") == 0) {
			selection = -1; /* != 0  to leave loop */
			continue;

Sinon, on va transformer l'entrée de l'utilisateur en nombre. Pour ça, strtonum est tout indiqué :

	selection = (int)strtonum(buf, 1, INT_MAX, NULL);

Ici, strtonum tranforme buf en long long. Donc on caste le résultat avec (int).

On accepte les valeurs entre 1 et INT_MAX : le maximum possible pour un int, ça devrait être bien suffisant dans mon cas.

Notez qu'il ne peut pas y avoir de "0".

Si au contraire strtonum retourne 0, c'est qu'il y a eu une erreur de saisie : il faut donc recommencer. Voilà pourquoi je ne récupère pas le message d'erreur et passe à la place NULL à strtonum.

Ensuite, on va chercher le fichier correspondant et l'afficher, sans oublier de remettre selection à 0 pour proposer d'afficher une autre page:

			SIMPLEQ_FOREACH(pp, &Pageh, page)
				if (pp->id == selection) {
					syslog(LOG_DAEMON,
					     "Someone read %s", pp->path);
					clear();
					puts(PRINT_INSTRUCTIONS);
					print_txt_file(pp->path);
				}

			selection = 0; /* start again */
		}

Reste à voir la fonction print_txt_file.

Cette dernière va lire le fichier ligne par ligne et l'afficher.

Cependant, pour éviter de remplir l'écran d'un coup et obliger à scroller, on va permettre au lecteur de quitter avec "q" ou bien d'afficher la suite avec Entrée :

	if ((fd = fopen(path, "r")) == NULL)
		err(EXIT_FAILURE, "can't open: %s", path);


	while ((c = getc(fd)) != EOF) {
		if (c == '\n') {
			if (getchar() == 'q')
				break;
		} else {
			putchar(c);
		}
	}

	fclose(fd);
	if (ferror(fd))
		err(EXIT_FAILURE, "error when reading or closing %s", path);

Oui, juste "getc()" sufffit.

Et pourquoi pas curses.h ?

Ça pourrait être bien en effet.

C'est pour si un jour je faire quelque chose de plus complet avec davantage de services que la lecture. En attendant, la plupart des terminaux permettent de scroller, et sinon, il y a tmux 👼.

Où sont les sources?

Un petit mail, et hop, je vous les envoie en réponse ;)


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=txtoverssh.c

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-11-09-si3tch-ssh-service.txt

2023-11-09T12:43:36Z

<![CDATA[

Depuis peu, vous pouvez lire les articles et histoires du si3tch via ssh:

ssh lire@si3t.ch

Le mot de passe à indiquer est simplement "ami".

J'avais envie de mettre ça en place depuisun petit moment.

Ça ne sert à rien, mais ça m'a amusé de développer ça.

L'interface est minimaliste et restreinte, c'est à la fois voulu et un compromis de temps que je souhaite y consacrer.

J'ai configuré un Chroot en ssh et fait appel à l'instruction ForceCommand pour plus de sûreté.

Au départ, j'étais parti sur un script shell.

Cependant, c'est assez pénible de préparer le chroot pour ça, il faut copier chaque petit outil comme cat, awk, sed... Et ppour ceux qui en ont besoin, il faut aussi copier les bibliothèques (les *.so).

Sans compter sur le fait que chacun de ces petits outils est à appeler avec un maximum de précautions (variable LESSECURE pour less par exemple).

Bref, chiant, et trop risqué de laisser passez une bêtise.

Je me suis donc rabattu sur du C, compilé avec '-static' pour intégrer les libs, et profitant de unveil et pledge.

J'expliquerai dans un prochain article comment c'est codé.

En attendant, vous pouvez lire l'excellent article suivant parlant de la mise ne place de services via ssh :

=> gopher://phlog.z3bra.org/0/ssh-as-a-public-service.txt


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=si3tch-ssh-service

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-24-plaintext.txt

2023-10-24T12:21:23Z

<![CDATA[

Le texte brut, ou plaintext, plus j'y pense, plus je l'apprécie :

  • C'est ce qui semble le plus pérenne. Même moi, je pourrais écrire un lecteur de fichier texte.
  • Dans 10 ou 20 ans, ça sera toujours lisible contrairement aux autres formats.
  • C'est léger. Très léger. Un fichier contenant seulement "Coucou" au format txt pèse 7B tandis qu'il pèse 4,9KB au format docx.
  • On lui donne la forme qu'on veut. VRAIMENT. On n'est finalement pas contraint par toutes les formes typographiques.
  • Certains verront ça comme un inconvénient, mais il n'y a pas de choix de polices interminables. En réalité, c'est le lecteur qui va choisir sa police favorite, est c'est aussi bien pour la lisibilité.
  • C'est finalement très accessible, un lecteur d'écran peut s'en sortir sans trop de problème.
  • Les contraintes imposées par ce format minimaliste impose davantage de réflexion et finalement favorise la création d'un texte plus structuré et peut-être plus lisible.

Voici les "règles" que je me donne pour écrire correctement du texte brut.

Comme vous le constaterez très vite, c'est très largement inspiré du gemtext:

gemini://geminiprotocol.net/docs/gemtext-specification.gmi

https://geminiprotocol.net/docs/gemtext-specification.gmi

Les titres

Je préfère des titres en forme de lignes précédées d'un ou plusieurs "#". C'est pratique à écrire, même si c'est moins joli que les propositions qui suivront.

# niveau 1
## niveau 2
### niveau 3
#### niveau 4
...

On peut tout à fait aussi préférer souligner les titre avec des "===" ou des "---" voire des "...", mais cela limite à avoir 3 niveaux seulement :

niveau 1
========

niveau 2
--------

niveau 3
........

Enfin, comme pour dokuwiki, on peut choisir d'encadrer les titres par des symboles "=" ou "#". Plus il y a de symboles, plus le titre est important:

====== niveau 1 ======
===== niveau 2 =====
==== niveau 3 ====
...

Ce dernier format est chouette aussi, il est plus esthétique que le premier, mais restreint à 6 niveaux maximum (qui voudrait de + ???). Déjà, 3, c'est bien!

Quoi que l'on choisisse, il faut rester cohérent dans un même document.

Les morceaux de code

Rien de très original, on met le code entre "```", ou entre rien du tout tant qu'on l'annonce avant:

#include 

int 
main(int argc, char *argv[])
{
	return 0;
}

Les listes

Une liste, c'est une série de lignes commençant par "*" :

  • item 1
  • item 2
  • item 3

Une liste numérotée, on ne change pas de symbole. Il suffit d'ajouter le numéro :

  • 1 : premier item
  • 2 : 2 item
  • 3 : et un troisième

Les liens

Un lien doit être simple à copier/coller : il sera seul sur sa ligne.

Un lien doit être facilement identifiable. On peut si on le souhaite le précéder de "=>" comme en gemtext, ou bien d'un alinéa (tabulation). Je préfère cette dernière solution, car c'est parfois pénible de sélectionner le lien avec "=>" devant.

Un lien doit être décrit : la description sera sur la ligne/paragraphe précédent(e).

Voici un exemple de lien:

https://ceciestunexemple.pwet

Mises en évidence.

Pour mettre des mots ou du texte en évidence, je pense qu'encadrer du texte avec "**" ou "__" voire "//" rend la lecture plus difficile.

À la place, on peut simplement utiliser des MAJUSCULES.

Ça évite le mélange gras/souligné/italique insupportable et fatiguant. Qu'est-ce qui est important entre les 3 ?

Pour distinguer les niveaux d'importance, c'est à l'auteur de mettre son texte en forme, de créer des paragraphes dédiés, de réfléchir.

Citations

Pourquoi pas?

Hors contexte, ça na guère de sens. Il faut préciser l'auteurice par exemple.

Liberté

Chacun est libre de mettre son texte en forme comme il le souhaite.

Ajouter de l'ascii art.

Écrire des paragraphes longs, des lignes courtes...

Marquer de longues pauses:

Certains clients mails mettent en forme les citations, et aussi les séparations:


C'est comme chacun le souhaite.

On peut d'autant plus innover avec l'immense grand nombre de caractères utft8.

Liens

Pour finir, voici 2 textes qui vont encouragent l'utilisation du texte brut avec des exemples :

Un blog tout en txt:

https://www.curiositry.com/blog.txt

WRITING FOR THE INTERNET ACROSS A HUMAN LIFETIME:

https://web.archive.org/web/20211025182333/https://len.falken.ink/misc/writing-for-the-internet-across-a-human-lifetime.txt


Une réaction?

Envoyez votre commentaire par mail (anonyme):

mailto:prx@si3t.ch?subject=plaintext

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

https://si3t.ch/log/_commentaires_.txt

]]>

https://si3t.ch/log/2023-10-23-onion-all.txt

2023-10-23T15:33:03Z

<![CDATA[

Puisque les services cacnés en ".onion" apportent des avantages certains en terme de bie privée et de chiffrement, je les apprecie beaucoup.

Qui plus est, ces liens sont des noms de domaines alternatifs viables qui ne dépendant pas d'un serveur de nom et encore moin d'un registrar. Dit autrement, si un jour je ne pouvais plus réserver le domaine "si3t.ch" pour une raisons ou une autre (trop cher, l'extension .ch n'est plus disponible, la suisse devient nazie...), les ".onions" seront toujours les même.

J'avais déjà des services cachés pour la version web et gopher de mon site.

Configurer un onion Tor (http)

=> https://si3t.ch/w/doku.php?id=ah:fr:09-services#configurer_un_service_cache_tor

Configurer un onion Tor (gopher)

=> /log/2023-10-11-gopher-onion.txt

Ne manquait plus que la version gemini, que j'avais déjà configurée il y a quelques temps déjà avant de délaisser un peu ce protocole.

Bien qu'il ne soit toujours pas officiel, une discussion avec Solène m'a rappelé pourquoi il reste digne d'intérêt : utf-8 par défaut, liens relatifs, et le gemtext c'est vraiment chouette.

Et puisqu'il ne pourra devenir vraiment répandu que si on l'utilise, je l'ai réactivé et par la même occasion souhaite garder ici quelques notes pour la mise en place d'un onion Tor pour gemini.

Tout d'abord, dans /etc/tor/torrc, on ajoute un service caché.

HiddenServiceDir /var/tor/hidden-gemini/
HiddenServicePort 1965 localhost:11966

Dans /var/tor/hidden-gemini/hostname, j'ai retrouvé le même .onion que la dernière fois \o/

Vous aurez peut-être noté que tor va écouter sur le port gemini par défaut 1965 et va renvoyer en local sur le port 11966. C'est pour le support des certificats TLS.

En effet, bien qu'un service caché onion soit déjà chiffré, gemini ne fonctionne qu'au travers d'une connexion TLS réussie : sinon, le client renvoie une erreur. Le client peut d'ailleurs par ce biais s'identifier avec une empreinte (pas de mots de passe, c'est plus fort).

Par conséquent, j'ai une nouvelle section dans /etc/relayd.conf pour gérer les accès via Tor sur le port 11966:

ext_ip4 = "192.168.1.5"
ext_ip6 = "2a01:e0a:2b8:ca70::1bad"

prefork 10
log connection
log state changes

tcp protocol "gemini" {
        tls keypair si3t.ch-self
}

relay "gemini4" {
        listen on $ext_ip4 port 1965 tls
        protocol "gemini"
        forward to localhost port 11965
}
relay "gemini6" {
        listen on $ext_ip6 port 1965 tls
        protocol "gemini"
        forward to localhost port 11965
}
relay "geminitor" {
        listen on localhost port 11966 tls
        protocol "gemini"
        forward to localhost port 11965
}

Les deux premiers relays, c'est comme dans la documentation pour vger:

=> https://tildegit.org/solene/vger

J'ai juste fait en sorte de pouvoir gérer l'ipv6 avec "localhost":

=> https://si3t.ch/w/doku.php?id=ah:fr:09-services#gemini_vger

C'est la dernière section "geminitor" qui est importante ici : elle renvoie les accès en localhost sur le port 11966 vers le port 11965 après avoir introduit le certificat si3t.ch-self.

En effet, et c'est important, l'url en ".onion" doit être indiquée dans le certificat.

Pour cela, il faut générer un certificat avec ssl et indiquer un "subject alt name". D'après ssl(8), il faut utiliser l'option -extfile server.ext.

Pour mon cas, j'ai inscrit dans le fichier server.ext:

subjectAltName=DNS:si3t.ch,DNS:b2khgkvb2wn4avjshjp63kknsjwikgwff5dwwydldia6qwf4kdnueyad.onion

Et généré le certificat pour 100 ans:

openssl genrsa -out /etc/ssl/private/server.key 4096
openssl req -new -key /etc/ssl/private/server.key \
     -out /etc/ssl/private/server.csr
openssl x509 -sha256 -req -days 36500 \
	-in /etc/ssl/private/server.csr \
	-signkey /etc/ssl/private/server.key \
	-extfile /etc/ssl/server.ext \
	-out /etc/ssl/server.crt

Et voilà!

Vous trouverez donc à la racine de mon site un fichier "onions.txt" qui recense les différentes urls permettant de joindre mon serveur.

=> http://si3t.ch/onions.txt | https://si3t.ch/onions.txt | gopher://si3t.ch/0/onions.txt | gemini://si3t.ch/onions.txt | http://6gvb6fzoxv72mtlpvr2fgj7ytpeggwuerdawspt24njlkwfxir6jncid.onion | gopher://of2w2p5f4hsslk63hmo6tid6r7inhlxuxviq4pb5cxg45enswpbrfjad.onion | gemini://b2khgkvb2wn4avjshjp63kknsjwikgwff5dwwydldia6qwf4kdnueyad.onion


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=onion-all

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-21-nethack-16.txt

2023-10-21T10:27:09Z

<![CDATA[

Hello prx, welcome to NetHack! You are a lawful male human Monk.

Je recommence en tant que moine. NINJA!

Dans mon inventaire, j'ai un parchemin de détection de nourriture... Ça donnera des indices j'imagine.

Oh, et mon livre de sort c'est pour lancer "protection". Cool, ça compensera le manque d'armure.

Cette fois-ci, je suis accompagné d'un chien. Très vite, ce dernier m'abandonne et file buter des monstres loin de moi... Que c'est pénible de ne pas pouvoir appeler son animal de compagnie :/

Je décide de ne plus perdre mon temps à le retrouver et file vers le prochain escalier. J'écrase un triton sur le et trouve un ouvre-boîte en-dessous :). Une fois près de l'escalier, mon chien réapparaît. Je vais lui donner un petit nom tiens :

What do you want to call the little dog? Gaby

À peine au niveau 2, j'ai déjà trouvé 3 baguettes magiques. C'est la partie des baguettes!

Et un sifflet aussi, peut-être que ça m'aidera à rappeler Gaby!

Au niveau 4, je retrouve une fourmi, je vais prendre ma revanche cette fois! Sans oublier mon armure magique ;)

Un peu plus loin : un commerce! Chouette, il était temps!

J'y trouve un parchemin à pas cher que j'ai déjà dans mon inventaire : j'espère que c'est bien un parchemin d'identification... Hé ben non, c'est un parchemin de téléportation ^^

J'ai une autre paire de parchemins, au moins cette fois c'est la bonne, je peux identifier des chose :) Ça me permet de revendre un scroll of punishment :)

À peine arrivé au niveau 5, mon chien file se défouler et je trouve juste à côté une pièce pleine de monstres.

You enter an opulent throne room!

Décidément, j'ai de la chance!

Bon, je tente ma chance hein ! Mon chien est de retour, je lance mon sort de protection, et zou!

Résultat :

Dlvl:5 $:237 HP:50(50) Pw:33(36) AC:2 Xp:6 Hungry

Bon évidemment, je tombe nez à nez avec un leprechaun à la pièce suivante . GRRR

Et mon chien qui a encore disparu...

Je tente de déposer mon or un peu plus loin pour faire face au leprechaun... Celui-ci me contourne, et vole mon or posé un peu plus loin, je suis ruiné! Un autre est dans ma ligne de mire mais s'échappe rapidement. Décidément, c'est compliqué de faire face à ces lutins.

Un peu plus loin, j'en retrouve un : je l'assaille de ma baguette de "strike" et finit par récupérer 300 pièces. Yay!

Je continue ma recherche et retrouve le 2e. Ce dernier recoit un petit boomegang en pleine face, bien visé mon gars! Il s'enfuit et tombe dans un piège : sprotch, écrabouillé par un boulet!

Niveau 6, j'y découvre de nouveaux monstres : un rat-garou, un homonculus. Changement d'ambiance, ce n'est plus les petits tritons.

Au niveau 7, un singe me vole ma robe! Non mais sans dec'! C'est à poil que je l'écrabouille! Na! Dans ce niveau, ça regorge d'orcs! Yaaa!

Un yéti me met la misère. Je bois toutes mes potions de soin pour l'affronter et descent avec plusieurs sorts mon AC à -2. ouf!

En voulant ouvrir un coffre, j'équipe un sabre qui semble maudit, impossible de le retirer. Je n'ai plus qu'à tester tous mes parchemins encore non identifiés... Il y en a trop de toute façon.

Je découvre ainsi les parchemins de lumière, de magic mapping et au 3e essai d'enchant weapon (ou de remove curse). Cool!

Emballé par ces découvertes, j'en tente un autre : mes potions explosent, mes parchemins brûlent, mon livre de sort brûle, ma robe brule et il me reste 3 points de vie... Woah, c'était chaud!

J'essaie de récupérer mais des monstres ne cessent de réapparaître. Galère. J'ai beau me démener, je finis par succomber aux multibles attaques de poneys (oui...) et d'un jaguar.

                   ----------

                  /          \

                 /    REST    \

                /      IN      \

               /     PEACE      \

              /                  \

              |       prx        |

              |      623 Au      |

              |   killed by a    |

              |      jaguar      |

              |                  |

              |                  |

              |       2023       |

             *|     *  *  *      | *

    _________)/\\_//(\/(/\)/\//\/|_)_______

Goodbye prx the Monk...

You died in The Dungeons of Doom on dungeon level 6 with 5265 points,

and 623 pieces of gold, after 3987 moves.

You were level 7 with a maximum of 55 hit points when you died.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=nethack-16

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-20-nethack-15.txt

2023-10-20T15:03:32Z

<![CDATA[

Cette fois, je recommence en tant que Monk, j'aime bien cette classe et je veux ma revanche!

Hello prx, welcome to NetHack! You are a neutral male human Monk.
Be careful! New moon tonight.

Ça commence bien...

Cette fois-ci, je jette un oeil à mon inventaire : j'y découvre un "scroll of punishment", le genre de trucs que je vais revendre au plus vite et que je suis bien content d'avoir identifié.

Le gros boulet que je suis ne savais pas que j'avais un livre de soin, ce qui semble assez logiue pourtant pour un moine. Il y a aussi une lampe à huile tiens :)

Bref, allons-y!

Au niveau 2, je dois sonder pour trouver mon chemin. Je gagne un peu d'expérience au combat, et entend tinter au loin des pièces : un commerce doit être proche. Pas moyens de mettre la main dessus cependant!

Au niveau 3, un corps traîne au sol juste à côté de l'escalier. Muhahaha, je ne m'y ferai pas prendre cette fois : je vérifie si un piège est en-dessous.

You know of no traps there.

\o/ cool, je vais dessus :

An arrow shoots out at you! You are almost hit by an arrow.

Bon, je m'y prends mal apparemment :/ Il ne faut pas utiliser "#untrap" mais "s".

Au niveau 4, je découvre un marchand de parchemins et de livres. Au milieu des pages, un mimic me grignote les orteils, mais j'en fait de la patée pour chat! Je découvre ici un parchemin pas trop cher en espérant que ce soit un parchemin d'identification et revent pour 150 pièces d'or mon parchemin de punishment. Yay, bingo! Du coup j'achète tous les autres parchemins d'identification dans la foulée, il me reste même 81 pièces \o/

J'en profite pour identifier un max de trucs dans mon inventaire: j'y avais un anneau de téléportation maudit, j'ai bien fait de ne pas l'enfiler! Il y a aussi une potion maudite de lévitation, le genre de trucs dont on se passerait bien... Enfin, j'identifie un parchemin maudit de magic mapping, le truc qui permet de connaître tout un niveau. Mais... maudit??? Ça change quoi ? J'oublie tout un niveau à la place? Je préfère m'abstenir ^^

Un peu plus loin, au milieu d'un couloir, je tombe nez à nez avec un floating eye. Oh non, pas ça!!! Je tente d'utiliser une baguette magique non identifiée : je n'ai pas mieux, ou alors un parchemin de feu, mais invoquer une grosse explosion au milieu d'un minuscule couloir, bof!

The floating eye turns transparent!

Je ne sais pas si c'est une bonne idée... Parce que du coup, je ne le vois plus, donc je ne suis plus paralysé en théorie. Mais par contre, il peut me taper à sa guise : je fuis!

Après quelques tours, je me rend invisible et retourne tuer l'oeil... Autant vous dire qu'heureusement, mon chat était là, je me suis quand même trouvé paralysé (le boulet).

Un peu plus loin, un leprechaun me vole tout mon or! NOOON ! Impossible à éviter en plus le bougre! Tant pis, il faudra faire sans...

Un peu plus loi je manque de peu de perdre mon chat, celui-là va un peu n'importe où... Du coup je perds un temps fou à aller le chercher... Je n'ai pas trouvé dans l'aide comment l'appeler.

J'ai l'impression de ne pas trop mal me débrouiller pour l'instant:

Prx the Novice St:18/04 Dx:13 Co:11 In:10 Wi:14 Ch:9 Neut
Dlvl:6 $:18 HP:34(34) Pw:30(30) AC:2 Xp:5

Au niveau 7, je croise la route d'un golem doré, il tape fort celui-là !

Je prend la fuite avant de décéder.

Un peu plus loin, je tombe sur un véritable zoo! Tout un tas de créatures, qu'on ne peut malheureusement pas adopter, mais qu'il va falloir dégommer pour récupérer les trésors en-dessous. Ça prend du temps, je préfère jeter des flèches plutôt que me retrouver encercler... Et le golem doré rôde toujours. Centaure, nymphe, nain shaman, orc... Il y a même une licorne XD.

Au final, j'ai récupéré un trésor considérable, plus de 1000 pièces d'or!!! Je file donc dépenser tout ça dans un des précédents commerce.

En chemin, je suis coincé dans une embuscade avec des fourmis qui tapent fort! À croire que l'or les attire oO.

Et bien évidemment, idiot que je suis, enthousiasmé par ce bon début de partie et les poches pleines de pièces, j'en oublie de faire appel à Elbereth ou même de lancer un sort de soin...

                   ----------

                  /          \

                 /    REST    \

                /      IN      \

               /     PEACE      \

              /                  \

              |       prx        |

              |     1301 Au      |

              |   killed by a    |

              |   soldier ant    |

              |                  |

              |                  |

              |       2023       |

             *|     *  *  *      | *

    _________)/\\_//(\/(/\)/\//\/|_)_______

Goodbye prx the Monk...

You died in The Dungeons of Doom on dungeon level 6 with 3949 points,

and 1301 pieces of gold, after 3564 moves.

You were level 6 with a maximum of 36 hit points when you died.

Être riche, ça peut être dangereux? Moins que d'être étourdi.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=nethack-15

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-19-nethack-14.txt

2023-10-19T21:24:29Z

<![CDATA[

Allez cette fois, je fais vraiment gaffe!

Hello prx, welcome to NetHack! You are a chaotic female human Monk.

Un rôle que je ne connaîs pas du tout, ça fait envie. Je me sens déjà être une sorte de ninja en robe hyper fit et intelligente!

Je trouve rapidement une grande boîte, impossible à ouvrir sans outils pour l'instant.

Être moine c'est trop cool, je dégomme tout ce qui passe sans soucis.

Bon par contre, même en étant chaotique, ça ne semble pas bon pour mon karma de manger des cadavres O:)

Je trouve un petit commerce en passant. Beaucoup de choses à manger, je dois m'en rappeler pour plus tard : boîte à ouvrir, commerce à manger :)

D'ailleurs, dès le niveau 3, un hobbit laisse tomber par inadvertance une dague lorsqu'il décède. Hop, direction le niveau 1 pour ouvrir la boîte :)

J'ytrouve 3 parchemins, un livre et une baguette magique. Pour l'instant, leurs effet est inconnu. Je tente de lire le livre pour voir, il se tranforme en poussière et je me sens menacé... Ça ira comme ça hein ;)

Je retourne dans les mines au lieu du niveau 3 classique pour tester ma baguette : ça tue un gnome direct! oO C'est une baguette de "striking".

Par contre mon petit chien se fait écrabouiller par un rocher dans un piège des mines. Snif!

Je gagne vite de l'expérience dans les mines, trouve des chaussures, de quoi un peu progresser en tant que moine.

Les mines me mettent vite en danger à partir du 2e niveau, je choisis de remonter explorer le donjon sans mourir ^^.

Par contre, la nourriture se fait rare... Je vais vite remonter au niveau 2 acheter à manger à ce rythme. Cependant, un boulet me barre la route puisqu'un montre se trouve derrière :s. Heureusement, la "wand of striking" l'éclate vite fait. Niark! Je remontre acheter quelques fruits, je n'ai pas encore assez d'argent pour des rations complètes.

Au niveau 4, je trouve une nouvelle boîte. Après l'avoir crochetée, je me fais engloutir par des flammes en l'ouvrant : c'était un vilain piège!!! Mes gants brûlent :s.

Quelques pièces plus loin, je tombe nez à nez face à un oeil flottant!!!

Impossible de fuir, je suis paralysé.

Et ce con invoque des trucs qui me frappent en tous sens!!!

Aaargh, ça semblait si bien partiiii!!

                   ----------

                  /          \

                 /    REST    \

                /      IN      \

               /     PEACE      \

              /                  \

              |       prx        |

              |      31 Au       |

              |   killed by a    |

              |      manes       |

              |                  |

              |                  |

              |       2023       |

             *|     *  *  *      | *

    _________)/\\_//(\/(/\)/\//\/|_)_______

Goodbye prx the Monk...

You died in The Dungeons of Doom on dungeon level 4 with 1262 points,

and 31 pieces of gold, after 2006 moves.

You were level 5 with a maximum of 32 hit points when you died.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=nethack-14

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-18-nethack-13.txt

2023-10-18T15:38:53Z

<![CDATA[

Salutations prx, welcome to NetHack! You are a lawful male human Knight.

Tiens, je suis un chevalier. Ça va changer un peu. Pas trop besoin de réfléchir à priori : on fonce et on tape. :)

Bon, je dois juste me souvenir de ne pas tenter de monter sur mon poney, la dernière fois que j'ai tenté un truc du genre en début de partie, je suis mort en tombant de la selle XD.

À la 3e pièce du donjon, je fonce bêtement dans un piège : je devrais vraiment prendre le temps de regarder ce qui est au sol avant d'y aller. Il y avait au sol un elfe mort avec des flèches, les indices étaient là. Heureusement, pas de mal, et j'ai la chance de trouver une serviette, accessoire indispensable pour nfaire de l'auto-stop intergalactique ;).

Dans la pièce suivante, je tombe sur un gobelin imprudent. Hop, couic! Il y a de la viande au menu:

Blecch! Rotten food! Everything suddenly goes dark.

DONC, manger de la viande fraîchement hachée, qui est apparemment déjà pourrie, me rend AVEUGLE!

Bien joué mon gars!

Tant pis, pas le choix, il faut continuer. Ça passe vite heureusement.

Pour une fois, le niveau semble bien grand, je trouve un passage tout à l'ouest:


                                                   ----------
              -------------                        |<.......|
    -----  ###-...........|                        |........|     ------
    |...|  #  |...........|                        |........-#####.....|
    |...|  #  |...........|                        -------.--#    |....|
    |...|  #  ----------.--                              ##  #    --.---
    |...-###            ##                               #   ##     #
    |...|                #                               #    #     ###
    --.--                #                               #    #       #
      #                 -.-----                        ###    ##      ####
      #                 |.....|                        #       # --------|--
      #                 |...:.-##################################..........|
     -@-                |.....|#####-------      ---.--        ##|.........|
    |.%.|               |......#   #...>...######|....|         #|.........|
    |....               -------##   |.....|     #|....|         #|.........|
    |{..|                       ####-......##   #|....|         #..........|
    -----                           |.....| ### #|....|          |..%......|
                                    -------   ###.....|          -----------
                                                #------

Prx the Gallant                St:15 Dx:9 Co:10 In:9 Wi:15 Ch:17 Lawful
Dlvl:1 $:10 HP:16(16) Pw:5(5) AC:3 Xp:1

Ça sent le piège, mais il y a une tasse avec une fontaine à côté. Dois-je boire l'eau?

Allez, j'y vais!

Tout va bien, comme quoi, nethack n'est pas toujours si méchant :)

Ma route continue, le niveau 2 se passe tout seul, mis à part qu'il y a un coffre et une boîte que je ne peux pas encore ouvrir : il me manque des outils de crochetage. Note à moi-même : revenir ici un peu plus tard.

Il y a d'ailleurs 2 escaliers vers le bas, qui ne mènent pas au même niveau.

Dans l'un des niveaux 3, j'ai bien failli y rester face à une chauve-souris géante. Heureusement mon poney mort fort. Tiens, hop, une carrote non-maudite pour toi!

Ça commence à devenir compliqué de tout porter. Et pas un seul parchemin à l'horizon pour identifier mes potions.

J'ai compris ce que c'était l'autre niveau 3 : c'est les mines.

Mon poney fait des ravages, quand soudain:

Your saddled pony grows up into a horse.

Alleeeeez, si ça continue comme ça il va évoluer en licorne. Ça serait la classe! (le wiki dit que ça deviendra un cheval de guerre).

En descendant au niveau 4 des mines, je me fais attaquer à coup de carreaux, on me jette une carafe à la tronche, et je suis tellement lent que je peine à me défendre. Je remonte bien vite alors qu'il me reste 5HP, mais il vaut mieux fuir!

En passant, je découvre une amulette que j'essaie:

It constricts your throat!

Génial, je me fais étrangler... C'est mal barré!

You find it hard to breathe.
You're gasping for air. You can no longer breathe.
You're turning blue.
You suffocate.

4 tours...

Les colliers, c'est pourri!

                      ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      41 Au       |
                  |    killed by     |
                  |  strangulation   |
                  |                  |
                  |                  |
                  |       2023       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Fare thee well prx the Knight...

You died in The Dungeons of Doom on dungeon level 2 with 575 points,
and 41 pieces of gold, after 2218 moves.
You were level 4 with a maximum of 40 hit points when you died.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=nethack-13

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-16-mission-terroriste-reussie.txt

2023-10-16T20:36:33Z

<![CDATA[

billet d'humeur écrit après une journée fatiguante sans aucun recul... Je préviens.

Quelle journée!

2 heures mis comme dans un parc au milieu de la restauration. Pas de café, pas de réconfort, pas de consigne ni de conseils, juste : "vous pouvez faire ce que vous voulez en hommage" (en gros démerdez-vous). Tout le monde est un peu perdu. L'atmosphère est lourde de chagrin, on patauge dans la crainte et la colère, le ressentiment colle comme un brouillard épais.

Alors que la décapitation de Samuel Paty pouvait être attribuée à un fou, c'est désormais un prof, ni plus ni moins, qui est pris pour cible. Le symbole de toutes les valeurs qui nous sont chères, étrangement traduites par J.J. Goldman :

Bravo. Mission terroriste réussie.

C'était un professeur [...] qui pensait que savoir était un grand trésor, que tous les "moins que rien", n'avaient pour s'en sortir, que l’école et le droit qu’a chacun de s’instruire. Il y mettait du temps, du talent et du cœur...

Puis la vie continue. Heureusement, les enfants/élèves sont dépassés par tout ça. On enseigne, et c'est ce qui est le plus important. Mais le Soleil est lent dans le ciel, la bouche a un gout amer.

Tout le monde est déjà passé à autre chose. Dommage colatéral. On a fait rentrer les profs dans les rangs et garder les enfants pour que les ouvriers puissent continuer à faire tourner la fraiseuse au lieu de garder leurs enfants si l'école ferme, le PIB passe d'abord. Rien à faire.

Et les collègues qui intellectualisent le truc en salle de pause... Et gnagnagna l'histoire, et blablabla la Palestine et l'Israël, et vas-y que je te lance des trucs en fait racistes, toi, le collègue si humain que j'estime tant.

Bravo. Mission terroriste réussie.

Les religions sont un poison.

Les territoires sont des illusions.

Pendant ce temps, les collègues du primaire recevaient la consigne de Gabriel Attal, Ministre de l'Éducation Nationale, de préparer des choses pour une commémoration, pendant leur PAUSE DÉJ'! Au lieu d'inventer des problèmes d'Abaya, y avait peut-être mieux à faire...

Fatigue... Colère... Fatigue... Tant de fatigue! Désespoir. Futilité. Vanité!

Ça ne profite à personne. Il y a juste des morts et du temps gaspillé.

À quoi bon?

Et le soir... alors que les enfants sont censés être endormis :

Mais maman, ça aurait pu être toi?!

Bravo. Mission terroriste réussie.


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=mission-terroriste-reussie

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-14-teach-even-harder.txt

2023-10-14T16:11:03Z

<![CDATA[

Attaque terroriste à Arras contre des profs:

You know what, I'm gonna start teaching even harder!

https://si3t.ch/log/img/teach-even-harder.jpg

Quelques heures plus tard, Gabriel Attal, Ministre de l'éducation nationale:

les cours sont annulés pour les élèves jusqu’à 10 heures.

😫


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=teach-even-harder

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-11-gopher-onion.txt

2023-10-11T10:53:48Z

<![CDATA[

En explorant un peu, j'ai trouvé les arguments énoncés en faveur du protocole gopher intéressants.

=> gopher://bitreich.org/0/con/2022/rec/big-browser.md

Cependant, même si c'est surtout utile pour consulter des documents et peu pour envoyer des données, la question de l'anonymat se pose puisque tout est transmis en clair.

Solène expliquait comment y ajouter une couche de TLS :

=> https://dataswamp.org/~solene/2019-03-07-gopher-server-tls.html

C'est là qu'intervient TOR, un service caché me paraît encore mieux qu'une couche TLS:

=> gopher://bitreich.org/1/onion

Je vais donc reprendre les grandes lignes de ce qui est décrit dans le lien ci-dessus avec quelques détails mineurs pour OpenBSD.

Tout d'abord, on ajoute un service caché dans la configuration de tor:

SocksPort 0
HiddenServiceDir /var/tor/hidden-gopher/
HiddenServicePort 70 localhost:71

De cette façon, tor va renvoyer tout ce qui arrive sur le service caché au port 70 vers le serveur gopher local sur le port 71. Ce qui est génial, c'est que c'est toujours le port 70 qui est exposé, c'est beaucoup + pratique:

user -----> .onion port 70 <-----> localhost port 71

Ici, j'utilise ''localhost'' plutôt que ''127.0.0.1'' car ça permet de proposer l'IPv6 si dans ''/etc/hosts'' vous avez bien précisé:

127.0.0.1 localhost
::1 localhost

On peut relancer tor: ''# rcctl restart tor''.

Dans le fichier ''/var/tor/hidden-gopher/hostname'', vous trouvez votre adresse onion. Ce domaine ne changera pas, même si vous changez d'IP ou de machine.

# cat /var/tor/hidden-gopher/hostname
of2w2p5f4hsslk63hmo6tid6r7inhlxuxviq4pb5cxg45enswpbrfjad.onion

Reste à lancer le serveur gopher en local sur le port 71. Pour cela, geomyidae propose des options très pratiques.

=> gopher://gopher.r-36.net:70/1/scm/geomyidae/

On va créer le fichier ''/etc/rc.d/geomyidae_tor'' pour recopier le fichier rc d'origine et ajouter les options voulues:

#!/bin/ksh

daemon="/usr/local/bin/geomyidae"
onion="of2w2p5f4hsslk63hmo6tid6r7inhlxuxviq4pb5cxg45enswpbrfjad.onion"
geomyidae_flags="-c -e -h $onion -b /var/gopher/si3t.ch -p 71 -o 70"
daemon_flags="-l /var/log/geomyidae.log -u _geomyidae -g _geomyidae $geomyidae_flags"

. /etc/rc.d/rc.subr

pexp="${daemon}_tor .*"

rc_cmd $1

On y retrouve:

  • L'adresse en .onion

  • les options à passer à geomyidae. Notamment:

* -h $onion permet d'envoyer au client le bon nom de domaine en onion

* -p 71 indique que le port d'acoute est le 71

* -o 70 indique que le port à diffuser en sortie reste le 70

Ces 3 dernières options sont particulièrement pratiques si vous ne voulez pas avoir à changer tous vos gophermaps et y préciser le domaine en onion à la place de votre domaine d'origine. En effet, geomyidae va remplacer "server" et "port" par les valeurs appropriées dans un fichier index.gph. Cela évite qu'un lien ne pointe vers votre nom de domaine et pas vers le service caché. Par exemple :

[1|log|/log|server|port]
[1|si3tch|/w|server|port]
[0|twtxt.txt|/twtxt.txt|server|port]
[0|public bookmarks|/pub/public_bookmarks.txt|server|port]
[0|positive space|/positive_space.txt|server|port]
[1|pub|/pub|server|port]

On termine par ''# rcctl enable geomyidae_tor && rcctl start geomyidae_tor'', et vous pourrez consulter le gopherhole via tor:

torsocks lynx gopher://of2w2p5f4hsslk63hmo6tid6r7inhlxuxviq4pb5cxg45enswpbrfjad.onion


Une réaction?

Envoyez votre commentaire par mail (anonyme):

=> mailto:prx@si3t.ch?subject=gopher-onion

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:

=> https://si3t.ch/log/commentaires.txt

]]>

https://si3t.ch/log/2023-10-10-a-lire-plus-tard.txt

2023-10-10T20:51:11Z

<![CDATA[

Aussi appelé "sous le coude" pour les lecteurs de sebsauvage, l'idée est de noter un lien pour lecture ultérieure.

Pour cela, il existe déjà le service forlater.email. C'est payant, mais tout le monde s'accorde à dire que c'est excellent:

=> https://forlater.email/

D'autres utilisent shaarli et taggent les liens avec "#toread" ou "#souslecoudé" ^^.

En ce qui me concerne, une certaine personne qui se reconnaîtra vite ici m'a envoyé des articles que j'ai vraiment très envie de lire.

VRAIMENT lire, pas regarder à toute vitesse en 2 minutes entre le grand qui hurle parce qu'il n'arrive pas à terminer son bricolage avec un trait qui n'est pas parfaitement droit et sa petite soeur qui lui chipe ses crayons et en profite pour les mettre dans la bouche tout en criant parce que elle veut elle aussi la même feuille pour dessiner tout en ayant peur du chat qui veut juste des caresses...

Juste, pouvoir lire calmement, car ça semble très intéressant, et ça demande + de 2 minutes de lecture, et être sûr de ne pas l'oublier.

En plus, je suis du genre à être anxieux à l'idée que des textes ou ressources peuvent disparaître entre le moment où je note le lien et celui où je vais effectivement le lire et encore le jour où je vais y faire référence pour un ami ou parce que j'en ai besoin. C'est là qu'intervient archive.org et sa machine à remonter le temps.

Voici donc un petit script nommé ''soulcoud'' (ouais...) qui va récupérer une copie d'un lien avec lynx, 100% plaintext, effectuer une copie chez archive.org et envoyer le tout par mail.

C'est tout nouveau, ça va sans doute être modifié un peu à l'avenir, du coup les conseils sont bienvenus.

Vous remarquerez que l'adresse mail à laquelle l'article doit être envoyé est définie dans une variable d'environnement, ça me paraissait + simple pour l'utiliser via dmenu. De plus, les liens gopher sont supportés, ça ne doit pas être trop dur d'ajouter d'autres protocoles.

Ça s'utilise ainsi :

soulcoud https://www.filfre.net/2023/07/going-rogue/ recommended by f6k

Bref, voici soulcoud:

#!/bin/sh
# soulcoud: save an url on archive.org and send a copy by email to read later
# the email address is read from environment SOULCOUD_MAIL
# Author: prx 
# licence: MIT
# Require: curl, lynx or reader
# one may replace mail command with msmtp or else
# improve with wkhtml2pdf or other snapshot tool

usage()
{
	printf "usage:\n\t"
	printf "%s (-h)  \n" "$0"
	printf "\t-h : print help\n"
	printf "\nexample:\n"
	printf "\t%s 'http://who-is-clarkkent.net' Superman id?\n" "$0"
	printf "\nThe page is sent to the mail address set in environment variable SOULCOUD_MAIL\n"
	exit
}

archive_url()
{
	# archive the url and output the page link on archive.org
	curl -s "https://web.archive.org/$1" | 
		sed -n 's/.*href="\([^"]*\).*/\1/p'
}

dump_page()
{
	# use reader or lynx to echo page content
	#reader "$1"
	lynx \
		-dump \
		-underline_links \
		-image_links \
		-collapse_br_tags \
		-list_inline \
		"$1"
}

if [ -z "${SOULCOUD_MAIL}" ]; then
	printf "You must set the environment variable SOULCOUD_MAIL\n"
	printf "Example: in ~/.profile, enter\n"
	printf "\texport SOULCOUD_MAIL=bruce.wayne.corp\n"
	exit
fi

while getopts 'h' c
do
    case $c in
    	h) usage ;;
    esac
done
shift $((OPTIND - 1))

test $# -lt 1 && usage

url="$(printf "$*" | cut -d' ' -f1)"
title="$(printf "$*" | cut -d' ' -f2-)"
test -z "${title}" && title="${url}"

(
	# save the page with lynx
	dump_page "${url}"
	printf "\n---\n"
	printf "url: "${url}"
	# then save on archive.org
	case "${url}" in
		http* )
		archived="$(archive_url "${url}")"
		if [ $? -eq 0 ]; then
			printf "Saved on: https://web.archive.org/%s\n" "${archived}"
		fi
		;;
	esac
) | mail -s "${title}" "${SOULCOUD_MAIL}"</pre><p>Pour l'utiliser, vous devrez avoir installé curl, lynx, et un serveur mail en route ou bien remplacer ''mail'' par ''msmtp'' ou équivalent.
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=a-lire-+-tard">mailto:prx@si3t.ch?subject=a-lire-+-tard</a><br /><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><span class="gemini-fragment">=> </span><a href="https://si3t.ch/log/_commentaires_.txt">https://si3t.ch/log/<em>commentaires</em>.txt</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-10-09-fin-gmi.si3t.ch.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-10-09T16:44:02Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Je propose depuis un bon moment un service d'hébergement de capsules gemini. Le principe était tout simple : connexion en sftp par clé, les utilisateurs étaient enfermés dans leur chroot, le tout était servi par vger pour le protocole gemini.
</p><p>Cependant, même si ce service est peu gourmand en ressources, je vais le fermer car je n'ai pas le temps de vérifier que tout le contenu mis en ligne est respectueux des lois (et des valeurs humaines qui me sont chères). Or, je me sens responsable de ce que ma VM héberge.
</p><p>Par conséquent je dois prévenir les utilisateurs qu'ils devraient migrer leur capsule ailleurs. Comment faire, puisqu'il ne s'agit que d'identifications par clé, et que je n'ai pas gardé un annuaire?
</p><p>C'est tout bête, j'ai créé un fichier texte contenant la chose suivante :
</p><pre>Hello folks,

I'm ending this service since I don't have time to check the content is respectful to everyone (no porn, no violence nor proselytism).
Look ad sdf.org or any tilde community if you need such hosting.

I plan to close the server at the end of october 2023.

Thanks for all!</pre><p>Ce fichier est enregistré dans /home/gemini/banner-stop.txt.
</p><p>J'ai ajouté une petite ligne dans la configuration de ssh pour que le contenu de ce fichier soit affiché à la connexion:
</p><pre>Match Group gmiusers
        ChrootDirectory /home/gemini/
        ForceCommand internal-sftp
        Banner /home/gemini/banner-stop.txt
        AllowTcpForwarding no
        X11Forwarding no
        PasswordAuthentication no</pre><p>Du coup, ça me donne très envie de proposer un service d'hébergement smolweb + mail + xmpp vu la facilité du truc, genre tilde, mais ça sera en famille ou entre copains pour l'instant :)
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/log/atom.xml/Configurer">un chroot sftp:</a><br /><p>https://si3t.ch/w/doku.php?id=ah:fr:02-admin#sftp_dans_un_chroot
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=fin-gmi.si3t.ch">mailto:prx@si3t.ch?subject=fin-gmi.si3t.ch</a><br /><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><span class="gemini-fragment">=> </span><a href="https://si3t.ch/log/_commentaires_.txt">https://si3t.ch/log/<em>commentaires</em>.txt</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-10-05-nethack-12.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-10-05T21:20:27Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><blockquote>Aloha prx, welcome to NetHack!  You are a neutral female human Tourist.
</blockquote><p>Voilà trop longtemps que je n'ai pas pris le temps de jouer. J'espère ne pas avoir oublié trop de choses.
</p><p>J'indiquerai ici les éléments importants de l'aventure selon ce que je découvre.
</p><p>C'est reparti!
</p><p>Déjà, inventaire de fou  : 764 pièces d'or, 3è flèches, plein de trucs à manger, et le reste classique chez le touriste : appareil photo et carte de crédit :D.
</p><p>Le premier niveau se passe bien. J'avais oublié qu'on est vraiment faible au début. Un rat a failli m'avoir, mais mon appareil photo a fait le reste ;)
</p><p>Au niveau 2, je découvre un coffre, mais impossible de le forcer sans armes. Plus loin, je récupère une massue (dans un piège...), alors je tente d'ouvrir, mais la massue est maudite :s. Du coup je suis lent, j'ai faim, alors j'ouvre une boîte de conserve, et là, j'éclate de rire :
</p><blockquote>Eating french fried food made your fingers very slippery.
</blockquote><p>Ça ne va pas m'aider à ouvrir cette malle !!!
</p><p>Je finis par y parvenir et découvre une potion effervescente, une baguette magique, 2 gemmes (il faut décidément que je découvre à quoi servent les gemmes!) et un livre de sorts poussiéreux. Bof, rien d'hyper essentiel pour une touriste.
</p><p>Cependant, un peu plus loin, un marchand!!! J'ai donc des choses à vendre si besoin de sous.
</p><p>Ah, je suis content, c'est la première fois que je trouve un marchand si tôt dans le jeu en tant que touriste. D'ailleurs, heureusement que je suis riche, mon chat mange les tripes du magasin :s
</p><p>J'y trouve une hache, une armure simple, et surtout, un parchemin d'identification qui est bien pratique!! En tout cas, je me ruine avant de descendre au niveau 3. Hâte de me débarasser de cette massue maudite!
</p><p>Au niveau 4, je découvre une cape elfique. Youpi !
</p><p>Plus loin, un gnome m'attaque. Je le découpe en petites rondelles alors que mon chat lui griffe les fesses. Cela me laisse affamé, je dévore les morceaux restants :
</p><blockquote>Ulch - that meat was tainted!  You feel deathly sick.
</blockquote><blockquote>(It must have died too long ago to be safe to eat.)
</blockquote><blockquote>You die from your illness.
</blockquote><p>oO
</p><p>Mais POURQUOI n'ai-je pas bu une de mes super potions de soin???
</p><pre>
                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      122 Au      |
                  |  poisoned by a   |
                  |   rotted gnome   |
                  |      corpse      |
                  |                  |
                  |       2023       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Aloha prx the Tourist...

You were poisoned in The Dungeons of Doom on dungeon level 4 with 250
points,
and 122 pieces of gold, after 2206 moves.
You were level 2 with a maximum of 16 hit points when you were
poisoned.</pre><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=nethack-12
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-10-03-ah-en-finally-done.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-10-03T10:35:42Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>It's finally done, I finished re-reading and fixing the translation of "Host with OpenBSD":
</p><p>https://si3t.ch/w/doku.php?id=ah:en:start
</p><p>Of course, I guess there are still some issues, but I hope to see fixes incoming since it is hosted on dokuwiki.
</p><p>It was a long road, but I'm happy since I think it helped to improve the original french verrsion too.
</p><p>Next step: I plan to write straigthforward cards for each element of a server.
</p><p><hr />
</p><p>Something to say?
</p><p>Send it by mail (anonymous):
</p><p>mailto:prx@si3t.ch?subject=ah-en-finally-done
</p><p>To see answers, read the mailing list instructions here:
</p><p>https://si3t.ch/log/<em>commentaires</em>.txt
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-10-02-octopenbsd-server.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-10-02T12:56:36Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Cette fois-ci je décris mes installations d'OpenBSD qui servent plutôt de serveur.
</p><h2>ledzep
</h2><p>https://si3t.ch/log/img/ledzep.jpg
</p><p><pre><code>^ photo de mon serveur avec des fils partout
</code></pre>
</p><p>C'est mon petit serveur qui me permet d'auto-héberger tout un tas de truc. Vraiment un tas, je suis ravi et heureux de voir comme il tient bien la charge :).
</p><p>En terme de matériel, c'est un apu2 avec un SSD externe récupéré sur une machine en panne pour les trucs de stockage.
</p><p>Clairement, c'est la machine dont j'ai le plus besoin au quotidien. Et pour cause, on y trouve :
</p><h3>Un serveur http
</h3><p>J'y héberge mon domaine perso, si3t.ch, avec :
</p><ul><li>quelques pages html
</li>
<li>mon dokuwiki, donc PHP
</li>
<li>mes musiques que j'écoute en streaming, servies via un simple fichier de liste de lecture m3u
</li></ul><p>Mais aussi :
</p><ul><li>https://webzine.puffy.cafe : le webzine OpenBSD que Solène uploade via sftp
</li>
<li>https://monsieurtruc.si3t.ch : le site perso d'un ami propulsé par PluXML
</li>
<li>https://noroanka.art : le site de Péhä
</li>
<li>Une galerie de photos/vidéos privée restreinte par htpasswd et propulsée par Minigalnano
</li></ul><h3>Mes mails
</h3><ul><li>Mes mails persos et pour mon entourage
</li>
<li>Des listes de diffusion gérées avec mlmmj
</li></ul><h3>Un serveur XMPP
</h3><p>Qui me sert à discuter, et héberger les salons openbsd_fr@chat.si3t.ch, openbsd@chat.si3t.ch, fremen@chat.si3t.ch et plus récemment un salon familial où on s'amuse bien avec les beaux frères et ma belle mère.
</p><p>Je gère les inscriptions avec tabr-suite.
</p><p>C'est prosody le serveur.
</p><h3>Et aussi...
</h3><ul><li>Un service caché tor pour avoir un domaine qui ne dépend pas de mon registrar : http://6gvb6fzoxv72mtlpvr2fgj7ytpeggwuerdawspt24njlkwfxir6jncid.onion/
</li>
<li>des statistiques générées pour Solène avec webalizer
</li>
<li>des sauvegardes de mes documents persos avec rsync et cron
</li>
<li>un spamtrap avec spamdb
</li>
<li>des certificats SSL renouvelés avec acme-client
</li>
<li>une zone DNS avec DNSSEC grâce à ldnscripts, servie avec nsd.
</li>
<li>des vilains hackers automatiquement bloqués grâce à iblock, sshguard et nono
</li>
<li>un canari qui enverra des instructions à mes proches si je ne me suis pas connecté depuis 2 mois
</li>
<li>une FAQ OpenBSD à télécharger pour lecture hors ligne
</li>
<li>un lecteur de flux qui envoie les articles par email avec rss2email
</li>
<li>serveur DNS secondaire pour les copains
</li>
<li>serveur mail secondaire pour les copains
</li>
<li>upload temporaire de fichiers via sftp. find dans un cronjob se charge de faire le ménage des vieux fichiers.
</li>
<li>une seedbox avec transmission, peu utilisée mais qui existe.
</li></ul><h2>acdc
</h2><p>C'est ma petite VM chez openbsd.amsterdam.
</p><p>Il fait office de backup pour mes mails, mais aussi de serveur DNS secondaire, et permet d'héberger quelques capsules gemini avec vger :
</p><p>gemini://gmi.si3t.ch
</p><h2>Liste de liens
</h2><p>https://openbsd.amsterdam
</p><p><pre><code>^ Hébergeur de VM OpenBSD <3
</code></pre>
</p><p>https://si3t.ch/w/doku.php?id=code:tabr-suite
</p><p><pre><code>^ Mes scripts pour créer/gérer des comptes mail et XMPP
</code></pre>
</p><p>https://si3t.ch/w/doku.php?id=ah:start
</p><p><pre><code>^ Documentation pour s'auto-héberger avec OpenBSD
</code></pre>
</p><p>https://si3t.ch/w/doku.php?id=evils
</p><p><pre><code>^ Listes d'IP à blacklister, générées et préparées sur mon serveur
</code></pre>
</p><p>https://si3t.ch/w/doku.php?id=code:nono.awk
</p><p><pre><code>^ Outil pour détecter les tentatives d'intrusion
</code></pre>
</p><p>https://tildegit.org/solene/iblock
</p><p><pre><code>^ Outil pour éviter les tentatives d'intrusion
</code></pre>
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=octopenbsd-server
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-10-02-octopenbsd-desktop.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-10-02T12:50:38Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>C'est l'octOpenBSD! Une occasion idéale pour vous parler de ce à quoi me sert OpenBSD au quotidien.
</p><p>À la maison, il y a 3 ordinateurs qui servent à la bureautique : sexy, terminus, et moria.
</p><p>Il y a aussi un serveur : ledzep. En backup, il y a acdc chez openbsd.amsterdam. Mais ça, c'est une autre histoire ;)
</p><p>Pour chaque installation ci-dessous, tout est chiffré entièrement depuis l'installation.
</p><h2>sexy
</h2><p>https://si3t.ch/log/img/sexy.jpg
</p><p><pre><code>^ Photo de la machine "sexy"
</code></pre>
</p><p>C'est l'ordinateur qu'utilise ma chérie.
</p><p>Il fait tourner OpenBSD -stable.
</p><p>Avec, elle trie nos photos, les optimise. Nos vidéos de famille sont converties en webm pour mettre tout ça sur notre petit site de partage.
</p><p>Elle travaille avec, c'est à dire qu'elle prépare tous ses cours, principalement avec LibreOffice. Firefox avec + de 20 onglets minimum, et une barre des tâches qui liste une grosse dizaine de documents libreoffice ouverts en simultanés. Et forcément, il faut imprimer tout ça.
</p><p>Les messages sont consultés avec claws-mail.
</p><p>Avec Dino, elle s'envoie des photos des documents ou autres exercices de son téléphone sur son ordinateur.
</p><p>Quelques scripts traînent dans les actions personnalisées de Thunar pour optimiser les images, convertir en PDF, envoyer par mail...
</p><p>Les pubs sont filtrées avec le résolveur unwind et les blocklists que je génère ici https://si3t.ch/w/doku.php?id=evils#blocage_par_dns.
</p><p>La plupart du temps elle oublie de l'éteindre, donc il reste en veille grâce à apmd qui gère ça sans soucis dès que l'écran est fermé ou que la batterie commence à être trop faible. Ça tourne bien les x230 :)
</p><h2>terminus
</h2><p>https://si3t.ch/log/img/terminus.jpg
</p><p><pre><code>^ Photo de la machine "terminus"
</code></pre>
</p><p>C'est mon pc portable, que j'emmène au travail et avec lequel je fais à peu près tout.
</p><p>Il fait tourner OpenBSD -current.
</p><p>Je projette mes cours en classe. Avec le gestionnaire de fenêtres dwm. Il y a juste une petite barre de status pour afficher la charge batterie et l'heure, et éventuellement ce que mpd joue comme musique:
</p><pre>#!/bin/sh
# set dwm's status when USR1 signal is received
#	pkill -USR1 statusloop
#	kill -USR1 $(cat /tmp/statusloop.lock)

LOCKFILE=/tmp/statusloop.lock

set_status()
{
	xsetroot -name "$(status)"
}

reload()
{
	kill -USR1 $(cat ${LOCKFILE})
}

if [ -e ${LOCKFILE} ]; then
	echo "already running, killing"
	kill -9 $(cat ${LOCKFILE})
fi

trap set_status USR1

# make sure the lockfile is removed when we exit
trap "rm -f ${LOCKFILE}; exit" INT QUIT TERM

echo $$ > ${LOCKFILE}

set_status

DELAY=".5"
# clock
(while true; do sleep 60; set_status; done) &
# mpd changes
(while true; do mpc -q --wait current >/dev/null 2>&1; set_status; done) &

# global loop
while true; do sleep $DELAY; done</pre><p>, j'envoie les fenêtres sur la sortie du vidéo-projecteur avec un petit raccourci. Sur mon écran à moi, j'affiche dans la sortie qui s'affiche dans mon dos avec ffplay :
</p><pre>#!/bin/sh
res="800x600"
ffplay -f x11grab -s $res -framerate 25 -i :0.0+1366,0</pre><p>Je peux voir ma classe tout en écrivant ou en bricolant ce qui est affiché, c'est très pratique.
</p><p>Avec le gestionnaire de fichiers rover dans tmux, j'ouvre mes documents en quelques frappes.
</p><p>En cas de doute, j'utilise le script "f" pour chercher un fichier dont je ne me souviens plus l'emplacement :
</p><pre>#!/bin/sh
# find and open a file

if [ "$#" == "0" ] ; then
	file="$(find . -type f | match)"
else
	file="$(find . -name "*${*}*" -type f | match)"
fi

test -f "$file" && opener "$file"</pre><p>Autant dire qu'il y a des scripts partout. match appelle dmenu ou pick, opener ouvre les fichiers selon leur extension...
</p><p>Avec ce dernier, j'écoute de la musique avec mpd. L'espace disque est limité, je branche donc un SSD externe qui contient mes musiques. Un script se charge de le monter et lancer mpd:
</p><pre>#!/bin/sh
slice=$(dmesg | awk '/serial.21090715000000123E9A/ {d=$1} END{print d}')
test $? || exit
if [ -n "$slice" ]; then
	doas /sbin/mount "/dev/${slice}i" /home/prx/mpd
	#doas /sbin/mount /home/prx/mpd
	pgrep -q mpd || mpd
	mpc play
	echo "ok"
fi</pre><p>Quand un élève a des documents à projeter ou à me donner, il vient avec une clé USB que je monte avec "mnt". Ça évite de monter automatiquement des trucs potentiellement dangereux:
</p><pre>#!/bin/sh
# detect recently insterted media
# look for slice
# choose the one to mount.
# mount the partition in $mountdir/sdnm 
#     where "n" is the disk and "m" the slice

# doas.conf : 
#permit nopass :wheel cmd /sbin/mount
#permit nopass :wheel cmd /sbin/disklabel

# change "mountdir" according to your needs
mountdir=$HOME/mnt/

sdn="$(dmesg | grep "sd[0-9] "| tail | \
		match -p 'disk ?'|\
	awk '{print $1}')"

test -z "${sdn}" && exit 1

slice="$(doas /sbin/disklabel ${sdn} |\
	awk '/^  / { gsub("[:,c]","",$1); print $1}' |\
		match -p 'slice ?')"
test -z "${slice}" && exit 1

partition="${sdn}${slice}"
mntpt="${mountdir}/${partition}"
mkdir -p "${mntpt}"

if [ "$sdn" != "" ]; then 
	doas /sbin/mount /dev/"${partition}" ${mntpt}
#	xfe ${mntpt}
fi

rover "${mntpt}"

exit $?</pre><p>Avec nvi, je code à l'occasion. Il y a tout sous OpenBSD pour compiler.
</p><p>À la connexion, calendar m'indique si j'ai des trucs à penser (anniversaires, choses à faire...)
</p><p>Pour ma ToDo list, j'ai un alias qui ouvre un fichier texte qui suit les idées indiquées là : https://codemadness.org/todo-application.html
</p><p>Un script rsync sauvegarde périodiquement tous mes documents importants sur mon serveur, ainsi que lorsque j'éteins mon ordi:
</p><pre>#!/bin/sh
if [ -n "$TERM" ]; then
	prxsync push
else
	xterm -e "prxsync push"
fi
shutdown -hp now</pre><p>Pour la connectivité, au travail j'utilise le partage 4G de mon téléphone, à la maison y a le wifi, je n'ai rien à faire depuis que c'est configuré:
</p><pre># cat /etc/hostname.iwm0

up
join kamehameha wpakey ********************
join prxAP wpakey *******************************
join WIFI_PUBLIC -wpa</pre><p>Lorsque je branche un cable ethernet, il devient prioritaire:
</p><pre># cat /etc/hostname.trunk0

trunkproto failover trunkport em0 trunkport iwm0
inet6 autoconf
inet autoconf</pre><p>Et puis au besoin, j'ai wireguard prêt si j'ai besoin de changer d'IP: juste à lancer le script qui va bien 👼.
</p><p>Firefox, gimp, Libreoffice, LaTeX, rien de très original pour un prof.
</p><p>C'est mutt qui me permet de répondre aux mails. fdm récupère les messages quand je lui demande, ça m'évite les notifications trop distrayantes. Dedans, je lis mes flux RSS puisque mon serveur fait tourner rss2email.
</p><p>Alors ok, il y a quelques scripts qui facilitent la vie : charger un bookmark avec dmenu, prendre des notes grâce à dmenu, choisir une musique grâce à dmenu, chercher sur le web grâce à dmenu, chercher des fichiers grâce à dmenu... Rien de propre à OpenBSD à vrai dire.
</p><p>Si ma batterie est trop faible, alors l'ordinateur se met en veille le temps que j'aille trouver un cable d'alimentation:
</p><pre># rc.conf.local
apmd_flags=-A -z 8</pre><p>D'ailleurs, la batterie ne sera pas chargée au delà des 80% pour éviter son vieillissement prématuré:
</p><pre># /etc/sysctl.conf
hw.battery.chargemode=1
hw.battery.chargestart=75
hw.battery.chargestop=80</pre><p>Unwind, le résolveur DNS local se charge de filtrer les pubs et autres domaines malveillants et allège considérablement mon quotidien.
</p><p>J'ai un script associé à une combinaison de touches qui me permet d'afficher/cacher une session tmux dédiée. Pratique pour écrire en 2 secondes une petite interro ou les devoirs pour la semaine suivante, lancer un compte à rebours...
</p><p>Oh, et j'allais oublier. Je joue parfois dessus: nethack, moria, wesnoth, xonotic, terraria, rogue ledacy, ...
</p><h2>moria
</h2><p>Il y a un autre ordinateur à la maison, un pc fixe que je synchronisais avec mon pc portable avant. Avant, quand je pouvais rester dans 1 pièce sans être interrompu pour bosser ni craindre de réveiller les enfants. Pour l'instant il est au repos, il servira peut-être un jour à nouveau.
</p><p>Cela dit, ça reviendra, et tout est prêt pour avoir un clone de ce qui est déjà présent sur mon ordinateur portable.
</p><p>La synchronisation se réalisait avec synthing, puis unison, et finalement des scripts rsync qui déposent ou récupèrent sur mon serveur selon si l'ordinateur est en avance ou en retard. Pour le savoir, un fichier témoin contenant un timestamp de la dernière synchronisation est déposé.
</p><p>J'ai mis ça en place puisque unison, qui est EXCELLENT, nécessite exactement les même version de chaque côté, ce qui n'était pas le cas entre ma -current et mon serveur en -stable.
</p><p>Le script en question s'appelle "prxsync", il est appelé en début de session, toutes les heures, puis à l'extinction.
</p><pre>#!/bin/sh -e
# sync my data between over my server
#
# ~/.lastsync : date of last sync
# ~/.prxsync.lst : list of files to sync, relative to $HOME. Must containt ~/.lastsync

usage() {
    echo "$0 push/pull"; exit 1
}

test $# -eq 1 || usage

# check if network access
nc -zw1 "si3t.ch" 22 > /dev/null 2>&1 || exit 1
DISPLAY=:0 xsetroot -name "prxsync running..."

tosync=$HOME/.prxsync.lst # dirs MUST end with /
exclude=$HOME/.prxsync-exclude.lst
lastsync=.lastsync
localdir=$HOME
remote=ledzep:/var/users-backups/prx
locallastsync=$localdir/$lastsync

# get remote lastsync
remotelasttmp=$(mktemp)
scp $remote/$lastsync $remotelasttmp
remotelast=$(cat $remotelasttmp)
rm $remotelasttmp

# compare remote w local lastsync
locallast=$(cat $locallastsync)

case "$1" in
	"push")
		if [ $remotelast -gt $locallast ]; then
			echo "/!\ Remote newer than local, please check manually"
			exit 1
		fi
		SRC=$localdir
		DST=$remote
	;;
	"pull")
		if [ $remotelast -eq $locallast ]; then
			echo "Already sync, nothing to do"
			exit
		elif [ $remotelast -lt $locallast ]; then
			echo "/!\ Local newer than remote, you may push"
			exit 1
		fi
		SRC=$remote
		DST=$localdir
	;;
esac

echo ".:!|-- Start prxsync --|!:."

/usr/local/bin/rsync \
	--exclude-from=$exclude \
	--delete \
	--files-from=$tosync \
	--progress \
	-zrltpuv $SRC $DST

# keep track of last sync date
date +%s > $locallastsync

reload-dwm-status</pre><h2>Liste de liens
</h2><p>https://si3t.ch/w/doku.php?id=notes:uses
</p><p><pre><code>^ Ce que j'utilise
</code></pre>
</p><p>https://si3t.ch/w/doku.php?id=notes:openbsd:postinst
</p><p><pre><code>^ Ce que je configure après l'installation d'OpenBSD
</code></pre>
</p><p>https://si3t.ch/w/doku.php?id=evils
</p><p><pre><code>^ Listes d'IP à blacklister, générées et préparées sur mon serveur
</code></pre>
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=octopenbsd-desktop
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-09-14-preserver-batterie-openbsd.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-09-14T12:31:55Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>J'était un peu passé à côté, mais un récent commit permet de contrôler la façon dont la batterie d'un ordinateur portable est chargée :
</p><p><pre><code>https://marc.info/?l=openbsd-cvs&m=168436150408382&w=2
</code></pre>
</p><p>Garder l'ordinateur branché sur le secteur en permanence n'est pas bon pour la batterie, cela l'use et elle perd en autonomie.
</p><p>De plus, cela demande une tension nettement plus importante de charger les dernières cellules d'une batterie. C'est d'ailleurs pour cette raison que c'est si long de charger de 95% à 100%, vou sl'avez sans doute déjà remarqué.
</p><p>De même, ce n'est pas si bon d'entièrement décharger une batterie avant de la remettre sous tension.
</p><p>Avec ce récent commit, on peut faire en sorte qu'OpenBSD ne laisse la batterie se charger seulement si sa capacité est en-dessous d'un certain pourcentage (hw.battery.chargestart) et arrête la charge au delà d'une autre valeur (hw.battery.chargestop).
</p><p>Pour faire court, dans /etc/sysctl.conf:
</p><pre>cat << EOF >> /etc/sysctl.conf
hw.battery.chargemode=1
hw.battery.chargestop=80
hw.battery.chargestart=75
EOF</pre><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=preserver-batterie-openbsd
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-09-05-display-div-when-link-anchor-is-active.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-09-05T13:01:26Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>I like to write xhtml strict.
</p><p>One thing I miss from html5 are <!-- raw HTML omitted --> and <!-- raw HTML omitted --> tag.
</p><p>However, it can be replaced with a link whose href refer to the id of a container. Then, CSS can make the container visible when targeted.
</p><p>Example :
</p><pre><a href="#to_show_on_click">Click me</a>

<div id="to_show_on_click">
Something
</div></pre><p>CSS :
</p><pre>#to_show_on_click {visibility:hidden}
#to_show_on_click:target {visibility:visible}</pre><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-08-31-onion-location-dokuwiki.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-08-31T13:56:08Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Si vous ne voulez pas vous embêter à modifier les entêtes envoyés par votre serveur, ce qui est mon cas avec relayd qui est un peu pénible en plus de httpd avec plusieurs domaines, on peut ajouter une balise "meta" aux pages html pour préciser au tor-browser que le contenu est disponible via un service caché en onion.
</p><p><pre><code>https://community.torproject.org/onion-services/advanced/onion-location/
</code></pre>
</p><p>Seul souci, ça ne renvoie par défaut que vers la racine.
</p><p>Que nenni, avec dokuwiki, on peut utiliser un tout petit bout de PHP pour indiquer l'adresse actuelle du document consulté.
</p><p>On ajoutera donc dans le fichier ''conf/meta.html'':
</p><pre><meta http-equiv="onion-location" content="http://the-weird-url.onion<?php echo $_SERVER['REQUEST_URI']; ?
>" /></pre><p>Et voilà, tor-browser propose le .onion :)
</p><p><pre><code>https://0x0.st/HpaA.png
</code></pre>
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=onion-location-dokuwiki
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-08-29-abaya.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-08-29T10:02:18Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Pendant ce temps, on ne parle pas :
</p><ul><li>des locaux délabrés
</li>
<li>du personnel manquant
</li>
<li>des emplois du temps surchargés
</li>
<li>de la multiplication des missions sans augmentation de salaire
</li>
<li>de la pression hiérarchique
</li>
<li>de la diminution des moyens : faire mieux avec moins.
</li></ul><p>Comme il est pratique de faire du bruit à propos de l'abaya à interdire plutôt que de vraiment réfléchir à comment aider les jeunes.
</p><p>--> G. Attal, oui, c'est toi qu'on regarde pendant ce temps.
</p><p>(pour les nuls comme moi, l'abaya c'est en gros une robe longue).
</p><p>Ça demande moins d'effort d'annoncer une possible reprise des cours le 20 août pour les élèves en difficulté et d'allonger leurs journées à 18h. C'est plus facile que de réfléchir à leurs difficultés et les résoudre.
</p><p>--> Manu 1er, c'est toi qui fait du bruit pendant ce temps.
</p><p>Tout ce temps perdu.
</p><p>Ce n'est pas nouveau, et cela fait longtemps que c'est su et démontré : on augmente le PIB, on améliore les conditions de vie, on on réduit la criminalité lorsqu'on investit dans l'éducation. (2/3 des arguments sont de droite dis donc) Sans parler de la liberté de s'épanouir... Je la fais courte.
</p><p>En bref :
</p><ul><li>On réduit les vacances d'été. 2 mois sans cours, c'est beaucoup trop.
</li>
<li>On va en cours le matin seulement. Le début d'aprèm, c'est une activité culturelle, artistique ou sportive. Stop à 15h maxi.
</li>
<li>Classes de 15 à 20 élèves maxi : un vrai suivi et une vraie aide peut alors être proposée.
</li></ul><p>En effet, ça suppose de faire le choix de prendre soins de nos enfants et de mettre les moyens pour les aider plutôt que favoriser le tourisme ou encore l'entrepreneuriat : moins de touristes l'été, des horaires de travail pour les parents adaptées. C'est sûr que si les gamins finissent à 18h, on peut rester + longtemps devant le tapis roulant...
</p><p>Capitalisme ou intelligence, il faut choisir.
</p><p>♪ Ceci était le coup de gueule pré-rentrée offert par votre idéaliste du coin ♫
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=abaya
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-08-16-super-mario-war-retroarch.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-08-16T12:08:25Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>J'ai récemment installé retroarch sur une nouvelle machine pour rejouer à mes anciens jeux. À cette occasion, j'ai découvert un port pour Super Mario Wars nommé "superbroswar":
</p><p><pre><code>https://github.com/libretro/superbroswar-libretro
</code></pre>
</p><p>Il est possible d'installer ce port en utilisant le menu de mise à jour en ligne.
</p><p>Cependant, ce n'est pas exactement super mario wars qui est supporté. On peut, toujours dans retroarch, télécharger du contenu pour ce core. C'est un remake libre nommé "Super Cat Wars":
</p><p><pre><code>https://elecyon.carrd.co/#supercatwars
</code></pre>
</p><p>Le principe est le même : dans une arène, des joueurs se sautent dessu pour s'éclater et des bonus sont disponibles en sautant dans des blocs à la super mario.
</p><p>C'est vraiment amusant, et je le voulais sur la "console de salon" pour les apéros entre amis.
</p><p>Cependant, retroarch ne crée pas une nouvelle playlist pour ce moteur, comme il le fait pour Cave Story. C'est donc assez fastidieux de lancer le jeu, il faut importer un contenu, puis aller fouiller dans le dossier ~/.config/retroarch/downloads...
</p><p>Si ça vous intéresse, vous pouvez ajouter une playlist en créant un fichier ''~/.config/retroarch/playlists/Super Cat Wars.lpl''
</p><pre>{
  "version": "1.5",
  "default_core_path": "/home/retro/.config/retroarch/cores/superbroswar_libretro.so",
  "default_core_name": "Super Bros War",
  "label_display_mode": 0,
  "right_thumbnail_mode": 0,
  "left_thumbnail_mode": 0,
  "sort_mode": 0,
  "items": [
    {
      "path": "/home/retro/.config/retroarch/downloads/Super Cat Wars LITE/Super Cat Wars LITE.game",
      "label": "Super Cat Wars",
      "core_path": "/home/retro/.config/retroarch/cores/superbroswar_libretro.so",
      "core_name": "Super Bros War",
      "crc32": "",
      "db_name": "Super Cat Wars.lpl"
    }
  ]
}</pre><p>On doit pouvoir faire mieux, je ne suis pas sûr pour les numéros de version, mais ça fonctionne ^^
</p><p>Enjoy :)
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=super-mario-war-retroarch
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-07-30-light-mediacenter-with-alpine.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-07-30T14:52:18Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>I don't own a TV, and don't want to, for reasons.
</p><p>I'd rather use a projector on my wall to watch a show or a movie I choosed.
</p><p>To do so, I used to turn an old computer in a mediacenter.
</p><p>I copy on it my movies with ssh, or plug a USB drive to watch it.
</p><p>Until now, I was using OpenBSD, but I found out that high resolution media (1080p) were slow on some scenes.
</p><p>Today, I installed alpine linux instead and want to tell about it.
</p><p>No X session, no desktop.
</p><p>At boot, my user is automatically logged in and ranger display a list of files with a nice preview.
</p><p>So, how?
</p><p>First, install alpinelinux. Easy with ''setup-alpine''.
</p><p>Add some packages :
</p><pre># apk add mpv ranger w3m w3m-image ffmpegthumbnailer file</pre><p>Enable sound:
</p><p><pre><code>=> https://wiki.alpinelinux.org/wiki/ALSA
</code></pre>
</p><p>Configure mpv:
</p><pre>mkdir -p ~/.config/mpv
cat << EOF >> ~/.config/mpv/mpv.conf
alang=en,fr
slang=fr,en
save-position-on-quit=yes
fullscreen=yes
EOF</pre><p>Configure ranger:
</p><pre>ranger --copy-config all</pre><p>Enable image preview in .config/ranger/rc.conf:
</p><pre>set preview_images true
set colorscheme snow</pre><p>Uncomment video preview in .config/ranger/scope.sh:
</p><pre>video/*)
        # Thumbnail
	ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}"
	exit 1;;</pre><p>Open ranger in the video directory when "watcher" user is logged in:
</p><pre>echo "ranger ~/videos" > .profile</pre><p>At boot, log watcher user in automatically. Edit /etc/inittab:
</p><pre>tty1::respawn:/bin/login -f watcher</pre><p>Reboot.
</p><p>Enjoy.
</p><p>Press power button briefly to turn off.
</p><p><span class="gemini-fragment">=> </span><a href="https://alpinelinux.org/">https://alpinelinux.org/</a> <span class="gemini-fragment">|</span> <a href="https://github.com/ranger/ranger">https://github.com/ranger/ranger</a> <span class="gemini-fragment">|</span> <a href="https://mpv.io/">https://mpv.io/</a><br /><p>UPDATE:
</p><p>Set a nice font for subtitles
</p><pre>mkdir -p ~/.config/mpv
cat << EOF >> ~/.config/mpv/mpv.conf
alang=en,fr
slang=fr,fre,en
save-position-on-quit=yes
fullscreen=yes
sub-font="Roboto"
sub-auto=fuzzy
EOF</pre><pre>apk add font-roboto font-terminus font-dejavu font-noto font-noto-cjk font-noto-extra terminus-font</pre><p>Increase console font size:
</p><pre>vi /etc/conf.d/consolefont
consolefont="ter-132n.psf.gz"
rc-update add consolefont boot</pre><p>UPDATE 2:
</p><p>mpv needs some xorg files:
</p><pre>setup-xorg-base</pre><p><hr />
</p><p>Comment to:
</p><p><pre><code>=> mailto:prx@si3t.ch?subject=light-mediacenter-with-alpine
</code></pre>
</p><p>Instructions for comments:
</p><p><pre><code>=> https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-07-08-new-password-at-each-boot.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-07-08T13:18:57Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Idée stupide pour éviter qu'on ne subtilise votre session quand vous avez le dos tourné : un mot de passe qui change à chaque démarrage.
</p><p>Bien sûr, il faut que l'utilisateur concerné puisse connaître son mot de passe.
</p><p>Pour ça, on peut imaginer plusieurs possibilités :
</p><p><ul>
<li>Un mot de passe avec un squelette de base qui ne change pas et une partie qui dépend de la date : ''stupid-password-$(date +%d%m)'' donnerait pour aujourd'hui ''stupid-password-0807''. Cette dernière partie peut aller chercher dans une bibliothèque de mots de passe dont seul l'utilisateur a le secret, chaque mot de passe dépendant du jour de la semaine... Tout est imaginable.</li>
</ul>
</p><p><ul>
<li>Mot de passe entièrement aléatoire et envoi du nouveau mot de passe à l'utilisateur par mail. Ça nécessite un accès à la boîte mail, mais c'est mieux que la précédente.</li>
</ul>
</p><p>Notez que l'on pourraît très bien imaginer appeler ce script toutes les heures avec une tâche cron pour root.
</p><p>Pour l'instant, je l'appelle dans ''/etc/rc.local'' pour qu'il soit appelé à chaque démarrage :
</p><pre># generate random password for user at boot
u="prx"

# uncomment for a password depending on the date
# newpw="stupid-password-$(date +%d%m)"

# really random password sent by mail
newpw="$(jot -rcs '' 20 32 126)"
printf "%s" "${newpw}" | mail -s "newpw" prx@si3t.ch

newpwhash="$(printf "%s" "${newpw}" | encrypt -b a)"

usermod -p "${newpwhash}" "${u}"</pre><p>Bien sûr, ça ne vaudra jamais une yubikey ou bien encore ceci :
</p><p><pre><code>https://www.openbsd.org/faq/faq10.html#SKey
</code></pre>
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=new-password-at-each-boot
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-06-30-nono.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-06-30T13:40:08Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Dans mon fichier ''todo.txt'', il y avait d'écrit :
</p><blockquote>Réécrire vilain en C
</blockquote><p>Vilain, c'était un outil en python pour analyser les logs et détecter des tentatives d'intrusion pour bannir les IP correspondantes.
</p><p><pre><code>https://framagit.org/prx/vilain
</code></pre>
</p><p>Ça a vieilli, ce n'est pas si bien écrit, et ça intègre un démon alors qu'on doit pouvoir faire mieux avec moins.
</p><p>Alors, quand j'ai vu l'article de Solène qui présentait une solution similaire mais en awk, j'y ai vu un cadeau :
</p><p><pre><code>https://dataswamp.org/~solene/2023-06-22-opensmtpd-block-attempts.html
</code></pre>
</p><p>Mais oui! awk est parfait pour ce genre de tâches!
</p><p>J'ai eu l'idée d'utiliser ''tail -f'' pour monitorer en continu les logs. En cas de rotation, tail sait se débrouiller, ce qui permet d'avoir un démon à moindre cout :)
</p><p>Solène m'a donné envie de m'y mettre, et en quelques heures, j'avais un nouvel outil qui faisait comme vilain, mais en mieux, car
</p><p>en awk.
</p><p>Ça s'appelle nono, et c'est par ici :
</p><p>https://si3t.ch/w/doku.php?id=code:nono.awk
</p><p>Je pourrais y ajouter un démon... Pour l'instant, je le laisse dans tmux pour voir ce que ça donne. Et semble-t-il, ça tourne bien :
</p><pre>Jun 30 10:26:55 ledzep nono: 65.49.1.48 is naughty and is now banned because: ssh wrong pw or invalid user
Jun 30 12:47:13 ledzep nono: 178.151.169.14 is naughty and is now banned because: ssh wrong pw or invalid user
Jun 30 13:33:45 ledzep nono: 118.185.157.225 is naughty and is now banned because: ssh wrong pw or invalid user
Jun 30 13:33:57 ledzep nono: 122.0.26.154 is naughty and is now banned because: ssh wrong pw or invalid user</pre><p>Le code se présente ainsi.
</p><p>On commence par vérifier si l'utilisateur a défini les options, sinon on attribue des valeurs par défaut. La fonction ''usage()'' ne fait qu'afficher l'aide.
</p><pre>BEGIN {

        if ((ARGV[2] == "-h") || (ARGV[2] == "--help"))  {
                usage()
        }

        # check for options or set defaults
        if ( ! TRIES ) { TRIES = 5 }
        if ( ! BANCMD ) { BANCMD = "pfctl -T add -t bot" }
        if ( ! KILLSTATE ) { KILLSTATE = "pfctl -k" }
        if ( ! IGNORE ) { IGNORE = "/etc/nono.ignore" }
}</pre><p>Ensuite, on a des blocs correspondant aux lignes des logs pouvant indiquer un défaut. Par exemple, pour les tentatives de connexion ssh:
</p><pre>/ sshd.* Failed password | sshd.* Invalid user / {
        match($0, "from ([0-9\.:abcdef]*)")</pre><p>Dans l'exemple ci-dessus, on recherche une ip/ipv6 dans la ligne détectée.
</p><p>Si une ip est obtenue, on appelle la fonction 'ban' qui enregistre dans un tableau si l'ip a déjà été vue. Si cela dépasse le nombre maximum de tentatives, elle est bannie :
</p><pre>function ban(seen, ip, reason) {
        seen[ip]++
        if(seen[ip] >= tries) {
                if (isignored(ip) == 0) {
                        system(sprintf("logger -t \"nono\" \"%s is naughty and is now banned because: %s\"", ip, reason))
                        system(sprintf("%s  %s", BANCMD, ip))
                        system(sprintf("%s  %s", KILLSTATE, ip))
                }
                seen[ip] = 0 # reset
        }
}</pre><p>Un tableau était tout à fait adapté pour ça.
</p><p>Ici, j'utilise la fonction ''system'' pour appeler une commande qui enregistre l'activité de nono et bannit l'ip. Utiliser xargs comme le fait Solène semble tout aussi intéressant, ici je me suis juste restreint à awk.
</p><p>On voit qu'avant de bannir l'ip, un appel à ''isignored'' est réalisé pour éviter de s'auto-bannir.
</p><p>Cette fonction va parcourir les lignes d'un fichier à la recherche de l'ip. Merci ''getline'':
</p><pre>function isignored(ip) {
        ret = 0
        while ((getline current_ip < IGNORE) == 1 ) {
                if (ip == current_ip ) {
                        ret = 1
                        break
                }
        }
        close(IGNORE)

        return ret
}</pre><p>Et voilà, c'est à peu près tout :)
</p><p>Merci Solène !
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=nono
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et
</p><p>recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-06-19-generateur-de-liste-de-lecture-ameliore.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-06-19T20:41:49Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>L'utlisation d'une liste de lecture me permet d'accéder à toutes
</p><p>mes musiques de n'importe où du moment que j'ai un accès à
</p><p>internet.
</p><p>Chaque ligne contient une URL vers le morceau disponible.
</p><p>Par exemple :
</p><pre>https://user:password@si3t.ch/musique/lalala.mp3
https://user:password@si3t.ch/musique/yohoho.mp3</pre><p>Ce format est supporté par à peu près tous les lecteurs. Pas de
</p><p>latence quand je change de morceau (comme avec mpd), pas de
</p><p>réencodage donc j'ai la même qualité qu'à la maison. J'aime bien
</p><p>:)
</p><p>Puisque l'utilisation d'une liste de lecture me convient bien, j'ai
</p><p>repris mon générateur pour ajouter quelques éléments et obtenir
</p><p>une liste étendue. L'affichage est plus sympa dans un lecteur, on a
</p><p>d'affiché le titre du morceau et l'artiste plutôt que l'URL.
</p><p>Pour cela, j'ai fait appel à <code>ffprobe</code>, qui vient avec <code>ffmpeg</code>
</p><p>disponible à peu près partout.
</p><p>J'en ai profité pour ajouter une option afin d'insérer au début
</p><p>des chemins une adresse http. Ça pourraît donner :
</p><pre>m3ugen.sh -u https://user:password@si3t.ch/musique/</pre><p>Voici à quoi ressemble le script, si vous souhaitez vous en servir
</p><p>et l'améliorer:
</p><pre>#!/bin/sh
# generate a m3u playlist of all files in current directory

# poor urlescape, most are useless.
urlescape()
{
	sed '
		s/%/%25/g; 
		s/[[:space:]]/%20/g;
		s/</%3C/g;
		s/>/%3E/g;
		s/\#/%23/g;
		s/{/%7B/g; 
		s/}/%7D/g; 
		s/|/%7C/g; 
		s/\\/%5C/g; 
		s/\^/%5E/g; 
		s/~/%7E/g; 
		s/\[/%5B/g; 
		s/\]/%5D/g; 
		s/`/%60/g; 
		s/;/%3B/g; 
		s/?/%3F/g; 
		s/:/%3A/g; 
		s/@/%40/g; 
		s/:/%3D/g; 
		s/&/%26/g; 
		s/\$/%24/g; 
	'
}

usage()
{
	printf "usage:\n\t"
	printf "%s (-h) (-u <url>)\n" "$0"
	printf "\t-h : print help\n"
	printf "\t-u : prepend <url> to path for streaming\n"
	printf "\t\t i.e. -u "http://example.com/audio/"\n"
	exit
}

while getopts 'hu:' c
do
    case $c in
    	h) usage ;;
    	u) url="${OPTARG}" ;;
    esac
done

printf "#EXTM3U\n\n"

find . -type f \
	-name '*.flac' -o \
	-name '*.FLAC' -o \
	-name '*.mp3' -o \
	-name '*.MP3' -o \
	-name '*.m4a' -o \
	-name '*.M4A' -o \
	-name '*.ogg' -o \
	-name '*.OGG' -o \
	-name '*.opus' -o \
	-name '*.OPUS' -o \
	-name '*.webm' -o \
	-name '*.WEBM' | \
	sed 's/^\.\///' |\
	while read -r line; do
		duration="$(ffprobe -v 0 -show_entries stream=duration "${line}" |\
			awk -F '=' '/duration=/ {sub("\\..*", "", $2); printf $2; exit}')"
		title="$(ffprobe -v 0 -show_entries 'format_tags=title' "${line}" |\
			awk -F '=' '/title=/ {print $2}')"
		artist="$(ffprobe -v 0 -show_entries 'format_tags=artist' "${line}" |\
			awk -F '=' '/artist=/ {print $2}')"
		test -z "${title}" && title="$(basename "${line}")"

		printf "#EXTINF:${duration}, %s - %s\n" "${artist}" "${title}"

		path="$(printf "%s" "${line}" | urlescape)"
		printf "${url}%s\n\n" "${path}"
done</pre><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p>mailto:prx@si3t.ch?subject=generateur-de-liste-de-lecture-ameliore
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et
</p><p>recevoir les réponses à vos messages:
</p><p>https://si3t.ch/log/<em>commentaires</em>.txt
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-06-18-Diffuser-de-la-musique-vraiment-facilement.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-06-18T14:42:39Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Je suis depuis pu l'heureux possesseur d'écouteurs à conduction
</p><p>osseuse.
</p><p>Cela me faisait envie depuis un moment déjà, et après avoir
</p><p>testé, j'apprécie énormément écouter des podcasts en courant
</p><p>sans m'isoler des bruits alentours.
</p><p>J'ai alors souhaité accéder à ma musique de partout à partir du
</p><p>moment où j'ai un accès à internet.
</p><p>Me voilà alors en train de bricoler mpd (https://www.musicpd.org/)
</p><p>avec son serveur http intégré.
</p><p>Ça fonctionne, mais pour bien faire il faudrait un mot de passe. Le
</p><p>client est séparé du lecteur. Je bricole alors un VPN, mais c'est
</p><p>des couches sur des couches, ça m'agace, c'est compliqué pour
</p><p>finalement peu de choses.
</p><p>Je vous passe les tests de trucs à base de docker ou node.js.
</p><p>Franchement les gens, il faut arrêter avec ça!
</p><p>Je découvre alors un script PHP qui génère des playlists
</p><p>(https://github.com/lrkrol/Noctifer-Music). Pas mal du tout, mais ça
</p><p>ne fonctionne pas exactement comme je veux.
</p><p>Vous le sentez venir non? Voici le script de la mort qui tue qui va
</p><p>répondre à mon problème : m3ugen.sh
</p><p>L'idée est la suivante :
</p><p><ul>
<li>Hébergement de mes musiques sur mon serveur web http.</li>
</ul>
</p><p><ul>
<li>"Protection" de l'espace où les musiques sont stockées par mot de</li>
</ul>
</p><p>passe (htpasswd)
</p><p><ul>
<li>Génération d'un fichier m3u qui contient la liste de toutes les</li>
</ul>
</p><p>chansons.
</p><p><ul>
<li>Ouverture du fichier m3u avec VLC, et hop !</li>
</ul>
</p><p>Voici le script en question :
</p><pre>#!/bin/sh
# generate a m3u playlist of all files in directory $1

usage()
{
	printf "%s <directory> > file.m3u\n", $0
	exit 1
}
#https://rosettacode.org/wiki/URL_encoding#AWK
urlencode()
{
	awk '
	BEGIN {
		for (i = 0; i <= 255; i++)
			ord[sprintf("%c", i)] = i
	}

	# Encode string with application/x-www-form-urlencoded escapes.
	function escape(str, c, len, res) {
		len = length(str)
		res = ""
		for (i = 1; i <= len; i++) {
			c = substr(str, i, 1);
			if (c ~ /[-._*0-9A-Za-z]/)
				res = res c
			else if (c == " ")
				res = res "+"
			else
				res = res "%" sprintf("%02X", ord[c])
		}
		return res
	}

	# Escape every line of input.
	{ print escape($0) }
	'
}

test -d "$1" || usage

find "$1" -type f \
	-name '*.flac' -o \
	-name '*.FLAC' -o \
	-name '*.mp3' -o \
	-name '*.MP3' -o \
	-name '*.m4a' -o \
	-name '*.M4A' -o \
	-name '*.ogg' -o \
	-name '*.OGG' -o \
	-name '*.opus' -o \
	-name '*.OPUS' -o \
	-name '*.webm' -o \
	-name '*.WEBM' |\
	cut -c 3- |\
	urlencode</pre><p>Reste à créer des fichiers m3u pour chaque dossier. Pour l'instant,
</p><p>je laisse en aléatoire, et ça me va :)
</p><p>Petit détail, j'ai légèrement modifié ce script pour intégrer
</p><p>les identifiants puisque je protège l'accès au dossier contenant les
</p><p>musiques par mot de passe, histoire de ne pas être accusé de
</p><p>diffuser du contenu illégalement. J'ai donc ajouté à la fin:
</p><pre>cut -c 3- |\
urlencode |\
xargs printf "https://user:password@si3t.ch/dossier-inexistant-de-musique/%s\n"</pre><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p><pre><code>mailto:prx@si3t.ch?subject=Diffuser-de-la-musique-vraiment-facilement
</code></pre>
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et
</p><p>recevoir les réponses à vos messages:
</p><p><pre><code>https://si3t.ch/log/_commentaires_.txt
</code></pre>
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-06-10-si3tch-avec-dokuwiki.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-06-10T13:54:17Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Mon site est depuis peu propulsé par dokuwiki.
</p><p>EDIT (06/05/2024) : ce n'est plus le cas depuis un moment, retour à du minimaliste.
</p><p>https://www.dokuwiki.org/dokuwiki
</p><p>C'est un changement important pour moi qui favorise d'habitude les
</p><p>solutions bien plus minimalistes.
</p><p>Cependant, j'avais besoin de changer, car ma façon de travailler
</p><p>évolue et j'étais restreint par ma méthode de publication avec un
</p><p>Makefile.
</p><p>Déjà, je perdais beaucoup trop de temps à tout régénérer
</p><p>lorsque je changeais un bout de CSS. C'est stupide, mais j'avais du
</p><p>mal à m'en passer.
</p><p>Surtout, je ne pouvais pas éditer mon site si je n'étais pas face
</p><p>à mon ordinateur perso. Cela avait pour résultat de laisser traîner
</p><p>des fautes, certaines pages étaient à l'abandon, d'autres ne
</p><p>voyaient jamais le jour.
</p><p>Ajoutez à cela que je souhaites écrire et publier mes cours sur mon
</p><p>site...
</p><p>C'est là qu'arrive dokuwiki: il me permet d'éditer mes cours que je
</p><p>sois à la maison, coincé dans les bouchons avec mon smartphone, ou
</p><p>devant un des vieux ordinateurs sous windows 7 du collège.
</p><p>Il ne manque pas d'avantages par ailleurs :
</p><ul><li>La syntaxe reste simple. Je préfère le gemtext, mais celle de
</li></ul><p>dokuwiki tient la route.
</p><ul><li>À l'aide de plugins de faire des choses plus complexes si besoin.
</li></ul><p>Je peux donc écrire des formules mathématiques et chimiques avec
</p><p>KaTeX ou facilement tracer des schémas à l'aide de drawio (pour
</p><p>les circuits électriques, c'est vraiment génial). Tout ceci est
</p><p>possible sans avoir à installer toute la suite LaTeX, que je ne
</p><p>pouvais utiliser là-aussi QUE sur mon ordinateur perso.
</p><ul><li>Encore une fois, j'ai le même environnement de travail PARTOUT. Je
</li></ul><p>passais petit à petit de LaTeX à libreoffice pour pouvoir
</p><p>réaliser les modifications dans mon établissement (mais les
</p><p>polices manquaient, la version de libreoffice installée au collège
</p><p>est dépassée...).
</p><ul><li>J'ai besoin de pouvoir imprimer des cours propres. Après
</li></ul><p>recherche, la fonction "Impression dans un PDF" du navigateur, avec
</p><p>quelques menues adaptations du CSS, c'est parfait.
</p><ul><li>Les visiteurs peuvent proposer des corrections. J'ai envie d'un
</li></ul><p>espace de partage. Chacun peut créer un compte et participer à mes
</p><p>cours ou à la documentation auto-hébergement.
</p><ul><li>À propos de la doc auto-hébergement, j'espère davantage de
</li></ul><p>contributions et de corrections ainsi. On verra ^^.
</p><ul><li>La gestion des pages et des médias est pratique, j'ai pu classer
</li></ul><p>et trier mon bazar entassé depuis des années.
</p><ul><li>Il y a une fonction de recherche :)
</li>
<li>J'aimerais parfois bien savoir quels sont les dernières
</li></ul><p>modifications quand je visite un site. Dokuwiki le propose :)
</p><ul><li>C'est effectivement un petit peu plus lourd que du xhtml statique.
</li></ul><p>Cependant, la sauvegarde voire l'édition peut toujours se faire en
</p><p>éditant les fichiers txt bruts situés dans ''data/pages''.
</p><p>Il me reste évidemment du travail pour réellement avoir mes cours
</p><p>au format doku et autres détails, mais ça va le faire.
</p><p>J'apprécie énormément dokuwiki, je vous invite à le (re)tester
</p><p>;).
</p><h2>Et ton (b)log?
</h2><p>Je passe à un blog au format texte pur.
</p><p>C'est désormais un "shinobi website", que je génère avec atom.awk
</p><p>:)
</p><p>https://si3t.ch/log/<em>README</em>.txt Notes à propos de mon blog
</p><p>https://si3t.ch/w/doku.php?id=code:atom.awk atom.awk
</p><h2>Et Gemini dans tout ça?
</h2><p>C'est mon petit regret, je ne publierai plus via ce protocole. En
</p><p>tout cas, pas sous ce pseudo, et pas sur si3t.ch. Ce protocole n'est
</p><p>pas suffisamment répandu de toute façon, et gérer la publication
</p><p>sur plusieurs protocoles m'ajoutait une contrainte que je ne
</p><p>souhaitais plus.
</p><p><hr />
</p><p>Une réaction?
</p><p>Envoyez votre commentaire par mail (anonyme):
</p><p>mailto:prx@si3t.ch?subject=si3tch-avec-dokuwiki
</p><p>Voici quelques instructions pour utiliser la liste de diffusion et
</p><p>recevoir les réponses à vos messages:
</p><p>https://si3t.ch/log/<em>commentaires</em>.txt
</p><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-15-TaBr-part5-tabr-Makefile.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-15T15:26:55Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/code/TaBr.tgz">Si vous souhaitez vous approprier la suite "TaBr" dont je parle depuis plusieurs articles, vous pouvez en consulter les sources ici. (TaBr.tgz)</a><br /><p>Vous y trouverez un fichier README.txt qui explique rapidement les différents composants ainsi que les instructions pour créer les utilisateurs et configurer doas pour bien séparer les privilèges.
</p><p>Pour le reste, je vous ai préparé un Makefile qui simplifie l'installation et ajuste automatiquement les permissions.
</p><p>Je voudrais ici mettre en avant la commande "install" qui permet de faire ça beaucoup plus proprement qu'une suite de "cp", "mkdir", "chown" et "chmod".
</p><p>En gros, un simple "make install" et c'est prêt :)
</p><p>Tout d'abord, on précise quelques variables. Ce n'est sans doute pas parfait, mais c'est un bon début pour rendre la suite portable si un jour quelqu'un en a l'intention:
</p><pre>PREFIX		?=/usr/local
BINDIR		?=${PREFIX}/bin
SBINDIR		?=${PREFIX}/sbin
CGIDIR		?=/var/www/cgi-bin
CHPWREQDIR	?=/var/www/tabr_chpw_requests</pre><p>Je précise ensuite les trucs qui devront être compilés:
</p><pre>all: src/tabr_chpw_cgi src/hashmatchstr</pre><p>Reste à préciser les dépendances des fichiers à compier, histoire qu'ils soient recompilés en cas de modification de la configuration:
</p><pre>src/chpw_cgi/main.c: src/chpw_cgi/config.h
src/tabr_chpw_cgi: src/chpw_cgi/main.c
	${CC} -static -o $@ $?

src/hashmatchstr: src/hashmatchstr.c
	${CC} -o $@ $?</pre><p>Avant d'aller plus loin, on précise comment nettoyer les fichiers compilés. C'est surtout utile pour les tests
</p><pre>clean:
	rm src/tabr_chpw_cgi
	rm src/hashmatchstr</pre><p>La suite permet d'installer les fichiers en les rendant éxécutables et en les faisant appartenir à root ou _tabr_admin selon les cas :
</p><pre>install: src/tabr_chpw_cgi src/hashmatchstr
	install -o root -g daemon -m 0755 src/tabr_chpw_cgi ${CGIDIR}/tabr_chpw.cgi
	@# IMPORTANT: chmod 730, www can write but can't read
	install -o _tabr_admin -g www -m 0730 -d ${CHPWREQDIR}
	install -m 0755 -o root -g bin src/hashmatchstr ${BINDIR}/hashmatchstr
	install -m 0755 -o root -g bin src/tabr_adduser.sh ${SBINDIR}/tabr_adduser
	install -m 0755 -o root -g bin src/tabr_passwd.sh ${SBINDIR}/tabr_passwd
	install -m 0755 -o root -g bin src/tabr_deluser.sh ${SBINDIR}/tabr_deluser
	install -m 0644 -o root -g wheel src/tabr.conf /etc/</pre><p>Remarquez la ligne avec "-m 0730" qui permet de restreindre l'accès au dossier qui contiendra les requêtes pour changer de mot de passe.
</p><p>Enfin, parce que ça me manque dans de nombreux Makefile, je prévois de quoi faire le ménage:
</p><pre>uninstall:
	rm -rf ${CGIDIR}/tabr_chpw.cgi
	rm -f ${BINDIR}/hashmatchstr
	rm -f ${BINDIR}/tabr_adduser
	rm -f ${BINDIR}/tabr_passwd
	rm -f ${BINDIR}/tabr_deluser
	@printf "You probably should remove %s and %s too\n"\
		"${CHPWREQDIR}" "/etc/tabr.conf"</pre><p>Voilà de quoi me simplifier la vie et proposer des services à ma famille.
</p><p>Ici, je n'ai présenté que le mail et xmpp, mais il y en a en réalité un peu d'autres de prévus : dokuwiki (grâce à son interface de gestion des utilisateurs en CLI) qui offre un espace de publication ET de stockage. Il faut juste bien ajuster les ACL.
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/contact/">J'y pense, si ça intéresse quelqu'un, je peux vous proposer une adresse en @si3t.ch, il suffit de me faire signe.</a><br /><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=TaBr-Makefile-part5">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-15-TaBr-part4-tabr_chpw_cgi.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-15T14:10:19Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Les mots de passes sont générés aléatoirement à l'inscription.
</p><p>J'imagine que la plupart utiliseront la fonction "se souvenir du mot de passe" de leur appareil, mais voudront peut-être changer pour quelque chose de plus facile à retenir, ou bien obtenir un nouveau mot de passe dans le cas où le précédent soit oublié.
</p><p>Pour ça, chaque utilisateur a reçu une fiche avec un QR code rappelant le code de récupération du mot de passe.
</p><p>Il leur suffit d'accéder à la page de demande de changement de mot de passe qui est un CGI écrit en C par mes soins.
</p><p>De toute la suite TaBr, c'est la partie la plus sensible car elle est exposée.
</p><p>Je tenais dans tous les cas à ne pas connaître les mots de passe des utilisateurs, je ne pouvais donc les modifier "à la main".
</p><p>C'est aussi la partie dont je suis le plus fier, car j'ai réfléchi à tout ce qui pouvait être à ma portée afin de limiter les risques en terme de sécurité.
</p><p>Évidemment, je suis très curieux d'avoir votre avis sur la question.
</p><p>On y trouvera notamment :
</p><ul><li>Un délai d'attente avant de répondre pour éviter de multiples attaques bruteforce. Ça n'emêchera pas les appels avec plusieurs IP en simultané, mais ça limite la charge tout en restant acceptable pour l'utilisateur qui de toute façon ne change pas de mot de passe tout le temps.
</li>
<li>Utilisation de pledge afin d'éviter les appels à des fonctions inattendues.
</li>
<li>Utilisation de unveil pour renforcer encore le chroot de httpd et limiter les permissions en lecture et écriture vers un dossier ne particulier.
</li>
<li>Limite des tentatives de bots avec un captcha aléatoire.
</li>
<li>Utilisation de crypt_* pour utiliser des hash afin de cacher la réponse à un captcha.
</li></ul><h2>L'interface
</h2><p>Voici à quoi ressemble l'interface:
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/img/log/tabr-oubli.png">Aperçu de l'interface</a><br /><p>Oui, c'est il n'y a pas de paillettes, d'animations ou de boutons de partages vers les réseaux sociaux. Mais c'est accessible et ça fonctionne dans n'importe quel navigateur, même lynx. Moi, je trouve ça beau :P
</p><p>On remarque 4 champs :
</p><ul><li>le nom d'utilisateur, normal
</li>
<li>son code de récupération. Merci le html5 pour proposer un placeholder, bien que ça ne soit pas forcément utile (c'est facile de mettre un exemple à côté du label du champ.
</li>
<li>le nouveau mot de passe demandé (normal).
</li>
<li>un captcha aléatoire.
</li></ul><p>À propos du html5, je m'en sers pour valider au maximum ce que les utilisateurs proposent (longueur du mot de passe, validité du nom d'utilisateur...). Cependant, il vaut mieux revérifier ensuite, je ne vais pas confiance à tous les navigateurs pour supporter ces éléments correctement.
</p><h2>Le code
</h2><p>Le code est du C. C'est quelque chose que je maîtrise et qui me permet de profiter sans difficultés des générateurs de nombres aléatoires avec arc4random, de unveil, de pledge...
</p><p>Puisque c'est un peu long (~246 lignes uniques), je vais me concentrer ici seulement sur les parties "intéressantes".
</p><h3>config.h
</h3><p>On configure directement en C.
</p><p>On y trouve des variables, et surtout les templates html. Ces derniers ne sont pas très propres car il y a beaucoup de guillemets échappés, mais ce n'est pas quelque chose qu'on édite souvent.
</p><p>Par exemple, on y définit le dossier (à l'intérieur du chroot) où seront stockées les demandes de changement de mot de passe:
</p><pre>static const char *chpw_requests_dir = "/tabr_chpw_requests";</pre><p>On y voit aussi les différents types de captchas possibles avec les consignes associées:
</p><pre>/* captcha config */
enum 		{ DIGIT, LOWER, UPPER, PUNCT };
/* instructions displayed for humans, same order as above! */
static const char *instructions[] = {
	"Recopiez uniquement les chiffres",
	"Recopiez uniquement les lettres minuscules",
	"Recopiez uniquement les lettres majuscules",
	"Recopiez uniquement les symboles et ponctuation",
};</pre><p>Au niveau des templates html, je veux être sûr que la page ne soit pas mise en cache (avec un succès limité):
</p><pre>"<meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\">\n"
"<meta http-equiv=\"Pragma\" content=\"no-cache\">\n"
"<meta http-equiv=\"Expires\" content=\"0\">\n"</pre><p>j'attire votre attention sur la validation des champs.
</p><p>Un "title" permet de préciser ce qui est attendu à chaque fois.
</p><pre>"<p><label for=\"user\">Utilisateur:</label>\n"
"<input type=\"text\" name=\"user\" id=\"user\""
" placeholder=\"Paul\" required"
" title=\"Peut contenir des lettres minuscules, des chiffres, "
" des points, tirets, underscores."
" Ne doit pas commencer par un tiret. "
" Entre 1 et 31 caractères\""
" pattern=\"^[a-z0-9_\\.][a-z0-9_\\.\\-]{1,30}$\" />\n"
"</div>\n"</pre><p>Ici, le "pattern" me permet de reproduite une regex trouvée dans le code de "adduser", en la modifiant un peu au passage. Qui voudrait d'un nom d'utilisateur terminant pas "$"???
</p><p>J'impose aussi 15 caractères pour le nouveau mot de passe:
</p><pre>"<p><label for=\"newpass\">Nouveau mot (phrase) de passe:</label>\n"
"<input type=\"password\" name=\"newpass\" id=\"newpass\""
" placeholder=\"Respirer de la compote fait tousser\""
" title=\"15 caractères minimum\""
" minlength=\"15\" required /></p>\n"
"</div>\n"</pre><p>Pour le captcha, il y a les "%s" qui me permettront d'y mettre ce que je veux le moment voulu, puisque c'est une énigme aléatoire à chaque fois:
</p><pre>"<div>\n"
"<p><label for=\"answer\">Anti-pirate: </label>%s</p>\n"
"<pre class= \"center\">%s</pre>\n"
"<input type=\"text\" name=\"answer\" id=\"answer\" required />\n"
"</div>\n"
"<div>\n"
"<input type=\"hidden\" name=\"anshash\" id=\"anshash\" value=\"%s\" />\n"
"</div>\n"</pre><p>Pour finir, il y a les messages d'erreur affichés selon les cas:
</p><p>j
</p><pre>/* error messages */
static const char *errcaptcha = "Mauvaise réponse! 😱";
static const char *errusername = "Mauvais format. Le nom d'utilisateur doit avoir une longueur entre 1 et 31 caractères, ne peut pas commencer par un \"-\" et ne peut contenir que les symboles suivants: \"abcdefghijklmnopqrstuvwxyz0123456789-_.\"";
static const char *errshortpw = "Mot de passe trop court : au moins 15 caractères sont attendus. Une phrase peut fonctionner.";</pre><h3>main.c
</h3><p>C'est ici que le vrai code commence. Mais avant d'aller plus loin, je vais me préparer un petit café à partager avec vous.
</p><blockquote>☕ Slurp!
</blockquote><p>Je vous avais promis du unveil et du pledge. Rien de plus simple, on n'autorise l'accès que au dossier contenant les requêtes pour pouvoir y créer des fichiers avec unveil, et on promet seulement des entrée/sorties et écritures dans des fichiers avec pledge:
</p><pre>#ifdef __OpenBSD__
	/*
	if (unveil(chpw_requests_dir, "rwc") == -1)
		err(1, "unveil");
	unveil(NULL, NULL);
	if (pledge("stdio cpath wpath", NULL) == -1)
		err(1, "pledge");
	*/
#endif</pre><p>Avant d'aller plus loin, on va faire patienter un peu celui ou celle qui fait la requête avec un appel à "sleep". Le nombre de secondes d'attente sera aléatoire grâce à arc4random_uniform:
</p><pre>sleep(arc4random_uniform(MAXWAIT));</pre><p>On regarde maintenant si on doit traiter une demande. Cette dernière est passée en entrée, donc on lit stdin avec fgets:
</p><pre>if (fgets(rawpost, sizeof(rawpost), stdin) == NULL)
	if (ferror(stdin))
		http400("Request too long ?");</pre><p>On note au passage la fonction "http400", qui au même titre que "http500" permet de renvoyer le code d'erreur au navigateur si beosin et d'afficher un petit message en passant.
</p><p>Dans le cas où il n'y a pas de demande à traiter, on affiche un formulaire vide.
</p><pre>if (strlen(rawpost) == 0) {
	while (strlen(secret) < 6) {
		//secret[0] = '\0';
		memset(secret, '\0', sizeof(secret));
		rdmstr(question, sizeof(question));
		secret_class = strtosecret(question, secret);
	}</pre><p>Ici, je cherche à créer une chaîne de caractère aléatoire suffisamment longue, d'où la boucle "while" qui se répète tant que la longueur est inférieure à 6.
</p><p>À chaque tour, memset() s'assure que le chaîne est bien vide, puis un appel à rdmstr() permet d'obtenir une chaîne aléatoire.
</p><pre>size_t
rdmstr(char *s, size_t len)
{
	/* fill s with random chars */

	size_t l=0;

	const char charset[] =
		"0123456789"
		"abcdefghijklmnopqrstuvwxyz"
		"ABCDEFGHIJKLMOPQRSTUVWXYZ"
		"-_+~#()%,?;.:/!=";

	for (size_t i = 0; i < len; i++) {
		s[i] = charset[arc4random_uniform(strlen(charset))];
		l++;
	}
	s[len] = '\0';

	return l;
	
}</pre><p>Cette fonction pioche dans la liste de caractères définie dans "charset" grâce à arc4random_uniform().
</p><p>Notez que je n'ai choisi que des caractères spéciaux assez faciles d'accès sur un clavier (de smartphone notamment). On pourrait y ajouter des espaces et d'autres symboles plus étranges encore. On peut aussi prciser plusieurs fois un caractère si on veut augmenter sa probabilité d'apparaître. Je n'ai pas mis d'espace, j'ai pensé que ça pourrait prêter à confusion.
</p><p>S'ensuit la fonction strtosecret qui va choisir une classe de caractères à recopier et qui constituera la réponse au captcha:
</p><pre>int
strtosecret(const char *s, char *secret)
{
	/* choose a random class of char 
	 * secret is all char of the selected class
	 * from string s
	 */

	int char_classes[] = { DIGIT, LOWER, UPPER, PUNCT };
	int char_class = char_classes[arc4random_uniform(LEN(char_classes))];

	for (size_t i=0; i < strlen(s); i++) {
		switch (char_class) {
		case DIGIT:
			if (isdigit(s[i]))
				secret[strlen(secret)] = s[i];
			break;
		case LOWER:
			if (islower(s[i]))
				secret[strlen(secret)] = s[i];
			break;
		case UPPER:
			if (isupper(s[i]))
				secret[strlen(secret)] = s[i];
			break;
		case PUNCT:
			if (ispunct(s[i]))
				secret[strlen(secret)] = s[i];
			break;
		}
	}
	
	return char_class;
}</pre><p>Vous l'aurez compris, cette fonction lit la chaîne caractère par caractère et le recopie s'il correspond à la condition choisie aléatoirement.
</p><p>La classe de caractère choisie est retournée pour savoir quelle consigne afficher à l'utilisateur.
</p><p>On transforme la réponse en hash avec crypt_newhash(), pour permettre la vérification du captcha ensuite:
</p><pre>if (crypt_newhash(secret, "bcrypt,a", anshash,
		sizeof(anshash)) != 0)</pre><p>Reste à afficher le formulaire:
</p><pre>http200("text/html; charset=utf-8");
printf(form,
	instructions[secret_class],
	question,
	anshash
);</pre><p>Si au contraire on a reçu des données, il faut traiter la demande.
</p><p>Pour cela, on va découper le texte d'entrée:
</p><pre>get_post_field("user=", rawpost, user);
get_post_field("recovery=", rawpost, recovery);
get_post_field("newpass=", rawpost, newpass);
get_post_field("answer=", rawpost, answer);
get_post_field("anshash=", rawpost, anshash);</pre><p>La fonction get_post_field recherche dans "rawpost" la chaîne passée en premier argument et l'enregistre dans la dernière variable.
</p><p>Regardons-là de plus près:
</p><pre>char *
get_post_field(const char *str, const char *post, char *field)
{
	char *pos		= NULL;
	char buf[BUFSIZ] 	= {'\0'};


	char *r = strdup(post);
	char *tofree = r;
	char *tok = NULL;

	while ((tok = strsep(&r, "&")) != NULL) {
		if ((pos = strstr(tok, str)) == NULL) {
			continue;
		} else {
			if (strlcpy(buf, tok + strlen(str),
				sizeof(buf)) >= sizeof(buf))
					http500("strlcpy");
			break;
		}
	}

	if (urldecode(buf, field) < 0)
		http400("Bad request");

	free(tofree);
	return field;
}</pre><p>On remarque qu'elle fait appel à strsep(). Cette fonction modifie la chaîne, c'est pourquoi on a utilisé strdup() au préalable, et enregistré dans tofree la référence au pointeur qu'il faudra libérer avec free() ensuite.
</p><p>Une fois ces éléments rassemblés, on va vérifier que le nom d'utilisateur correspond à une regex:
</p><pre>if (regcomp(®_username, valid_username_regex,
		REG_EXTENDED) != 0) {
	regfree(®_username);
	http500("can't compile regex");
}

if (regexec(®_username, user, 0, NULL, 0) != 0) {
	regfree(®_username);
	http400(errusername);
}
regfree(®_username);</pre><p>Ici, regex.h n'est pas trop compliqué à utiliser puisqu'il s'agit de seulement vérifier si "ça match".
</p><p>Plus simple, on vérifie juste si le nouveau mot de passe demandé est assez long:
</p><pre>if (strlen(newpass) < 15)
	http400(errshortpw);</pre><p>Oui, 15 seulement... On va me détester si j'impose +.
</p><p>Reste à enregistrer la demande dans un fichier portant le nom d'utilisateur.
</p><p>La suite est donc un peu barbante, il s'agit juste de créer un chemin puis d'écrire dedans:
</p><pre>/* build the path to file with request */
if ((strlcpy(request_file, chpw_requests_dir, sizeof(request_file))
	> sizeof(request_file)) ||
	(strlcat(request_file, "/", sizeof(request_file))
	> sizeof(request_file)) ||
	(strlcat(request_file, user, sizeof(request_file))
	> sizeof(request_file)))
		http500("strlcpy & strlcat");


/* open the file and save data */
f = fopen(request_file, "w");
if (f == NULL)
	http500("can't open file to write");
fprintf(f, "%s\n", recovery);
fprintf(f, "%s\n", newpass);
fclose(f);</pre><p>Je termine en faisant un petit chmod afin de limiter qui aura accès à ce fichier.
</p><pre>chmod(request_file,
	S_IRUSR | S_IWUSR |
	S_IRGRP | S_IWGRP |
	S_IROTH | S_IWOTH
	);</pre><p>C'est le point dont je suis le moins satisfait, mais je n'ai pas trouvé mieux car:
</p><ul><li>httpd (slowcgi) doit pouvoir écrire dans les fichiers. Le propriétaire est donc "www".
</li>
<li>_tabr_admin doit pouvoir lire ces fichiers. Cependant, ce dernier n'appartient pas au groupe "www".
</li></ul><p>Par conséquent, ces fichiers sont lisibles par tous. TOUTEFOIS, le dossier dans lequel ils sont stockés n'est accessible en lecture QUE par _tabr_admin. L'utilisateur www ne peut que écrire dedans, et les autres n'ont aucune permission :
</p><pre>drwx-wx---   2 _tabr_admin  www       512 May 13 13:39 tabr_chpw_requests</pre><p>C'est LA partie de l'installation à ne pas rater.
</p><p>Heureusement, un petit Makefile est prévu pour ça. On en parle dans le prochain article :)
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=TaBr-tabr_chpw_cgi-part4">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-15-TaBr-part3-tabr_passwd.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-15T13:54:04Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Ce script est censé s'utiliser ainsi, en tant que _tabr_admin:
</p><pre>doas -u _tabr_admin tabr_passwd /var/www/tabr_chpw_requests/</pre><p>Comme on peut le voir, il prend en argument un répertoire. Ce dossier contient des fichiers au nom de l'utilisateur demandant le changement de mot de passe. À l'intérieur, on y trouvera sur 2 lignes respectives le code de récupération de l'utilisateur généré à l'inscription et le nouveau mot de passe demandé.
</p><p>En réalité, on utiliserait plutôt ce script en l'ajoutant dans le crontab de l'utilisateur _tabr_admin:
</p><pre># crontab -u _tabr_admin -e
*/1 * * * *     /usr/local/sbin/tabr_passwd /var/www/tabr_chpw_requests</pre><p>Le script va :
</p><ul><li>Vérifier que l'utilisateur existe
</li>
<li>Vérifie le code de récupération
</li>
<li>Change le mot de passe
</li>
<li>Alerte l'admin, que la requête aboutisse ou non.
</li></ul><p>On est parti pour décortiquer le script:
</p><p>Comme d'hab, on explique comment ça marche:
</p><pre>usage()
{
	printf "%s\n" "$0 <directory containing requests>"
	exit 1
}</pre><p>Ensuite, voici une fonction qui va se charger de terminer le script en alertant dans tous les cas l'admin. D'ailleurs, on voudra sans doute créer un alias dans "/etc/mail/aliases" pour rediriger le mail
</p><pre>end()
{
	# $1 : file
	# $2 : message
	# $3 : exit code

	## alert root
	cat << EOF | mail -s "$(basename $1) password change request" ${admin}
$1 was created to change password and returned:
$2
EOF
	rm -f "$1"

	exit $3
}</pre><p>On voit dans cette fonction qu'elle envoie un mail à l'admin définit dans "/etc/tabr.conf" indiquant qu'il y a eu demande de changement de mot de passe. Ensuite, on indique un éventuel message d'erreur.
</p><p>Dans tous les cas, on supprime le fichier de demande de changement de mot de passe avant de quitter.
</p><p>On peut passer à la fonction qui va se charger de traiter la demande:
</p><pre>handle_request() {
	u="$(basename ${1})"

	## check if user is indeed registered
	[[ -e $data/$u ]] || end "${1}" "No user $u found" 1</pre><p>Cette fonction prend en argument le chemin complet vers le fichier de demande de changement. Ce fichier porte le nom de l'utilisateur, on le met dans une variable "$u" comme à l'accoutumée.
</p><p>On vérifie avant d'aller plus loin qu'on a bien un fichier de récupération pour l'utilisateur en question.
</p><pre>	## check if recovery match user hashed recovery
	# recovery is on first line
	#recovery="$(sed -n '1p' ${1})"
	head -n 1 "${1}" | /usr/local/bin/hashmatchstr $(cat ${data}/${u}) \
		|| end "${1}" "Wrong recovery code" 1
</pre><p>On vérifie ici que le code de récupération précisé par l'utilisateur correspond au hash de ce code enregistré lors de l'inscription. Pour cela, on utilise un bout de C "hashmatchstr".
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/log/2023-05-04-Check-if-a-string-match-a--bcrypt--hash.xhtml">hasmatchstr fait appel à la fonction "crypt_checkpass".</a><br /><p>Ensuite, on récupère le mot de passe demandé et on procède aux modification:
</p><pre>
	newpw="$(sed -n '2p' ${1})" # pw on 2nd line
	newpwhash="$(print "%s" "${newpw}" | encrypt -b a )"

	## change system pw
	doas /usr/sbin/usermod -p "${newpwhash}" "${u}"

	## xmpp
	printf "%s\n%s\n" "${newpw}" "${newpw}" | 
		doas /usr/local/sbin/prosodyctl passwd "${u}@${domain}"

	end ${1} "Everything seems OK" 0
}</pre><p>usermod attend le hash du mot de passe, d'où l'appel à "encrypt".
</p><p>Vous noterez ici la petite astuce avec "printf" pour prosody qui attend le nouveau mot de passe en entrée.
</p><p>Enfin, on appelle la fonction ci-dessus par une boucle sur tous les fichiers du dossier passé en argument. On se sert pour cela de "find", c'est plus propre et gère les éventuels noms de fichiers chelous (je ne fais pas confiance à ce qu'un petit malin a pu éventuellement réussir à déposer malgré toutes mes précautions).
</p><pre>[[ $# -ne 1 ]] && usage

# loop over file lists
find "$1"/ -type f | while read -r request_file; do
	handle_request "${request_file}"
done</pre><p>Ces fichiers contenant les requêtes peuvent être créés via un script, appelé via l'instruction "ForceCommand" lors d'une connexion SSH.
</p><p>Cependant, ce n'est pas très facile d'accès pour les gens normaux.
</p><p>Aussi, j'ai prévu un petit code CGI afin de demander le changement de mot de passe en ligne.
</p><p>Mais ça, c'est pour le prochain article ^^
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=TaBr-tabr_passwd-part3">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-14-TaBr-part2-tabr_deluser.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-14T21:38:21Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Ce 2e script est très court, mais autant le prévoir tout de suite.
</p><p>Comme son nom l'indique, il permettra de supprimer un utilisateur.
</p><p>Il s'utilisera ainsi:
</p><pre>doas -u _tabr_admin tabr_deluser hseldon</pre><p>Comme d'hab, on commence par charger la configuration, prévoir une fonction qui indique comment se servir du script, et vérifier qu'un nom d'utilisateur a bien été donné en argument:
</p><pre>. /etc/tabr.conf

usage()
{
	printf "%s <username>\n" $0
	exit 1
}

## get arguments into variables
[[ -z "${1}" ]] && usage</pre><p>Vous noterez ici que j'utilise un test "si chaîne nulle" et non "si nombre d'argument est égal à 1". C'est parce que j'ai passé le flag "-e" au shebang, qui provoque l'arrêt du script en cas d'erreur. Or, si un test échoue, c'est considéré comme une erreur.
</p><p>Pour simplifier la suite, on met le nom d'utilisateur dans une variable:
</p><pre>u="${1}"</pre><p>Et c'est tout, on peut supprimer l'utilisateur:
</p><pre>## system user
doas /usr/sbin/userdel -r "${u}"</pre><p>Vous noterez l'option "-r" qui permet de supprimer aussi le dossier personnel de l'utilisateur.
</p><pre>## xmpp account
doas /usr/local/sbin/prosodyctl deluser "${u}@${domain}"</pre><p>On en fait de même avec prosody.
</p><p>Si on avait ajouté l'utilisateur à une installation dokuwiki, on pourrait aussi avoir ensuite:
</p><pre>php /path/to/dokuwiki/bin/plugin.php usermanager delete hseldon</pre><p>Pour terminer, on supprimer les fichiers qui contenaient le code de récupération et les instructions destinées à l'utilisateur:
</p><pre>## recovery file
rm ${data}/${u}
## instructions
rm "${data_instructions}/${u}.txt"</pre><p>Et voilà!
</p><p>Prochains articles : on décrit le changement de mot de passe, et l'interface CGI qui permettra de faire la demande.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=TaBr-tabr_deluser-part2.gmi">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-13-TaBr-part1-tabr_adduser.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-13T13:22:25Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Le rôle de tabr_adduser sera non seulement de créer un un nouvel utilisateur, mais aussi de produire une fiche qui contiendra des explications et des codes de récupération afin de permettre à ce dernier de modifier son mot de passe.
</p><p>Par exemple, elle ressemblera à ça :
</p><pre># Notice d'utilisation de ton compte sur si3t.ch

Ton nom d'utilisateur est: hseldon
Ton mot de passe est: nat#)AUcG#72)uxF


## SERVICES

Tu disposes d'un accès au serveur si3t.ch comprenant:

* une adresse mail: hseldon@si3t.ch
* un compte de messagerie instantanée XMPP: hseldon@si3t.ch


## CHANGER DE MOT DE PASSE

Tu peux changer ton mot de passe à l'adresse suivante:
	https://si3t.ch/tabr/oubli

Tu auras besoin de ton code de récupération.
NOTE-LE SOIGNEUSEMENT:

	MPw9XP-oMs%aU-zk*cX2-fhJGh2-kIQQd0


## QRCODE
Scanne ce QR code pour retrouver toutes les informations importantes:

[...snip...]


## ADRESSE MAIL

Tu peux utiliser ton adresse mail avec n'importe quel client de
messagerie et les paramètres suivants:

* Identifiant: ton nom d'utilisateur
* Serveur IMAP: si3t.ch - port 993
* Serveur SMTP: si3t.ch - port 587 - STARTTLS

Tu peux aussi utiliser le webmail en ouvrant ce lien:
	https://webmail.si3t.ch


## MESSAGERIE INSTANTANÉE XMPP

Tu disposes d'un compte XMPP te permettant de communiquer en temps
réel, partager des photos, vidéos...

Pour cela, tu auras besoin d'un client XMPP.
Sur smartphone, je te conseille l'appli Conversations:

* Sur F-Droid:
https://f-droid.org/packages/eu.siacs.conversations/
* Sur Google Play:
	https://play.google.com/store/apps/details?id=eu.siacs.conversations

Tu peux aussi utiliser le client en ligne en ouvrant le lien suivant:
	https://si3t.ch:5281/conversejs</pre><p>Le script sera lancé ainsi :
</p><pre>doas -u _tabr_admin tabr_adduser hseldon</pre><p>Il fera appel à doas pour obtenir les permissions superutilisateur. Il faudra donc avoir au préalable configuré "/etc/doas.conf" avec :
</p><pre>permit nopass _tabr_admin cmd /usr/sbin/useradd
permit nopass _tabr_admin cmd /usr/local/sbin/prosodyctl</pre><p>Avant d'aller plus loin, il faut comprendre que de quelques variables sont définies dans le fichier "/etc/tabr.conf" que voici:
</p><pre># TaBr configuration file
# edit to suit your preferences

data=/var/_tabr_admin/tabr-data
data_instructions=/var/_tabr_admin/tabr-data/instructions
usergroup="_tabr_users"
admin=_tabr_admin
domain="si3t.ch"
recovery_url="https://${domain}/tabr/oubli"

print_notice() {

	u="${1}" # user
	pw="${2}" # password
	recovery="${3}" # recovery code

	cat << EOF
# Notice d'utilisation de ton compte sur $domain

Ton nom d'utilisateur est: ${u}
Ton mot de passe est: ${pw}

[...]</pre><h2>Le script à la loupe
</h2><p>Tout d'abord, on veille à ce que le script s'arrête à la moindre erreur.
</p><pre>#!/bin/sh -e</pre><p>On charge le fichier de configuration pour avoir accès aux variables:
</p><pre>. /etc/tabr.conf</pre><p>C'est parti pour définir quelques fonctions.
</p><p>La première permettra de fermer le script avec un code d'erreur après avoir affiché un message expliquant la raison.
</p><pre>die()
{
	printf "%s\n" "$*"
	exit 1
}</pre><p>On continue avec les classiques, on explique comment se servir du script:
</p><pre>usage()
{
	printf "%s <username> <recovery-passphrase>\n" "$0"
	printf "if not specified, a random recovery-passphrase will be generated\n"
	exit 1
}</pre><p>Voici une fonction pour générer un mot de passe aléatoire:
</p><pre>genpw()
{
	#jot -rcs '' $1 33 126
	tr -cd '[:alnum:]~#()%@,?;.!*' < /dev/urandom |\
		fold -w $1 | head -n 1
}</pre><p>Comme on peut le voir, j'ai commenté une version avec "jot" qui proposait une suite aléatoire de tous les caractères entre le n°33 et le 126 (voir man ascii).
</p><p>Cependant, j'ai opté pour une solution avec "tr" me laissant le choix des caractères possibles. J'en reste donc aux lettres, chiffres et ponctuation habituelle. Cela évite pour les utilisateurs moins à l'aise de devoir fouiller dans le clavier de leur smartphone.
</p><p>Ensuite, on génère un code de récupération aléatoire:
</p><pre>rdm-recovery-pass()
{
	genpw 30 |
		sed -E 's/^(.{6})(.{6})(.{6})(.{6})/\1-\2-\3-\4-/'
}</pre><p>L'appel de "sed" permet d'insérer des tirets "-" à intervalles réguliers pour faciliter la saisie ensuite.
</p><p>On s'assure ensuite qu'on a bien le bon nombre d'arguments pour le bon fonctionnement du script:
</p><pre>## get arguments into variables
[[ $# -ge 1 ]] && [[ $# -lt 3 ]] || usage</pre><p>On met le nom d'utilisateur dans une variable plus facile à identifier:
</p><pre>u="${1}"</pre><p>S'ensuit un test pour vérifier si une phrase de récupération a été précisée. Je pense notamment à ma famille pour qui il serait facile de proposer des phrases faciles à retenir en référence à un vécu commun. Sinon, un code de récupération est généré.
</p><pre>[[ -z "${2}" ]] && recovery="$(rdm-recovery-pass)" || recovery="${2}"</pre><p>On vérifie si un utilisateur au nom de celui demandé existe déjà:
</p><pre>## check if user already exist
id -u $u > /dev/null 2>&1 && die "User already exists"
#[[ -e $data/$u ]] && die "User already exists" # commented, previous is safer</pre><p>On génère un mot de passe totalement aléatoire. J'ai choisi une longueur de 16 caractères. On peut bien sûr faire mieux, mais si j'en rajoute, on va m'envoyer des cailloux.
</p><pre>## generate random password
pw="$(genpw 16)"</pre><p>On enregistre le code de récupération dans un fichier portant le nom de l'utilisateur (unique), situé dans un dossier qui appartient à _tabr_admin, dont seul _tabr_admin a accès. C'est en réalité dans un dossier de son répertoire personnel, dont j'ai ajusté le spermissions en 0700.
</p><pre>## store recovery pass
encrypt -b a ${recovery} > $data/$u</pre><p>On crée l'utilisateur système.
</p><pre>## create system user
doas /usr/sbin/useradd -m -g $usergroup -s /sbin/nologin -p "$(encrypt -b a "${pw}")" "$u"</pre><p>Cet utilisateur peut recevoir des mails puisque dovecot et smtpd sont configurés pour utiliser le processus de login de l'OS.
</p><p>On remarque plusieurs choses dans cette commande:
</p><ul><li>On crée un $HOME à l'utilisateur (-m)
</li>
<li>On demande à ce qu'il appartienne au groupe _tabr_users
</li>
<li>On lui attribue le shell /sbin/nologin. Autrement dit, il est désactivé.
</li>
<li>On définit aussitôt son mot de passe en passant le hash de ce dernier avec la commande "encrypt" .
</li></ul><p>On peut désormais créer le compte xmpp. Ici, il y a une petite bidouille pour passer le mot de passe avec printf:
</p><pre>## create xmpp account
printf "%s\n%s\n" "${pw}" "${pw}" | doas /usr/local/sbin/prosodyctl adduser "${u}@${domain}"</pre><p>On termine par générer les instructions à envoyer qui seront stockées dans un fichier puis affichée.
</p><p>Libre à l'admin d'envoyer/imprimer/...? ce fichier texte.
</p><pre>## generate notice with qr code
print_notice "${u}" "${pw}" "${recovery}" > ${data_instructions}/${u}.txt
cat ${data_instructions}/${u}.txt</pre><p>Enfin, on rappelle à l'admin de supprimer le fichier contenant les données du nouvel utilisateur rapidement, une fois qu'elles ont été transmises:
</p><pre>print "*** WARNING ***\n%s\n" \
        "You probably should delete ${data_instructions}/${u}.txt very soon"</pre><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=TaBr-tabr_adduser-part1">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-12-TaBr-suite-gestion-serveur.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-12T13:59:15Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Je l'évoquais dans un précédent article : j'ai réfléchi à la mise en place d'un serveur à utilisation familiale, voire de quartier.
</p><p>Après quelques temps à coder, c'est chose prête, et je vais détailler ici les choix et les scripts utilisés.
</p><p>Tout d'abord, quelques détails sur la méthode choisie:
</p><ul><li>Les utilisateurs sont de vrais utilisateurs système. Cela veut dire qu'il ne pourra pas en avoir plus que la limite par défaut que je ne souhaite pas changer, c'est à dire 2147483647. Autant dire que la famille peut être très nombreuse ^^.
</li>
<li>Les services actuellement gérés sont le mail (SMTP + IMAP + Webmail) et la messagerie instantanée (XMPP + client). J'envisage d'en ajouter à l'avenir, notamment dokuwiki et un dépôt de fichier voire NextCloud (mais ce dernier reste trop gros).
</li>
<li>J'ai séparé au maximum les privilèges. Dit autrement, ce n'est pas root qui va lancer tous les scripts. Pour accéder à des droits superutilisateur, c'est "doas" qui sera employé.
</li>
<li>Un administrateur "_tabr_admin" lancera les commandes. Son compte est désactivé par défaut (il n'a pas de shell), et sera donc accédé par doas. Il est aussi le propriétaire des fichiers contenant les données sensibles.
</li>
<li>Pour séparer les privilèges, chaque utilisateur appartient à un groupe "_tabr_users". Cela me servira pour mettre en place un accès SSH, et surtout SFTP et une configuration par groupe d'un chroot.
</li></ul><p><span class="gemini-fragment">=> </span><a href="https://si3t.ch/ah/fr/#_89_SFTPdansunchroot">Pour la mise en place d'un chroot SFTP, c'est facile.</a><br /><p>4 composants sont prévus :
</p><ul><li>tabr_adduser : pour ajouter les utilisateurs. Il crée au passage un code de récupération pour changer le mot de passe.
</li>
<li>tabr_deluser : supprime un utilisateur et toute référence à ce derier
</li>
<li>tabr_passwd : traite les demandes de changement de mot de passe. Il sera appelé via une tâche cron.
</li>
<li>tabr_chpw_cgi : une interface web pour demander le changement de mot de passe. Pour un public un peu plus geek, j'utiliserais plutôt une identification par clé ssh et un script appelé à la connexion avec "ForceCommand".
</li></ul><p>On détaillera chaque composants dans une série d'articles à venir.
</p><p>Pour finir celui-ci, je vous présente seulement le fichier Makefile qui permet l'installation:
</p><pre># tabr suite
# prx <prx@si3t.ch>

# Quelques variables...
PREFIX		?=/usr/local
BINDIR		?=${PREFIX}/bin
SBINDIR		?=${PREFIX}/sbin
CGIDIR		?=/var/www/cgi-bin
CHPWREQDIR	?=/var/www/tabr_chpw_requests

# Tout ce qu'il faudra compiler
all: src/tabr_chpw_cgi src/hashmatchstr

# chpw_cgi sera à recompiler si on modifie sa configuration
src/chpw_cgi/main.c: src/chpw_cgi/config.h

# Comment compiler tabr_chpw_cgi. 
# On utilise -static car il sera dans un chroot
src/tabr_chpw_cgi: src/chpw_cgi/main.c
	${CC} -static -o $@ $?

# Compilation de hashmatchstr, l'outil
# qui permet de comparer les hash et les passwords
src/hashmatchstr: src/hashmatchstr.c
	${CC} -o $@ $?

# On prévoit comment remettre à zéro
clean:
	rm src/tabr_chpw_cgi
	rm src/hashmatchstr

# Installation des fichiers.
# On utilise la commande install pour 
# gérer finement les permissions
install: src/tabr_chpw_cgi src/hashmatchstr
	install -o root -g daemon -m 0755 src/tabr_chpw_cgi ${CGIDIR}/tabr_chpw.cgi
	@# IMPORTANT: chmod 730, www can write but can't read
	install -o _tabr_admin -g www -m 0730 -d ${CHPWREQDIR}
	install -m 0755 -o root -g bin src/hashmatchstr ${BINDIR}/hashmatchstr
	install -m 0755 -o root -g bin src/tabr_adduser.sh ${SBINDIR}/tabr_adduser
	install -m 0755 -o root -g bin src/tabr_passwd.sh ${SBINDIR}/tabr_passwd
	install -m 0755 -o root -g bin src/tabr_deluser.sh ${SBINDIR}/tabr_deluser
	install -m 0644 -o root -g wheel src/tabr.conf /etc/

# On prépare aussi le nettoyage
uninstall:
	rm -rf ${CGIDIR}/tabr_chpw.cgi
	rm -f ${BINDIR}/hashmatchstr
	rm -f ${BINDIR}/tabr_adduser
	rm -f ${BINDIR}/tabr_passwd
	rm -f ${BINDIR}/tabr_deluser
	@printf "You probably should remove %s and %s too\n"\
		"${CHPWREQDIR}" "/etc/tabr.conf"</pre><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=TaBr-suite-gestion-serveur">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-04-Check-if-a-string-match-a--bcrypt--hash.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-04T16:55:17Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><pre>/* 
 * Description: Check if a hash match a string 
 * Version:  0.1
 * Licence:  MIT
 * Author:  prx prx@si3t.ch
 */

#include <err.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <pwd.h>
#include <unistd.h>

/* compare password passed on stdin with hash passed as argv[2] */

int 
main(int argc, char *argv[])
{

	char pw[LINE_MAX] = {'\0'};

	if (argc != 2)
		errx(1, "usage: printf \"pw\" | %s <hash>", argv[0]);

	if (fgets(pw, LINE_MAX, stdin) == NULL)
		err(1, "fail to read from stdin");
	pw[strcspn(pw, "\n")] = '\0'; /* remove ending \n if any */

	if (crypt_checkpass(pw, argv[1]) != 0)
		return 1;

	printf("match \\o/\n");
	return 0;
}</pre><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-05-01-family-server.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-05-01T14:18:46Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><blockquote>Allez, ça serait quand même bien que vous mettiez Whatsapp, comme ça on pourrait créer un groupe. Ça serait vachement sympa pour les photos des enfants. Et puis c'est pas pratique les SMS groupés, on ne sait jamais trop si on répond à tout le monde.
</blockquote><p>Alors non, Whatsapp, vraiment pas. GAFAM, vie privée, données personnelles, tout ça tout ça.
</p><p>Mais je sais bien au fond de moi que les photos envoyées par MMS, ce n'est pas tellement privé non plus finalement.
</p><p>Alors si je refuse, que puis-je proposer à la place?
</p><p><span class="gemini-fragment">=> </span><a href="https://delta.chat/fr/">Deltachat est génial en remplacement.</a><br /><p>Il suffit d'une adresse mail, que tout le monde a.
</p><p>Encore faut-il, si je veux pleinement garder le contrôle sur les photos de famille, que tout le monde utiliser un serveur mail adapté -- PAS GMAIL.
</p><p>J'ai la chance d'avoir un serveur à la maison, je peux donc en théorie créer un compte mail pour chaque personne dans la famille. C'est un peu pénible pour moi, et j'entends déjà les "j'ai oublié mon mot de passe :s". Ceci dit, ça pourrait être un joli cadeau de Noël un jour pour tout le monde : une adresse mail propre gérée à la maison.
</p><p>Bon, sinon, il y a Signal. Cependant, ça m'ennuie vraiment de devoir m'appuyer sur un système qui n'existera peut-être plus dans 5 ans. C'est aussi le cas pour Deltachat en théorie, même si le mail sur lequel cet outil repose restera toujours fonctionnel.
</p><p>Un autre défaut à Deltachat qui pourtant semble quasi-parfait avec son système d'invitation une fois l'effort de créer des comptes mails à tout le monde : il n'y a pas de client disponible sous OpenBSD. Je rêve juste d'un petit client en console, même pas besoin du gros machin GUI. Un jour peut-être ^^.
</p><p>Ceci dit, Deltachat pose le souci de pouvoir lire les messages qui ont été chiffrés avec un client mail aute que celui de DeltaChat. Ça risque d'en perturber quelques uns.
</p><p>Une autre idée que je souhaite tester, ce serait d'utiliser mon serveur XMPP.
</p><p>J'ai pensé à utiliser le système d'invitations. Cependant, ce n'est pas si simple pour quelqu'un n'ayant pas trop l'habitude des clients XMPP (mais je conseille vivement mod_invites).
</p><p>Je me suis demandé aussi si prévoir un répertoire LDAP avec identifiants pour chaque user ne serait pas pratique, mais il faut avouer que l'intégration de LDAP n'est pas très bien documentée. En tout cas, pas assez pour moi.
</p><p>De plus, ça signifie que chaque service soit capable de parler LDAP, donc chacun de ces services est une nouvelle voie d'accès pour des attaques sur le serveur afin de piquer les identifiants de quelqu'un.
</p><p>Je préfère les choix par défaut des développeurs, c'est + sûr.
</p><p>Il faut me rendre à l'évidence : je vais créer des comptes pour chacun. À moi de réfléchir à une façon de leur permettre de changer/récupérer leurs mots de passe. Non seulement cela m'évitera d'intervenir, mais m'évitera d'avoir connaissance de ces identifiants.
</p><p>Pour l'instant, j'envisage les choses ainsi:
</p><ul><li>Création d'un compte avec mot de passe aléatoire ainsi qu'un code de récupération, une sorte de longue phrases. À la création, une fiche imprimable avec un QR code contenant les instructions et codes de récupération sera généré : c'est ce que j'enverrai à mes proches.
</li>
<li>Interface pour changer le mot de passe via un script CGI. Je me rend compte que le faire via gemini serait presque plus sûr puisque ça permettrait d'utiliser les certificats utilisateurs plutôt qu'un mot de passe, mais bon, mes proches n'en sont pas là. Pour l'instant, ça sera derrière une authentification http (htpasswd).
</li>
<li>Pour aller + loin, pour les + geeks, on pourrait envisager plutôt d'utiliser les clés SSH, avec un ForceCommand qui appelerait un script permettant le changement de mot de passe.
</li>
<li>Le changement de mot de passe modifiera pour chacun des services : mail, xmpp, dokuwiki, ... que sais-je?
</li></ul><p>Tout ceci devrait être scripté pour faciliter l'automatisation.
</p><blockquote>Mais tu recrées un CHATONS en fait?
</blockquote><p>C'est un peu l'idée, alors que dernièrement avec les 3hg on a quitté le collectif CHATONS.
</p><p>Ce que j'envisage de faire ici sera à une bien plus petite échelle, avec 1 seul domaine.
</p><p>De plus, je n'ai pas le temps de participer au collectif, alors s'estampiller membre des CHATONS semblait un peu trop hypocrite.
</p><p>Par ailleurs, ça sera nettement mieux organisé. Je me laisse le temps :)
</p><p>Quoi qu'il en soit, ce ne sont que des idées pour l'instant : c'est parti pour le code!
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=family-server">Envoyez votre commentaire par mail (anonyme).</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2023-04-23-random-passwords-from-manpages.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2023-04-23T13:45:12Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Reading StackOverflow, I ran into a command to generate a list of words picked randomly in a wordlist or in a manpage.
</p><p>I found the idea quite funny and challenged myself to make it a thing.
</p><p>Find below a script to choose a random manpage on the system and pick randoms words to generate a memorable password :
</p><pre>#!/bin/sh
# Random memorable password from manpages
# license: MIT <prx@si3t.ch>
# usage : rdmempw.sh <words length> (default: 6)

# default is 6 words
[[ $1 -gt 0 ]] && w=$1 || w=6

# find a random manpage
manpage="$((apropos -s 1 .; apropos -s 5 .; apropos -s 6 .) |\
	sort -R |\
	awk '{sub("\\(.*|,", "", $1); print $1; exit}')"

man $manpage |\
	tr " " "\n" |\
	sort -Ru |\
	awk -v w="$w" '
	# keep only word at least 4 char long
	/^[[:alnum:][:digit:]]{4,}$/ {
		pw = pw $0
		n++
		if (n > w) { exit }
		pw = pw "-"
	}
	END { print pw }
'</pre><p>As you can see, "apropos" gives a list of availables manpages. I only use sections 1, 5 and 6 since the others are quite complex.
</p><p>I use a lot of "sort -R" to randomize the wordlists.
</p><p>Then, "awk" print the manpage, removing parentheses.
</p><p>After, I call "man" and "tr" to replace every spaces with newlines so I can randomize with "sort" the wordlist. "awk" is used again to store words long enough in a string. When anough words are picked, we exit and display the password.
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/cgi-bin/pw">I've updated my online password generator if you want to try.</a><br /><p>I guess it could be faster by using a cache.
</p><h2>Comments?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=random-passwords-from-manpages">Comments by mail</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mailing list instructions</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-12-23-lait-de-poule.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-12-23T15:20:59Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Voici une boisson chaude qui "donne des forces" pour affronter le froid de l'hiver (comme dit Mamy).
</p><p>Mettre un jaune d'oeuf au fond d'un mug.
</p><p>Ajouter 2 cuillères à café de sucre roux ou 1 de miel.
</p><p>Saupoudrer d'un peu de cannelle.
</p><p>Verser du lait bien chaud tout doucement dessus, en agitant vivement pour éviter que le jaune ne cuise.
</p><p>Déguster avec une tartine grillée et du beurre demi-sel.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=lait-de-poule">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-11-25-36100.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-11-25T12:07:02Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Par souci écologie, et comme tout le monde par souci économique, je surveille ma consommation de carburant.
</p><p>Je roule à 110 km/h sur autoroute, je freine le moins possible et laisse plutôt mon véhicule ralentir en relachant l'accélérateur, j'abuse du régulateur de vitesse.
</p><p>Voilà un moment que je n'avais pas regardé l'ordinateur de bord, et j'ai eu la bone surprise de lire ce matin :
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/img/log/36100.jpg">/img/log/36100.jpg</a><br /><p>\o/
</p><p>Notez que je roule en clio III diesel de 2012. Le véhicule est loin d'être ce qui se fait de moins polluant.
</p><p>Pour aller travailler, je dois rouler 100 km tous les jours.
</p><p>Cependant, rien qu'avec une conduite économe, je suis sûr de faire beaucoup mieux que les autres SUV.
</p><p>Je vous invite à essayer de modifier votre conduite. C'est reposant en plus !
</p><p><span class="gemini-fragment">=> </span><a href="https://web.archive.org/web/20221017190948/https://lehollandaisvolant.net/?id=20220808112001">Combien économise-t-on en roulant à 110 au lieu de 130 km/h sur autoroute ? – Science étonnante</a> <span class="gemini-fragment">|</span> <a href="https://web.archive.org/web/20221017190923/https://sebsauvage.net/links/?WcRV2g">Pénurie de carburant : On a testé un stage d’écoconduite pour utiliser moins d’essence au kilomètre</a><br /><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=36100">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-11-17-unwind-config-no-censorship.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-11-17T11:08:23Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Certains Fournisseurs d'accès à internet mentent, leurs serveurs DNS envoient de fausses réponses lorsqu'on cherche à atteindre certains domaines.
</p><p>C'est ce qui m'est arrivé récemment en voulant faire une recherche sur http://www.fourtoutici.ac/. Requête échouée.
</p><p>Or, le site n'était pas en panne.
</p><p>J'utilise unwind, le résolveur/cacheur de noms de domaines fourni de base dans OpenBSD. Ce dernier semblait donc s'appuyer sur les réponses de mon FAI, il n'arrivait pas à tout faire seul.
</p><p>Voici donc une modification du fichier /etc/unwind.conf qui permet de résoudre les noms de domaines dans l'ordre suivant (en cas d'échecs) :
</p><p>unwind tente de se débrouiller seul, puis il demande à quad9 via un accès DoT et enfin demande aux serveurs de FDN sans DoT. Tout à la fin, si rien n'est trouvé, c'est le FAI qui répond, utile dans le cas des portails captifs.
</p><pre>block list "/var/unwind.block" log

fdn1=80.67.169.12
fdn2=80.67.169.40
fdnip6_1=2001:910:800::12
fdnip6_2=2001:910:800::40
quad9=9.9.9.9
quad9_ip6=2620:fe::fe

forwarder { $quad9 DoT }
forwarder { $quad9_ip6 DoT }
forwarder { $fdn1 }
forwarder { $fdnip6_1 }
forwarder { $fdn2 }
forwarder { $fdnip6_2 }
forwarder { $quad9 }

preference { recursor DoT oDoT-forwarder forwarder oDoT-autoconf autoconf stub }</pre><p>Voir man unwind.conf pour l'ordre de préférence par défaut :)
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=unwind-config-no-censorship">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-10-19-venez-aux-utopiales.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-10-19T09:59:10Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/img/log/utopiales-2022-affiche.png">Affiche des utopiales 2022</a><br /><p><span class="gemini-fragment">=> </span><a href="https://www.utopiales.org">Les utopiales, ça me redonne toujours foi en l'humanité.</a><br /><p>J'y vais samedi et dimanche cette année, et vous?
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=venez-aux-utopiales">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-10-17-dune-imperium.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-10-17T14:28:00Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>On m'a offert le jeu Dune Imperium de Paul Dennen, et je souhaitais en parler aujourd'hui après avoir (enfin) trouvé le temps de finir quelques parties.
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/img/log/dune-imperium-1.jpg">Aperçu de la boîte de jeu</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/img/log/dune-imperium-2.jpg">Aperçu du jeu</a><br /><p>Pour quelqu'un qui comme moi adore les jeux de plateau de stratégie, je suis ravi.
</p><p>Qu'on soit bien d'accord sur ce que j'entends par "stratégie", qui dans mon esprit se détache légèrement des Echecs, Go puisqu'une part est laissée à l'aléatoire. Ce que je vois comme un jeu de stratégie correspond à une situation où tous les joueurs commencent la partie avec la même probabilité de gagner. Le facteur "hasard", je le décrirais plutôt comme "aléatoire" ne doit pas favoriser un joueur et déséquilibrer une partie. Autrement dit, un tirage ne doit pas donner l'avantage.
</p><p>Pour moi, ne sont pas des jeux de stratégie :
</p><ul><li>Le Uno : selon la carte piochée, on peut renverser la partie
</li>
<li>Le Yams : rhaaa, je déteste le Yams (ou yahtzee je crois ...)
</li>
<li>Le Rummikub : zzZZZ
</li>
<li>La belote : y a pas + prédéterminé. Je HAIS la belote!
</li></ul><p>Sont des jeux de stratégie :
</p><ul><li>Le go
</li>
<li>Les échecs : moins l'avantage conféré aux blancs
</li>
<li>7Wonders : les cartes sont mélangées et distribuées, puis les decks sont échangés à chaque tour, ce qui atténue la chance du tirage. Certains décrivent plutôt 7wonders comme un jeu d'opportunisme. C'est d'autant plus vrai avec la version "duel".
</li>
<li>Smallworld : chaque joueur peut faire les mêmes choix que les autres.
</li></ul><p>Pour en revenir à Dune Imperium, je le vois comme un jeu de stratégie puisque chaque joueur commence la partie avec les même cartes.
</p><p>Le jeu est très riche, offrant de multiples façons de renverser la partie. À ce titre, le jeu est fidèle à l'univers de Dune : tant par le design (qui ressemble beaucoup au récent film) que par ses aspects.
</p><p>À chaque tour, un joueur peut choisir de déployer des agents à divers emplacements. Cette action à un coût et éventuellement une récompense. Selon ses choix, un joueur peut :
</p><ul><li>recruter des troupes
</li>
<li>déployer des soldats dans le conflit en cours pour en obtenir le utin de guerre
</li>
<li>chercher à augmenter son influence auprès d'une des 4 factions (Bene Gesserit, Imperium, Guilde spatiale, Fremen).
</li>
<li>récupérer de l'épice
</li>
<li>récupérer de l'eau pour pouvoir aller sur Arrakis plus tard
</li>
<li>récupérer de nouvelles cartes
</li></ul><p>Puisqu'il s'agit d'un jeu de deckbuilding, chaque joueur se constitue sa pioche personnelle en récupérant de nouvelles cartes (qui nécessitent d'investir de l'influence politique) qu'il pourra ensuite jouer.
</p><p>Chacun de ces éléments peut rapporter des points de victoire. Le premier en ayant 10 ou plus sonne la fin de partie.  C'est sans compter les cartes intrigues que l'on peut choisir d'investir au détriment des autres actions dans l'espoir de pouvoir jouer un atout le moment venu. C'est la partie la plus aléatoire, mais bien équilibrée avec le reste du jeu puisque nécessite de sacrifier des ressources. En plus, c'est tellement dans l'esprit de Dune 😈.
</p><p>Petit + du jeu : il se joue seul, à 2, 3 ou 4 personnes.
</p><p>C'est bon à savoir pour l'hiver sans électricité qui arrive : imaginez-vous sous une couverture douce et chaude, éclairés à la bougie, le réchaud de camping qui fait frémir l'eau du thé, les spéculoos qui sentent bon la canelle, avec Dune Imperium pour passer un bon moment. (ou un autre jeu :))
</p><p>ps : si quelqu'un a envie de créer un nouvel OS, je lui propose le nom "speculo OS". -->[]
</p><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=dune-imperium">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-10-11-how-to-use-fork.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-10-11T21:14:01Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>I've been playing with "fork()" recently to run "execv()" and start a new command. The thing is "execv()" replace the process. This means it replace the whole program calling "execv()".
</p><p>At first, I noticed a lot of new process running at each "fork()". I thought it was zombies process (it wasn't, I just forgot to close a socket), so I dig the topic.
</p><p>Zombie process are stopped processes, but the OS don't know they have finished. If there are too many, It can be problematic at some point.
</p><p>Normally, you must call "wait()" or "waitpid()" in the parent process :
</p><pre>const char *cmd[] = { "/usr/bin/top", "-s", "0.5", NULL };
pid_t pid = fork();
if (pid == -1) {
	err(1, "fork");
} else if (pid == 0) {
	/* child */
	execv(cmd[0], (char **)cmd);
	err(1, "execv");
} else {
	/* parent */
	wait(NULL);  // blocking
	/* or : 
	waitpid(pid, NULL, WNOHANG); // non-blocking
	*/
}</pre><p>However, one may find annoying to add those "wait()" calls.
</p><p>In order to make sure all forks are waited, you may add a signal before calling "fork()" at the beggining of your main() :
</p><pre>#include <signal.h>

static void sigchld(int unused);

void
sigchld(int unused)
{
	(void)unused; // avoid unused variable warning
	while (waitpid(WAIT_ANY, NULL, WNOHANG) > 0);
}

int
main(int argc, char *argv[])
	/* ... */
	if (signal(SIGCHLD, sigchld) == SIG_ERR)
		err(1, "can't install SIGCHLD handler:");
	/* ... */</pre><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/Logiciel-libre/Code/C/tout-ce-que-jaurais-aime-quon-me-dise.gmi">This is something I would have known before (gemini)</a> <span class="gemini-fragment">|</span> <a href="https://si3t.ch/Logiciel-libre/Code/C/tout-ce-que-jaurais-aime-quon-me-dise.xhtml">This is something I would have known before (http)</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-09-29-gmi2xhtml-v6.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-09-29T12:54:17Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/ah/">Je souhaitais ajouter une table des matières à mon guide pour héberger son serveur avec OpenBSD.</a><br /><p>Au départ, j'ai repris une solution bien connue en javascript, mais je trouvais ça un peu dommage alors que j'avais la main sur la génération.
</p><p>J'ai donc ajouté cette fonctionnalité au convertisseur de gemtext vers xhtml que j'utilise.
</p><p>C'est en créant la liste que je me suis aperçu que je faisait une erreur depuis des années. Merci le XHTML qui ne tolère aucune erreur.
</p><p>Une liste, ce n'est pas
</p><pre><ul>
    <li>one</li>
    <li>two</li>
    <ul>
        <li>sub 1</li>
        <li>sub 2</li>
    </ul>
    <li>end</li>
</ul></pre><p>Mais:
</p><pre><ul>
    <li>one</li>
    <li>two
    <ul>
        <li>sub 1</li>
        <li>sub 2</li>
    </ul>
    </li>
    <li>end</li>
</ul></pre><p>Pour la numérotation, c'est une histoire de CSS :
</p><pre>#toc ul {
	list-style-type: none;
	counter-reset: toc-counters 0;
}
#toc ul li:before {
	counter-increment: toc-counters;
	content: counters(toc-counters, ".") ". ";
}</pre><p>Si vous voulez récupérer ce petit bout d'awk :
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/code/gmi2xhtml.awk.tgz">/code/gmi2xhtml.awk.tgz</a><br /><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=gmi2xhtml-v6">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-09-27-onduleur-dead.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-09-27T21:01:08Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><blockquote>Allo chéri, ça fait tout le temps "biiiip" à la maison dans le placard du disjoncteur, c'est insupportable.
</blockquote><blockquote>Euh... débranche l'onduleur quand tu pourras, c'est sans doute ça.
</blockquote><blockquote>C'est quoi l'onduleur?
</blockquote><blockquote>La grosse boîte noire avec plein de prises.
</blockquote><p>Pendant ce temps, au boulot, vite fait entre 2 cours :
</p><pre>ssh ledzep
su
shutdown -hp now</pre><p>Voilà, tout ça pour dire que mon onduleur a un défaut de batterie.
</p><p>Il faut que je la change, ou que je change d'onduleur.
</p><p>Ça ne sera pas demain, ça coûte cher ces trucs là, donc en attendant on fera sans.
</p><p>Désolé pour la coupure de cet après-midi.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=onduleur-dead">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-09-26-pluie-et-futur.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-09-26T15:01:18Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>La pluie tapote doucement sur les fenêtres.
</p><p>J'ai presque l'impression d'avoir abandonné ce son dans mon enfance.
</p><p>Que ce bruit est apaisant.
</p><p>Les arbres dansent avec le vent, les gouttes dégoulinent sur les ardoises, il fait si bon d'être à l'abri derrière cette fenêtre.
</p><p>Alors que la plupart rêvent d'aller se dorer au Soleil sur du sable brûlant, je suis le plus heureux des hommes à la maison, tenant mon café brûlant à grignoter des sablés.
</p><p>Peut-être que dans un futur proche, tout le monde rêvera de pluie dans un monde ravagé par le réchauffement climatique.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=pluie-et-futur">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-09-17-match-finder.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-09-17T21:00:39Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>J'adore dmenu et l'avantage qu'il présente pour en quelques frappes faire du tri dans une recherche :
</p><ul><li>ajouter un bookmark
</li>
<li>ouvrir un bookmark
</li>
<li>choisir une musique à jouer
</li>
<li>choisir un fichier à ouvrir
</li>
<li>chercher dans les manpages
</li>
<li>choisir un emoji à coller
</li>
<li>...
</li></ul><p>Toutefois, j'utilise le plus clair de mon temps tmux, et il me devient pénible d'appeler dmenu qui liste mes scripts pour lancer un script dmenu au lieu de le faire directement dans le terminal.
</p><p>Oui, j'ai des problèmes vraiment très grave...
</p><p>En parallèle, il existe des outis comme pick, fzy ou encore plus conny fzf pour faire la même chose que dmenu en terminal.
</p><p>Alors, j'ai créé un petit wrapper qui appelera dmenu ou bien fzy selon si je fais l'appel depuis un terminal ou depuis un autre lanceur :
</p><pre>#!/bin/sh
# dmenu/pick/fzf/fzy wrapper wether it is called from terminal
# options:
#  -p "prompt"

# dmenu options
l=15
fn="JetBrainsMono-10:antialias=true:autohint=true"
nb="#2e3440"
nf="#d8dee9"
sb="#81a1c1"
sf="#2e3440"

while getopts 'p:' c
do
	case $c in
		p) p="${OPTARG}" ;;
	esac
done

if [ -n "$TERM" ]; then
	# run from commandline
	fzy -p "${p}"
	#pick
	#fzf --prompt="${p}"
else
	# run from dmenu
	dmenu -i -l $l -fn $fn -nb $nb -nf $nf -sb $sb -sf $sf -p "$p"
fi</pre><p>Il m'a fallu en passant réécrire quelques scripts, que je détaillerai dans un futur article, peut-être.
</p><h2>Liens
</h2><p><span class="gemini-fragment">=> </span><a href="https://tools.suckless.org/dmenu">dmenu</a> <span class="gemini-fragment">|</span> <a href="https://github.com/mptre/pick">pick</a> <span class="gemini-fragment">|</span> <a href="https://github.com/jhawthorn/fzy">fzy</a> <span class="gemini-fragment">|</span> <a href="https://pedantic.software/git/choice">choice</a><br /><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=match-finder">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-09-14-squirrelmail-nice-webmail.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-09-14T15:52:05Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p><span class="gemini-fragment">=> </span><a href="https://squirrelmail.org">Squirrelmail is an old webmail.</a><br /><p>"Old" since it looks old.
</p><p>Actually, it doesn't even require javascript.
</p><p>And that's fine to me, I'm self-hosting and only need a webmail access for friends who don't configure a mail client.
</p><p>It is a very simple software, light and easy to set up compared to big alternatives.
</p><p>No database, no mess.
</p><p>Just PHP.
</p><p>Good news, PHP-8 is supported.
</p><p>So, I installed squirrelmail and it feels great.
</p><p><span class="gemini-fragment">=> </span><a href="https://0x0.st/oOQu.png">This is how it looks with custom CSS.</a><br /><h2>Notes to install squirrelmail on OpenBSD
</h2><h3>Install files and set permissions
</h3><pre>mkdir /var/www/htdocs/webmail/
cd /var/www/htdocs/webmail
ftp -o squirrelmail.tar.gz https://squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fsnapshots.squirrelmail.org%2Fsquirrelmail-20220914_0200-SVN.stable.tar.gz
ftp -o locales.tar.gz https://squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fsnapshots.squirrelmail.org%2Fsquirrelmail-20220914_0200-SVN.locales.tar.gz
for i in *.tar.gz; do tar xvzf $i; done
mv squirrelmail.stable squirrelmail
rm *.tar.gz
cp -r squirrelmail.locales/locale/fr_FR squirrelmail/locale/
cp -r squirrelmail.locales/images/*fr_FR* squirrelmail/images/
cp -r squirrelmail.locales/help/fr_FR squirrelmail/help/
rm -r squirrelmail.locales
mkdir -p {data,temp}
chown -R www:daemon .
chmod -R 750 .
chmod 0730 data
chmod 0730 temp</pre><h3>Configure
</h3><pre>cd squirrelmail/config
./conf.pl</pre><p>Have fun in Organization Preferences and Server Settings.
</p><p>Defaults are fine if webmail is on the same machine that the mail server.
</p><p>Just make sure in "General Options" to set :
</p><pre>1.  Data Directory               : ../data/
2.  Attachment Directory         : ../temp/</pre><h3>Configure httpd
</h3><p>I suppose here you already have a SSL certificate.
</p><pre>server "squirrelmail.host.tld" {
        listen on * port 80
        no log
        location * { block return 301 "https://$SERVER_NAME$REQUEST_URI" }
}

server "squirrelmail.host.tld" {
        root "/htdocs/squirrelmail.host.tld/squirrelmail"
        connection max request body 36700160
        directory index index.php
	listen on * tls port 443
	hsts preload
	hsts subdomains
	tls {
		certificate "/etc/ssl/host.tld.crt"
		key         "/etc/ssl/private/host.tld.key"
		ticket lifetime default
	}

	location "*.php*" {
		fastcgi socket "/run/php-fpm.sock"
	}

	location "/.well-known/acme-challenge/*" {
		root "/acme"
		request strip 2
	}

	# block everything not listed in .htaccess
        location "README" { block }
        location "class" { block }
        location "config" { block }
        location "configure" { block }
        location "contrib" { block }
        location "data" { block }
        location "doc" { block }
        location "functions" { block }
        location "help" { block }
        location "include" { block }
        location "locale" { block }
        location "po" { block }
}</pre><h3>Subscribe
</h3><p><span class="gemini-fragment">=> </span><a href="https://squirrelmail.org/docs/admin/admin-12.html#mailinglists">subscribe to annouces to get important notices.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-09-13-cours-en-ligne.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-09-13T11:50:50Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>J'avais délaissé cette tâche à plus tard, pensant à chaque fois que ce n'était jamais assez bien.
</p><p>Je le pense toujours, mais à un moment donné, si je veux que ça serve aux autres, il faut se lancer.
</p><p>J'ai donc complété la page où je liste les ressources que j'utilise en cours de physique-chimie et dont je suis plus ou moins l'auteur.
</p><p>Il y en aura d'autre au fur et à mesure de l'année :)
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/Sciences-Education/cours/">/Sciences-Education/cours/</a><br /><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=cours-en-ligne">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-08-25-sterile.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-08-25T15:01:30Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Me voilà stérile, par choix : je suis vasectomisé.
</p><p>Et avant d'aller plus loin, je précise que tout va super bien 😄.
</p><p>J'ai pu constater dans mon entourage des réactions montrant que la vasectomie reste une intervention mal connue, mal comprise, et presque honteuse pour certains.
</p><p>Car on le sait tous, un homme, un vrai, c'est poilu, ça parle fort, c'est musclé et surtout, ça a des couilles.
</p><p>Alors si on te fait une vasectomie, t'es plus tout à fait un homme hein?
</p><p>Non.
</p><p>J'ai eu la chance de lire il y a un moment un excellent billet où l'auteur détaillait ce choix et ce qu'il avait vécu. Cet article m'avait touché et m'a apporté réconfort et matière à réflexion.
</p><p>J'aimerais beaucoup remettre la main dessus.
</p><p>EDIT : retrouvé \o/
</p><p><span class="gemini-fragment">=> </span><a href="https://boris.schapira.dev/notes/2021-06-je-ne-ferai-plus-d-enfants/">https://boris.schapira.dev/notes/2021-06-je-ne-ferai-plus-d-enfants/</a><br /><p>Il s'appelait je crois "je n'aurais plus d'enfants", je reprends donc le même titre en guise d'hommage.
</p><p>Si vous l'avez épinglé, merci de m'envoyer le lien que je l'indique en référence.
</p><p>Je vais donc suivre son modèle et expliquer comment j'ai vécu cette vasectomie, histoire de déconstruire quelques idées reçues. 😉
</p><h2>La vasectomie, c'est quoi ?
</h2><p>C'est une méthode de contraception masculine définitive.
</p><p>L'opération bénigne consiste à sectionner les canaux déférents.
</p><p>C'est juste les petits tuyaux qui permettent aux spermatozoïdes d'aller se mélanger au sperme.
</p><p>Après, le sperme est 100% spermato-free.
</p><p>C'est tout.
</p><h2>Pourquoi cette décision
</h2><p>Subir une vasectomie est un choix personnel, et je n'ai pas pour objectif de convaincre qui que ce soit.
</p><p>Je ne souhaite plus d'enfants.
</p><p>C'est fiable à 99%, le 1% restant étant dû à un mauvais suivi des recommandations juste après l'opération : il peut persister des spermatozoïdes vivants dans les tuyaux pendant encore 3 mois. Il faut donc poursuivre une contraception pendant 3 mois, après c'est réglé.
</p><p>Il existe d'autres méthodes contraceptives, le caractère définitif de la vasectomie peut rassurer : il n'y a pas un préservatif à enfiler au dernier moment ou une pilule à prendre à heure fixe quotidiennement.
</p><p>Alors que j'étais fertile tous les jours, c'était pourtant ma conjointe qui prenait la pilule.
</p><p>Ma conjointe qui, pour sa part, n'est fertile que quelques jours par mois.
</p><p>Chaque jour, il fallait penser à cette pilule, et cette charge mentale est pénible, voire stressante.
</p><p>La pilule, c'est un traitement hormonal avec de nombreux effets secondaires :
</p><ul><li>Maux de tête
</li>
<li>Troubles de l'humeur
</li>
<li>Baisse de la libido
</li>
<li>Risque de thrombose
</li>
<li>Prise de poids
</li>
<li>(je note pas tout, il y en a d'autres)
</li></ul><p>et je ne parle pas des stérilets...
</p><p>Alors que la vasectomie, les effets secondaires, c'est peau de zob si j'ose dire.
</p><h2>Effets secondaires?
</h2><h2>Sur le long terme
</h2><p>Rien.
</p><ul><li>Non, il n'y a pas de baisse de la libido.
</li>
<li>Les testicules sont toujours là et bien branchées. Pas de modifications hormonales donc.
</li></ul><p>Bref, tout est comme avant, sauf que les spermatozoïdes restent bien au chaud.
</p><h3>Juste après l'opération
</h3><p>J'insiste sur le fait qu'il s'agit de mon expérience personnelle.
</p><p>J'imagine qu'on ne réagit pas tous de la même façon à une intervention chirurgicale.
</p><p>En tout cas, pour ma part, si je n'avais pas su que j'avais subi cette opération, je n'aurai pas vu grande différence.
</p><p>Les points ont tiré un peu lorsqu'ils s'accrochaient dans mes vêtements.
</p><p>C'est tout.
</p><p>Alors je ne m'amusais pas à faire le grand écart ou à jouer à ninja warrior non plus ^^.
</p><p>Certains semblent sentir une gêne jusqu'à une semaine après, une sorte de lourdeur qui passe avec des anti-inflammatoires (ibuprofène).
</p><h2>Et concrètement, comment ça se passe ?
</h2><p>J'ai commencé par en parler à mon médecin traitant.
</p><p>Heureusement pour moi, et merci à lui, il m'a tout de suite mis à l'aise, alors qu'il s'agit d'un sujet un peu délicat.
</p><p>Il a vérifié que je savais bien de quoi il s'agissait, m'a expliqué la procédure et à quoi m'attendre.
</p><p>Il m'a recommandé un collègue urologue, le même qui avait déjà vasectomisé mon médecin.
</p><p>Rendez-vous ensuite avec l'urologue, qui pose les questions qui dérangent.
</p><p>Et c'est très bien.
</p><p>Par exemple :
</p><blockquote>Si vos enfants et votre femme meurent subitement dans un accident de voiture, vous voudrez peut-être refaire votre vie ?
</blockquote><p>C'est pas rigolo, mais c'est nécessaire, car la vasectomie est définitive.
</p><p>Ensuite, il explique en quoi consiste l'opération : on fait une petite incision là sur le côté des bourses, on coupe les canaux déférents, on fait un noeud et on brûle, puis on recoud.
</p><p>Enfin, il donne rendez-vous dans au moins 2 mois.
</p><p>C'est comme ça.
</p><p>C'est obligatoire, il faut ce délai de réflexion.
</p><p>Ça permet de bien s'assurer qu'on ne fait pas les choses à la légère, d'en rediscuter avec sa compagne et avec soi-même.
</p><p>C'est aussi la période pendant laquelle on entends pas mal de conneries du genre "t'arriveras encore à satisfaire ta chérie?" ou "j'ai vu sur internet..." ou encore "moi je préfère rester entier, on touche pas à mes bijoux de famille".
</p><p>Bref.
</p><p>Notez qu'on peut faire congeler du sperme si on veut assurer le coup pour avoir des enfants + tard. C'est ~ 30€/an.
</p><p>Arrive le jour de l'intervention et la préparation.
</p><p>C'est là le plus stressant : les questions pour l'anesthésie, toutes les recommandations médicales.
</p><p>En même temps, c'est une opération, on fait les choses sérieusement.
</p><p>Concrètement, je suis arrivé à l'hôpital bien douché à 9h15 le matin, à jeun. La veille, il a fallu appliquer une crême dépilatoire, logique.
</p><p>On m'a accueilli, vérifié mon dossier, donné 1 paracétamol, 1 ibuprofène et 1 anti-inflammatoire (l'ibuprofène fait mal au ventre sinon).
</p><p>J'ai attendu 1h, le temps de pouvoir être anesthésié suite à la prise des médicaments ci-dessus.
</p><p>Ensuite on m'a conduit au vestiaire où j'ai enfilé la tenue opératoire : top tendance, tout en papier.
</p><p>Et puis c'est parti, hop sur le lit, puis au bloc.
</p><p>Là, on m'a endormi : c'est de la bonne ce truc!
</p><p>Réveil en salle de réveil, on vérifie les cicatrices, tout va bien.
</p><p>Zou, en chambre pour finir de se réveiller, et enfin manger un peu!
</p><p>L'urologue passe me voir, vérifie avec moi que je n'ai pas d'autres questions, me rappelle qu'il faut éviter des rapports dans les prochains jours et d'aller courir dans les champs.
</p><p>15h15, je sors de l'hôpital et rentre chez moi à pieds.
</p><p>Oui, à pieds, je me sentais vraiment bien, j'ai marché 7 km sans peine.
</p><p>Par contre, la nuit suivante, impossible de dormir : l'insomnie après l'anesthésie, c'est pas trop étonnant.
</p><p>Les jours d'après, j'ai fait gaffe de ne pas me cogner. Les cicatrices sont toutes petites, moins d'1 cm de chaque côté, et les points tombent tout seul.
</p><p>C'est mieux d'attendre aussi au moins 1 semaine avant d'aller courir. On m'avait prévenu, mais comme je me sentais vraiment bien, je n'ai pas eu cette patience, résultat ça fait un peu mal après pendant 2-3 jours, alors que je n'avais pas mal avant.
</p><p>Après 3 mois, un spermogramme permet de confirmer ma stérilité officiellement, surtout pour rassurer le patient.
</p><p>Voilà.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=sterile">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-08-19-comment-utiliser-regex-h.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-08-19T13:46:36Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Suite à une idée de solene, j'ai récemment modifié le code de vger afin d'utiliser une expression régulière (regex) afin de récupérer les éléments dans une requête :
</p><ul><li>Le nom de domaine
</li>
<li>Le chemin vers le fichier demandé
</li>
<li>Le "query", après un "?" quand on utilise un script cgi.
</li></ul><p>Puisque vger est écrit en C, j'ai décidé d'utiliser la bibliothèque présente de base dans OpenBSD (et la plupart des systèmes) : regex.h.
</p><p>La lecture de la page man regex.3 fut fastidieuse. Elle est pourtant claire, mais je suis de ceux qui ont besoin d'exemples pour bien comprendre, en particulier comment récupérer les chaînes de caractères d'une partie seulement de la regex : les substring.
</p><p>Voici donc comment utiliser regex.h.
</p><p><span class="gemini-fragment">=> </span><a href="https://tildegit.org/solene/vger">vger</a> <span class="gemini-fragment">|</span> <a href="http://man.openbsd.org/regex.3">regex.3</a><br /><h2>La regex utilisée
</h2><p>Imaginons que nous ayons la phrase : "Mon nom est Paul Muad'Dib".
</p><p>On veut récupérer le prénom et le nom. On pourrait alors utiliser cette regex "^.* (.<em>) (.</em>)$"
</p><p>Les subexpressions à récupérer sont entre parenthèses.
</p><h2>Déclarations de variables
</h2><p>Il nous faut une variable de type regex_t pour compiler la regex.
</p><p>On enregistrera les subexpressions dans une structure regmatch_t qu'on appelera "match". Cette dernière est un tableau. Elle doit être assez grande pour contenir la ligne complète correspondant à la regex et chaque substring à capturer.
</p><p>Dans notre cas, ça fait 2 captures + la phrase complète.
</p><ul><li>match[0] contiendra la phrase complète.
</li>
<li>match[1] la première parenthèse.
</li>
<li>match[2] la seconde parenthèse.
</li></ul><p>J'ai vu dans le code source de ed qu'ils utilisent un #define, ce qui me parait assez malin. (ils définissent la taille à 30 oO).
</p><p>Cela nous donne :
</p><pre>#define SE_MAX 3 /* number of expected subexpressions + 1 /*

...

regex_t reg;
regmatch_t match[SE_MAX];
size_t nmatch = SE_MAX;</pre><h2>On éxécute la regex
</h2><p>On appelle donc regcomp pour compiler la regex, et regexec pour l'éxécuter (PAN!).
</p><pre>regcomp(®, regex, REG_EXTENDED);
regexec(®, s, nmatch, match, 0);</pre><h2>On récupère les substrings
</h2><p>Maintenant, match[1] doit contenir le prénom et match[2] le nom.
</p><p>Ainsi, reg.re_nsub doit être égal à 2.
</p><p>Chaque élément dans match est constitué de 2 éléments : rm_so et rm_eo. Ils décrivent l'offset (le décalage) où commence et termine une substring dans la phrase de départ.
</p><p>Dans notre phrase, le prénom commence après avoir déplacé un curseur imaginaire 12 fois depuis le début.
</p><pre>Mon nom est Paul Muad'Dib
            ^   ^
            |   |
	    |   +-> match[1].rm_eo = 16
	    |
	    +-> match[1].rm_so = 12</pre><p>Si rien n'a été trouvé, rm_so et rm_eo sont égaux.
</p><p>On vérifie donc tout d'abord qu'on a bien trouvé le prénom :
</p><pre>if ((len = match[i].rm_eo - match[i].rm_so) > 0) {</pre><p>On en profite pour calculer la longeur de la chaîne à récupérer.
</p><p>Ensuite, on copie cette substring, située à s + match[i].rm_so, s étant notre phrase de départ.
</p><pre>memcpy(first, s + match[i].rm_so, len);</pre><h2>Le code entier
</h2><p>Ici on rajoute de quoi gérer d'éventuelles erreurs, dont le message est enregistré dans "buf".
</p><pre>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <sys/types.h>

#define SE_MAX 3	/* max subexpression, in nmatch. hard to really understand */

int 
main(int argc, char *argv[])
{
	regex_t reg;
	regmatch_t match[SE_MAX];
	size_t nmatch = SE_MAX;
	size_t len = 0;
	int ret = 0;
	char buf[BUFSIZ] = {'\0'};
	char *regex = "^.* (.*) (.*)$";
	char *s = "My name is Paul Muad'Dib";
	char first[10] = {'\0'};
	char last[10] = {'\0'};

	if ((ret = regcomp(®, regex, REG_EXTENDED)) != 0) {
		regerror(ret, ®, buf, sizeof(buf));
		goto stop;
	}

	if ((ret = regexec(®, s, nmatch, match, 0)) != 0) {
		regerror(ret, ®, buf, sizeof(buf));
		goto stop;
	}

	for (int i = 1; i <= reg.re_nsub; i++) {
		if ((len = match[i].rm_eo - match[i].rm_so) > 0) {
			switch (i) {
			case 1:
				memcpy(first, s + match[i].rm_so, len);
			case 2:
				memcpy(last, s + match[i].rm_so, len);
			}
		}
	}

 stop:
	regfree(®);
	puts(buf);

	printf("first name: %s\nlast name: %s\n", first, last);
	return 0;
}</pre><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=comment-utiliser-regex-h">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-08-18-how-to-regex-h.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-08-18T14:40:18Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>After an idea of solene, I recently modified vger code to use a regex in order to get various elements of a request:
</p><ul><li>hostname
</li>
<li>path
</li>
<li>query (after a ?)
</li></ul><p>Since vger is written in C, I went for the library included in OpenBSD: regex.h.
</p><p>I found the manpage regex.3 a bit hard to read. Actually, I missed examples to make sure I had understood everything, especially about matching and getting substrings, not only matching a regex.
</p><p>So, that's how to use regex.h.
</p><p><span class="gemini-fragment">=> </span><a href="https://tildegit.org/solene/vger">vger</a> <span class="gemini-fragment">|</span> <a href="http://man.openbsd.org/regex.3">regex.3</a><br /><h2>The regex we'll use
</h2><p>Let's say we have the string: "My name is Paul Muad'Dib".
</p><p>We need to get the first and last name. So we could write this stupid regex: "^.* (.<em>) (.</em>)$"
</p><p>Subexpressions are between ().
</p><h2>Variables declaration
</h2><p>To work, we need a regex_t type to store our compiled regex.
</p><p>We need to store the subexpressions in a regmatch_t structure we'll call "match". This structure must be wide enough to keep in memory the full match and the substrings.
</p><p>In our case, we hope to match 2 substrings. This means our regmatch_t must be 2+1 wide.
</p><ul><li>match[0] contains the full matched string
</li>
<li>match[1] is the first match
</li>
<li>match[2] is the second match.
</li></ul><p>I found in the ed source code the use of a define to store this and think it's clever (they set it to 30 oO).
</p><p>This gives us :
</p><pre>#define SE_MAX 3 /* number of expected subexpressions + 1 /*

...

regex_t reg;
regmatch_t match[SE_MAX];
size_t nmatch = SE_MAX;</pre><h2>Run the regex
</h2><p>This is quite easy, we call regcomp to compile the regex and regexec to run it.
</p><pre>regcomp(®, regex, REG_EXTENDED);
regexec(®, s, nmatch, match, 0);</pre><h2>Extract the substrings
</h2><p>Now, match[1] should have the first name and match[2] the last name.
</p><p>If so, reg.re_nsub must be 2.
</p><p>Items in match have two elements, rm_so and rm_eo storing the starting and ending offset of match copared to the original string.
</p><p>In other words, the position in the original string where the subexpression starts and ends.
</p><p>In our case, the first names starts after shifting 11 times on the right and stops at position 15.
</p><pre>My name is Paul Muad'Dib
           ^   ^
           |   |
           |   +-> match[1].rm_eo = 16
           |
           +-> match[1].rm_so = 12</pre><p>If no match were found, rm_so and rm_eo are equals.
</p><p>So we first check if we have a match :
</p><pre>if ((len = match[i].rm_eo - match[i].rm_so) > 0) {</pre><p>Doing so, we get the length of the substring to copy.
</p><p>Then, we can copy the match located at s + match[i].rm_so, s being our original string.
</p><pre>memcpy(first, s + match[i].rm_so, len);</pre><h2>Full code
</h2><p>In order to handle errors, we call regerror to store the error in a buffer "buf" :
</p><pre>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
#include <sys/types.h>

#define SE_MAX 3	/* max subexpression, in nmatch. hard to really understand */

int 
main(int argc, char *argv[])
{
	regex_t reg;
	regmatch_t match[SE_MAX];
	size_t nmatch = SE_MAX;
	size_t len = 0;
	int ret = 0;
	char buf[BUFSIZ] = {'\0'};
	char *regex = "^.* (.*) (.*)$";
	char *s = "My name is Paul Muad'Dib";
	char first[10] = {'\0'};
	char last[10] = {'\0'};

	if ((ret = regcomp(®, regex, REG_EXTENDED)) != 0) {
		regerror(ret, ®, buf, sizeof(buf));
		goto stop;
	}

	if ((ret = regexec(®, s, nmatch, match, 0)) != 0) {
		regerror(ret, ®, buf, sizeof(buf));
		goto stop;
	}

	for (int i = 1; i <= reg.re_nsub; i++) {
		if ((len = match[i].rm_eo - match[i].rm_so) > 0) {
			switch (i) {
			case 1:
				memcpy(first, s + match[i].rm_so, len);
			case 2:
				memcpy(last, s + match[i].rm_so, len);
			}
		}
	}

 stop:
	regfree(®);
	puts(buf);

	printf("first name: %s\nlast name: %s\n", first, last);
	return 0;
}</pre><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-08-09-dwm-status.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-08-09T14:54:02Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>I like to keep under the eyes a few information when I work : the track played by mpd and the time.
</p><p>I used a simple script calling xsetroot in a while loop :
</p><pre>while true; do
	mpd_track=$(mpc current)
	time=$(date "+%F  %H:%M")
	xsetroot -name "$mpd_track | $time"
	sleep 1
done</pre><p>However, calling mpc every second seemed useless.
</p><p>Worse : when I switch to another song, the display wasn't updated after 1 second.
</p><p>No big deal, indeed. I used to display the volume too, and when changing volume while scrolling on the bar, there was an annoying delay before the right information was shown.
</p><p>Recently I read about signals, and it seemed perfect. Now the script to set my dwm status bar waits for USR1 signals to call xsetroot :
</p><pre>set_status()
{
	xsetroot -name " $(status) "
}
trap set_status USR1</pre><p>To make sure the mpd song is displayed directly, I have this loop : (damn I love mpc --wait)
</p><pre>(while true; do mpc --wait current >/dev/null; reload; done) &</pre><p>And at last, I call a stupid loop doing nothing except waiting for signals :
</p><p>while true; do sleep .1; done
</p><p>The complete script :
</p><pre>#!/bin/sh
# set dwm's status when USR1 signal is received
#	pkill -USR1 statusloop
#	kill -USR1 $(cat /tmp/statusloop.lock)

LOCKFILE=/tmp/statusloop.lock

set_status()
{
	xsetroot -name " $(status) "
}

reload()
{
	kill -USR1 $(cat ${LOCKFILE})
}

if [ -e ${LOCKFILE} ]; then
	echo "already running, killing"
	kill -9 $(cat ${LOCKFILE})
fi

trap set_status USR1

# make sure the lockfile is removed when we exit
trap "rm -f ${LOCKFILE}; exit" INT QUIT TERM

echo $$ > ${LOCKFILE}

set_status

# update clock every minutes
(while true; do sleep 60; reload; done) &
# mpd changes
(while true; do mpc --wait current >/dev/null; reload; done) &

# global loop
while true; do sleep .1; done</pre><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-08-04-wallpapers.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-08-04T14:11:42Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Just to let you know I host my favourite wallpapers behind the following link.
</p><p>No fancy gallery, autoindex will do it just fine.
</p><p><span class="gemini-fragment">=> </span><a href="/proxy/si3t.ch/img/wallpapers">wallpapers</a><br /><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=wallpapers">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-07-30-vger-separate-log.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-07-30T15:41:12Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p><span class="gemini-fragment">=> </span><a href="https://tildegit.org/solene/vger">Remember vger gemini server ?</a><br /><p>While hacking vger's code, I wanted to improve logs.
</p><p>Instead of hard coding a new option to specify a log file, which would be a pain because of chroot/unveil, I set up syslog to redirect vger's logs to /var/log/vger.log. I also wanter to avoid a neverending growing file so newsyslog is configured too.
</p><pre>touch /var/log/vger.log
chmod 640 /var/log/vger.log

cat << EOF >> /etc/syslog.conf
!vger:
*.*     /var/log/vger.log
EOF

cat << EOF >> /etc/newsyslog.conf
/var/log/vger.log       644 5 300 * Z
EOF</pre><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-07-01-covid-facile.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-07-01T09:12:41Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Hier je me plaignais d'être positif COVID. J'avais mal un peu partout, de la fièvre et pas de force. J'ai dormi tout l'après-midi.
</p><p>Aujourd'hui, mis à part un léger mal de tête au réveil qui est passé après le café, ça va beaucoup mieux :)
</p><p>Je ne vais pas tenter de battre mon record à la course, mais je fonctionne bien mieux qu'après une nuit entrecoupée de réveils avec les enfants.
</p><p>Bref, ça va bien :)
</p><p>Je voulais juste poser ça là, pour ajouter ma petite expérience personnelle quant à l'utilité des vaccins :)
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=covid-facile">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-06-30-covidplus.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-06-30T12:47:33Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Ça y est. J'ai tenu 3 ans. Mais cette fois, le résultat est sans appel : positif COVID.
</p><p>Ça devait arriver, des centaintes d'élèves chaque jour qui ont assisté au Hellfest, ont des parents bénévoles au Hellfest, mais surtout absolument AUCUNE mesure de l'EN pour accueillir chacun dans de bonnes conditions dans les lieux publics que sont les collèges. À chacun sa m... achetez un masque, faites sans détecteurs de CO₂.
</p><p>Bref.
</p><p>Dodo.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=covid+">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-06-18-rafraichir-maison-physique.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-06-18T10:28:06Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>Je n'ai pas de climatisation, et je n'en veux pas : cela ne fait qu'augmenter la quantité de chaleur totale (si on prend en compte l'extérieur) sans parler des énormes dépenses énergétiques que cela représente.
</p><p>Pourtant, comme tout le monde, on souffre de la chaleur à la maison.
</p><p>Alors je laisse tourner le ventilateur quand c'est trop pénible, mais ça m'irrite car le moteur du ventilateur chauffe inévitablement un peu.
</p><p>C'est pourquoi je me sers d'un peu de physique à la place ou en complément. Je voudrais parler ici de la physique de la serpillère 😆.
</p><p>Passez la serpillère mouillée à l'eau froide. En s'évaporant, l'eau utilisera l'énergie thermique ambiante pour passer de l'état liquide à l'état gazeux.
</p><p>Il s'agit exactement du même principe que la transpiration.
</p><p>Il faut toutefois un peu de mouvement d'air pour que l'évaporation se produise : c'est là que le ventilateur devient pertinent.
</p><p>On gagne ainsi quelques degrés bienvenus.
</p><h2>Une réaction?
</h2><p><span class="gemini-fragment">=> </span><a href="mailto:prx@si3t.ch?subject=rafraichir-maison-physique">Envoyez votre commentaire par mail.</a> <span class="gemini-fragment">|</span> <a href="/proxy/si3t.ch/log/commentaires/">Mode d'emploi de la liste de diffusion pour recevoir les réponses.</a><br /><p>]]>
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->https://si3t.ch/log/2022-06-15-how-to-atom-feed.txt<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->2022-06-15T14:31:10Z<!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted -->
</p><p><!-- raw HTML omitted --><![CDATA[
</p><p>ATOM feeds let one subscribe to your website and get latest content. It is free. It can be used to publish content.
</p><p>ATOM is RSS improved.
</p><p>Instead of relying on provate social networks, you should consider using feeds.
</p><p>Let's see how to write an ATOM feed.
</p><p>First, insert a header :
</p><pre><?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://si3t.ch/log/</id>
  <title>log de prx
  /favicon.svg
  
  
  
  
    prx
    prx@si3t.ch
  
  2022-06-08T15:55:32Z

As you can see, the two first line are xml declaration, the 2nd call a stylesheet to display the atom feed. It is optional.

Then, we open a tag "".

id should be unique, use an URL as example.

You should specify linksto tell where is the content (alternate) and where the feed actually is (self) in case of redirections. Add an author section if you want.

Finally, insert a date when your feed has been updated. It has to be modified each time you update your feed. Format is --T::Z.

Then, you can add entries : they are your content. 1 entry = 1 article. Add as many as you want.


    Youtube to mpd
    gemini://si3t.ch/log/2022-06-06-yt2mpd.gmi
    2022-06-06T14:57:30Z
    
    
  

As you can see, you can write some metadata :

  • a title
  • the id of the entry. It must be unique (the url is quite good).
  • time when it has been updated (created)
  • a link to the article.
  • A new tag to add the content. As example, I show here a plain text content wrapped in CDATA to avoid escaping and issues with html. If you se the type to "html", make sure you escape &,<,>,'," to &, <, >, ' ".

To end an entry :

  • Close the CDATA tag with "]]]]><![CDATA[>" and content tag.
  • Close entry tag.

Finally, close your feed since it must be XML valid content.

That's it 😉

See also

=> About feeds. | What is Atom ? | atom.awk to generate an atom feed (http) | atom.awk to generate an atom feed (gemini)

]]>

https://si3t.ch/log/2022-06-06-yt2mpd.txt

2022-06-06T14:57:30Z

<![CDATA[

Below a script taking a youtube url as argument. The audio is extracted, then added to the mpd library, inserted in the playlist then played.

#!/bin/sh
# download sound from youtube, convert to $format,
# then insert and play in mpd

format="flac"

MUSDIR=$(awk '/music_directory/ {sub("^\"","",$2);sub("\"$","",$2); print $2}' $HOME/.mpdconf)

cd ${MUSDIR}
yt-dlp --no-playlist -x \
	--audio-format $format \
	-c "${1}" \
	-o "%(title)s.%(ext)s" \
	--exec "mpc --wait update && mpc insert \"%(title)s.%(ext)s\" && mpc next" 

]]>

https://si3t.ch/log/2022-05-25-tondeuse-a-main.txt

2022-05-25T14:50:34Z

<![CDATA[

Jusqu'à présent, pour tondre le peu de pelouse qu'il y a autour de chez moi, j'utilisais une tondeuse électrique vieille de plusieurs dizaines d'années que l'on se prêtait avec un ami. C'est pénible, le fil s'accroche partout, c'est lourd, ça fait un boucan horrible.

Malheureusement, elle est tombée en panne : la prise a fondu. Il faut réparer, on va chercher ça.

Cependant, en attendant, la pelouse pousse, et les petits ne peuvent même plus courir correctement.

J'ai donc fait l'achat d'une tondeuse à main. Le principe est tout bête : en poussant, les roues entraînent à l'aide d'une courroie les lames qui tournent à toute vitesse. J'ai choisi la plus basique, la moins chère (≈ 60€). Il en existe des plus perfectionnées bien sûr.

Quel bonne idée! C'est silencieux, en tout cas nettement plus que le moteur des autres modèles. C'est plus léger et maniable, pas besoin de traîner un file électrique qu'il faut enrouler/dérouler et qui s'emmêle toujours. Pas besoin de faire une vidange (pour un modèle thermique).

Certes, mon petit modèle bas de gamme ne me donne pas une coupe parfaite (en même temps, l'herbe arrivait au genou...), mais c'est largement suffisant pour moi. Pour l'entretien, j'ai juste à brosser l'herbe resté collée.

Bref, je l'ajoute à ma liste des choses écolos que l'on pourrait tous adopter.

=> gemini://si3t.ch/Pensees/economiser-l-environnement.gmi | https://si3t.ch/Pensees/economiser-l-environnement.xhtml

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-05-21-host-your-server-with-openbsd-full-documentation.txt

2022-05-21T14:27:47Z

<![CDATA[

I am proud to annouce the release of "Host your server with OpenBSD" :

=> [http] Host your server with OpenBSD | [gemini] Host your server with OpenBSD

For years now I maintain a document written in french explaining how to (self-) host a server with OpenBSD. It used to be a book. However, I wanted to keep up to date with last changes, so it became a wiki then a website with a public git repository. Since there was no contributors, it is now just a website with sources archive available.

I finally translated it to english.

I suppose it is not perfect since I'm not a linguist. However, it is at least a thing, and I can only improve it.

This documentation explain how to set up a web server, a mail server, a DNS server and much more. The idea was to use as much as possible OpenBSD's base tools, trying to explain some fundamentals without replacing already existing official documentation and keep things simple.

I hope you'll enjoy it 😊.

Do not hesitate to tell me if you find errors, suggest improvements -- at prx@si3t.ch -- or talk about it around you.

🐡

]]>

https://si3t.ch/log/2022-05-20-ah-mise-a-jour-2022.txt

2022-05-20T11:22:38Z

<![CDATA[

=> Je suis ravi d'annoncer aujourd'hui la mise à jour de ma documentation "Héberger son serveur avec OpenBSD".

Ça fait un moment que j'y travaille, et les changements sont conséquents. Petit à petit, page après page, finalement on y arrive en y consacrant quelques heures par semaine.

Pour rappel, l'idée de ce document est de faciliter l'accès à l'auto-hébergement, ou hébergement de façon plus générale si on loue une machine.

Le ton se veut léger de prime abord pour vulgariser des notions parfois complexes, ceci afin de progresser petit à petit.

C'est assez difficile de trouver la note juste entre simplification et contenu technique à détailler selon les cas, mais c'est mon métier et j'aime bien me poser de telles questions.

Évidemment, j'aimerais aller encore plus loin, donc vos retours à ce propos sont précieux 😉.

Les changements sont nombreux, voici donc dans un premier temps les plus importants pour moi :

  • Mise à jour des instructions pour OpenBSD 7.1, dernière en date.
  • Création d'une page contenant toouuute la documentation afin de pouvoir être imprimée dans un PDF. Le code CSS est spécialement prévu pour. Merci f6k pour les bouts de code bien pratiques 😉.
  • Traduction en Anglais !!! J'en reparlerai, mais c'est un évènement pour moi 😃. Ce travail de traduction m'a aidé à reformuler des phrases inutiliement complexes. Faire l'effort de traduire dans une langue qui n'est pas la mienne demande de se questionner sur les tournures à utiliser et éclaire sur des formulations mladroites. Il reste certainement des tas d'erreurs de traduction et de coquilles, mais cette traduction a le mérite d'exister, je pourrai construire dessus.

Sinon, voici une liste d'autres changements moins importants :

  • Tout est rédigé au format gemtext. C'est du texte lisible, pratique, qui force à être clair et plus structuré.
  • Tout est exportéxhtml : permet de repérer les erreurs, et prévoit un éventuel export en EPUB un jour.
  • Utilisation de gmi2xhtml.awk pour convertir en XHTML peu importe le système utilisé.
  • Ajout d'une page pour gérer une liste de diffusion avec mlmmj.
  • Ajout d'un guide de survie sous OpenBSD.
  • Simplification de la partie sur le réseau.
  • Proposition d'installation chiffrée par defaut.
  • Guide de ce qu'il faut faire juste après l'installation.
  • Ajout de détails sur /etc/fstab.
  • Suppression de plusieurs images inutiles ou datées. Certaines étaient corrompues.
  • Remplacement d'images par des diagrammes ascii.
  • Amélioration du code CSS pour l'impression. Les liens sont maintenant clairement indiqués pour recopier.
  • Un mode dark est disponible.
  • Génération automatique d'une page de sommaire.
  • Ajout d'éléments de sécurité pour le serveur gopher geomyidae
  • Ajjout d'une page sur le serveur gemini vger
  • Ajout d'une page sur iblock (pf) pour bloquer les scanneurs (merci solene)
  • Ajout d'une page "contributing"
  • Ajout d'instructions pour un serveur XMPP.
  • Des typos, des typos et encore des typos...
  • Suppression de la majorité du contenu de la page "Exemple de service WEB". C'était répétitif, et présentait le risque d'être peu à jour.
  • Étayage de la partie sur les principes généraux du DNS pour rendre certains paragraphes plus accessibles. Corrections de quelques erreurs. Ajouts de mentions sur les enregistrements TXT.
  • Simplification de la partie trucs et astuces puisque des éléments étaient redondants.
  • Tout ce que je n'ai pas noté au fur et à mesure... 😇

Et la suite me direz-vous?

Je compte bien maintenir à jour cette documentation.

J'aimerais aussi ajouter des instructions pour un résolveur DNS public (unboud) et la publication automatique d'enregistrements TLSA. C'est très technique, peut-être trop. Par ailleurs, j'ai envie d'ajouter des explications pour aider à créer une page web, comment écrire du bête html ou publier une capsule gemini pas à pas. C'est à la limite du cadre là aussi, car peut-être trop simple. J'hésite, je réfléchis...

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-05-18-je-redecouvre-linux.txt

2022-05-18T11:46:09Z

<![CDATA[

Mais que c'est compliqué!

Belle maman m'a demandé de lui préparer un nouveau PC aux petits oignons. Après avoir trouvé sur backmarket un chouette thinkpad reconditionné, j'ai installé debian car elle y est déjà habituée.

Premier constat : woah, c'est rapide! J'avais oublié qu'OpenBSD c'est très lent à côté. Ça vient aussi du nouvel ordi, bien meilleur que le mien en terme de puissance matérielle, masi tout de même.

Installer debian, c'est tout simple. Après avoir ajouté les pilotes pour le wifi, je configure un peu la session Xfce, c'est léger et suffisamment complet pour son utilisation.

Commence alors la configuration pour avoir une connexion + saine.

=> Je mets en place la récupération régulière d'un fichiers /etc/hosts pour filtrer certains domaines.

fastoche

Ensuite, je voudrais configurer l'utilisation d'unbound en local pour faire les résolutions DNS. Je sais qu'il y a Orange chez belle maman, c'est vraiment pas terrible.

Et là, quel calvaire!!!

Déjà, c'est difficle de trouver des informations claires sur le web pour juste définir un DNS par défaut.

Au mieux, on te dit d'empêcher les modifications sur /etc/resolv.conf avec chattr, mais c'est vraiment pas propre!

J'édire la configuraition de dhclient, ça je me souvenais, et ajoute un prepend domain-name-servers. Pensez-vous, ça n'est pas pris en compte, networkmanager fait comme il a envie.

J'arrive donc à fouiller dans l'interface de network manager. Déjà, il semble que les modifs sont à faire pour CHAQUE connexion, pas de paramètres globaux.

Il y a des onglets ipv4 et ipv6 qui évoquent les dns. On peut précier 127.0.0.1, mais ce n'est pas par défaut, c'est en plus des autres.

Un menu déroulant pas clair du tout parle de DHCP. Ou de DHCP avec connexion seule. Et plein d'autres trucs pas du tout clairs! Après en avoir tenté quelques uns, ça semble bon.

Mais bordel :

  • C'est si difficile de documenter un truc si courant sur le wiki de debian?
  • Pourquoi NetworkManager est devenu une telle usine à gaz qu'on ne comprend même pas les différences dans les paramètres proposés?

J'ai surement manqué un truc, je me sens vraiment noob :D

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-05-17-atom-awk-improved.txt

2022-05-17T13:01:26Z

<![CDATA[

=> Le mainteneur du script de shinobi.website a réalisé des modifications censées améliorer le flux RSS.

Je dis censées, car le format RSS me pose problème. Il choisit de tout encapsuler dans des balises "" et ajoute du CSS dans les balises. C'est à mon avis une mauvaise idée, car cela signifie qu'un auteur ne peut pas écrire "" dans ses articles par exemple. (c'est échappé avec sed ceci dit). Il ne peut pas non plus écrire une fin de tag pour CDATA. J'imagine que c'est une limite du RSS de ne pas pouvoir mettre un type en texte brut comme le propose ATOM et se passer du .

Du coup j'ai eu envie de simplifier mon outil en awk pour générer de la même façon un flux atom.

=> gemini://si3t.ch/Logiciel-libre/atom-awk.gmi | https://si3t.ch/Logiciel-libre/atom-awk.xhtml

Au menu :

  • Pas de fichier template : c'est directement dans le fichier awk.
  • Pas besoin de find, c'est géré dedans le script
  • Les options sont écrites en dur.
  • Les dates de publication ne sont pas dans un fichier séparé.

Vraiment, awk, c'est chouette !

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-05-09-generate-atom-feed-from-any-plaintextfr.txt

2022-05-09T12:50:44Z

<![CDATA[

TL;DR

mkdir site
cd site
mkdir blog
vi blog/entry1.txt
# write something, first line is title
date +'%Y-%m-%dT%TZ' > blog/entry1.txt.pubdate
$ find blog/ | awk -v domain="domain.tld" -v max=100 -v template=template.xml -f atom.awk > atom.xml

Description

Que vous écriviez vos billets de blog en text brut, markdown, gemtext ou je ne sais quel autre langage, vous souhaitez probablement créer un flux atom. Avoir du contenu html est peu pratique (il faut échapper le code html) et ajoute des contraintes inutiles à un flux atom. Je vous propose de publier vos articles avec la même apparence dans le flux que dans le fichier source.

C'est ce qui est d'ailleurs proposé sur le site shinobi.website : publier du contenu via un flux ATOM seulement.

Cet outil va prendre en entrée une liste de fichiers contenant les billets de blog et génère un flux ATOM valide. Chaque objet du flux ATOM a pour description le contenu du billet.

Pas besoin d'échapper du html : c'est du texte brud dans une balise CDATA.

Vous pouvez même écrire "]]]]><![CDATA[>" dans vos billets, ça sera échappé (pas comme le script de shinobi.website).

Pour intégrer un fichier "blogentry.txt" dans le flux, un autre fichier nommé "blogentry.txt.pubdate" doit se trouver juste à côté. Ce dernier contient la date de publication au format '%Y-%m-%dT%TZ' (voir strftime).

Il suffit d'awk pour utiliser atom.awk, disponible sur la plupart des unix-likes.

Téléchargement

=> atom.awk.tgz

Options

  • "max" : maximum d'entrées dans le flux
  • "domain" : Nom de domaine du flux
  • "template" : Fichier modèle au début du flux à ajuster à vos beosin. voir template.xml dans l'archive

Exemple

$ find blog/ | awk -v domain="domain.tld" -v max=100 -v template=template.xml -f atom.awk > atom.xml

Voir aussi

=> https://shinobi.website/index.txt

Une réaction?

=> Envoyez votre commentaire | Voir les instructions pour utiliser la mailing-list

]]>

https://si3t.ch/log/2022-05-09-generate-atom-feed-from-any-plaintext.txt

2022-05-09T12:45:44Z

<![CDATA[

TL;DR

mkdir site
cd site
mkdir blog
vi blog/entry1.txt
# write something, first line is title
date +'%Y-%m-%dT%TZ' > blog/entry1.txt.pubdate
$ find blog/ | awk -v domain="domain.tld" -v max=100 -v template=template.xml -f atom.awk > atom.xml

Description

Whether you write files in plaint text, markdown or any other markup language, you may want to create an atom feed.

That's actually what is proposed on shinobi.website.

You can even publish a whole blog only using ATOM feed.

This tool take a list of file as input and will generate an atom feed with the content of each fil as description.

No need for html escape or any conversion : it is plain text in a CDATA tag.

You can even write "<![CDATA[" in your pages, it will be escaped (not with shinobi.website's script for now, not sure how to reach the author to tell).

In order to include a file "blogentry.txt" in the feed, another file with the publication date must be next with the extension "blogentry.txt.pubdate". Date should be formatted '%Y-%m-%dT%TZ' (see strftime).

atom.awk is an awk script, available on most unix-like.

Download

=> atom.awk.tgz

Options

  • "max" : maximum of item in the feed.
  • "domain" : domain name of your feed.
  • "template" : template file, the header of your atom feed. See template.xml as example.

Example

$ find blog/ | awk -v domain="domain.tld" -v max=100 -v template=template.xml -f atom.awk > atom.xml

Now publish atom.xml file.

See also

=> https://shinobi.website/index.txt

Something to say

=> Any comment ? | See instructions about the mailing list

]]>

https://si3t.ch/log/2022-05-08-gemlog-only.txt

2022-05-08T21:26:48Z

<![CDATA[

I used to publish content on my http website and gemini capsule. It's over now, all my blog entries will be gemini-only available.

However, I keep atom feeds still available using http since few feeds readers support gemini yet. And I love RSS/ATOM feeds.

Actually, you even can read my feed with a recent browser since I discovered the existence of xslt.

The funny part is that while I was cleaning and rethinking the way I write on by blog -- now gemlog --, f6k told me about shinobi websites. They are RSS/ATOM only blogs, and I really like the idea.

I keep most pages readable through http(s) AND gemini, they are notes and more mature writings (I hope). The gemlog is more about long thougts and tryouts over time. For very short thougts, there is my twtxt.

=> My gemlog's atom feed | GOING DARK (BUILDING A SHINOBI SITE) | Shinobi website | f6k | my twtxt's ATOM feed.

]]>

https://si3t.ch/log/2022-05-04-tmux-automatique.txt

2022-05-04T16:16:44Z

<![CDATA[

Habitué à dwm depuis des années, j'ai tendance à ouvrir un terminal à la moindre occasion avec le raccourci Alt-Shift-Return. Dès que j'ai une petite commande à lancer, hop, un nouveau terminal!

Cela devient inutile depuis que j'utilise tmux justement pour remplacer les tas de terminaux que j'ai d'ouvert. C'est très pratique pour occuper au maximum l'espace disponible à l'écran. J'apprécie avoir toutes mes fenêtres maximisées : cela m'aide à me concentrer et je n'ai pas l'impression d'être serré. C'est d'ailleurs facile à faire avec dwm puisqu'il propose un arrangement maximisé par défaut.

Au lieu d'ouvrir un nouveau terminal totalement indépendant de tmux, j'ai décidé qu'un nouveau terminal ouvert rejoindrait automatiquement ma session tmux. Dans ~/.kshrc, j'ai donc :

if [ -z "$TMUX" ]; then
    tmux has-session || tmux new-session
    tmux new-window \; attach
fi

On verra à l'usage ce que ça donne. Si ça se trouve, ça va m'être pénible à la longue, mais pour l'instant c'est plutôt adapté ^^.

=> dwm

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-04-27-twtxt2atom.txt

2022-04-27T18:20:59Z

<![CDATA[

I wrote some time ago about twtxt :

=> https://si3t.ch/Logiciel-libre/twtxt.xhtml | gemini://si3t.ch/Logiciel-libre/twtxt.gmi

Mostly, my usage was to bookmark interesting urls so I can find them later.

Since, I am attracted to go back to networks like Mastodon (or ActivityPub like). Community is great, and I like to share with others.

However, I don't like the whole "retweet" or "boost" or "followed by nth users" or all those ad-like-ego-masturbation stuff. Some even use mastodon (or alike) as a way to communicate, dabate, exchange messages, and I hate this : there is XMPP or email to speak to others.

On the other hand, I enjoy reading peoples RSS feeds since they are public. I think there are quick thoughts one might share and it don't fit well in a blog since it's very short.

That's why I've decided to use a bit more twtxt.txt, it's an answer to the above issues that suits me, and it can be hosted by anyone EVERYWHERE (even on gemini :)). (I plan to write a twtxt gemini client...). It's easy to add or remove content, and it is light -- at least much lighter than a database behind mastodon.

=> Because I like reading others feeds, I set back my twtxt.txt atom feed.

I rewrote a script that was rotting on my hard drive for too long : twtxt2atom. Now, it output valid ATOM feed (according to W3C). It's written on OpenBSD, Linux users should modify sha256 to sha256sum.

=> There it is with comments : twtxt2atom.tgz

Now I plan to use twtxt.txt more often, and follow other's twtxt.txt since I currently don't really do.

UPDATE 1 : Instead of percent encoding reserved characters, which is sensitive, I use "CDATA".

UPDATE 2 : now you can write "<![CDATA[ stuff ]]]]><![CDATA[>", especially "]]]]><![CDATA[>" (why ?) in a tweet without having an error.

Something to say ?

=> Send a comment by email. | Read mailing list instructions to see answers.

]]>

https://si3t.ch/log/2022-04-19-printemps-charge.txt

2022-04-19T11:26:07Z

<![CDATA[

C'est le printemps! Quel plaisir de voir le Soleil briller, c'est bon pour le moral 🌞.

Cette période me donne envie de faire plein de choses. Mes projets sur ordinateur sont un peu mis de côté pour l'instant, car le soir, c'est le sommeil qui gagne. Il faut dire que les enfants se réveillent à nouveau plusieurs fois par nuit, chacun leur tour... 😫

Déjà, il faut faire le contrôle technique de la petite twingo qui nécessite des réparations dont je suis plus ou moins capable : changer les essuie glace (ça va 😁), les pneus et les plaquettes de frein (incapable), nettoyer tout l'extérieur et ranger l'immense bazar accumulé par madame la maîtresse d'école (ça va aussi...). C'est incroyable, on dirait un bureau ambulant!

Ensuite, le jardin. Ça, c'est long! Déjà, tondre la pelouse. Fastoche, mais ça prend déjà une journée.

Car oui, avec les enfants, seules quelques heures par jour sont utilisables pour s'occuper de la maison. Et c'est pas grave, on passe de bons moments ensemble.

Donc je disais, le jardin.

J'avais bien pensé à étaler des feuilles en automne et à pailler l'hiver afin d'affaiblir les mauvaises herbes et permettre aux petits vers de terre de s'éclater en plus de fertiliser le tout. Ça avait bien marché l'an passé, j'avais retrouvé un terrain agréable à travailler. Il faut dire uqe j'ai une terre très argileuse...

Malheureusement cette année ça n'a pas fonctionné. Ai-je paillé trop tard? Aurais-je du passer la grelinette avant de pailler? Ai-je trop étalé de feuille et étouffé le terrain? Quoi qu'il en soit, je retrouve un sol très dur, avec de grosses mottes très difficiles à briser. Ça m'a donné du travail, et c'est loin d'être parfait... Merci la grelinette, la griffe et la houe, sans oublier mon petit garçon plein d'enthousiasme.

Après avoir tenté un jardin en cercle, puis par division de 4 carrés, je décide cette année de faire de simples rangs avec des buttes. C'est apparemment conseillé pour de la terre argileuse.

Je me retrouve donc à galérer avec ces grosses mottes. Cependant, je gagne beaucoup de place, et je suis un peu embêté car j'ai du mal à associer les plantes afin de varier hauteur : au sol/ mi-hauteur / à rames.

Il me faudra aussi réfléchir à la rotation des cultures pour avoir toujours ou presque quelque chose qui pousse.

J'ai presque fini, j'en arrive à ce plan qui est loin de me satisfaire dans l'association des cultures.

J'ai un terrain presque carré, du coup c'est facile de le diviser. Il y a juste une tout petit triangle en haut qui me permet de mettre ce qui traîne. J'ai d'ailleurs découvert le plan de poire-melon qui a survécu à l'hiver. Tout comme tout un tas de panais (méga récolte!), de fenouil encore petit et bien sûr la rhubarbe qui n'a pas bougé.

-----------> Vent ----------->

                                           +------------------------------+
                                           | Poire-melon  courge musquée  |
                                           +------------------------------+
+----------------------------------+   +----------------------------------+
| Haricots + Betterave + épinards  |   | pois + betterave + épinards      | 
+----------------------------------+   +----------------------------------+

+----------------------------------+   +----------------------------------+
| Rutabaga + potiron + tournesol   |   | Panais +  Butternut              |
+----------------------------------+   +----------------------------------+

+----------------------------------+   +----------------------------------+
| Poirée + Fenouil                 |   | Origan + Tomates x 6 + basilic   |
+----------------------------------+   +----------------------------------+

+----------------------------------+   +----------------------------------+
| Tomates x6 + basilic             |   |  Pois + artichauts x 5           |
+----------------------------------+   +----------------------------------+

+----------------------------------+   +----------------------------------+
| Courgettes x 2 + fenouil         |   | Poirée + Rubarbe                 |
+----------------------------------+   +----------------------------------+

+----------------------------------+   +----------------------------------+
| Pois + salades + rutabaga        |   | Haricots + salades + panais      |
+----------------------------------+   +----------------------------------+

Petits pois et haricots à rames

Encore un petit effort, je voudrais avoir paillé un peu le terrain et installé des filets et des supports pour que les haricots et pois grimpent.

Vive le printemps!

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-04-08-solutions-energetiques-existent.txt

2022-04-08T10:59:13Z

<![CDATA[

Chers enfants, dans les années à venir, ça va être chaud pour vos gueules.

Non, vous n'avez rien demandé, on a tout pollué et on continue encore. C'est injuste hein ? Et c'est bien la merde...

Vous vous en doutez, lorsqu'on parle du réchauffement climatique et de ses causes en classe, c'est compliqué à accepter pour un enfant.

Des élections présidentielles sont imminentes en France, et les questions des choix énergétiques futurs sont peu ou mal abordées. Pourtant, si on veut faire face à l'urgence, la politique doit se former à la science qu'est l'écologie.

=> Urgence oui, 3 ans pour agir...

La plupart du temps, on parle des sources comme les éoliennes, l'hydraulique, en insistant sur leurs défauts plutôt que les avantages que ces solutions représentent face aux hydrocarbures.

Je me permets à ce titre de rappeler que du charbon, du gaz, une fois brulé, c'est du CO₂ qui se balade dans notre atmosphère sans solution évidente pour le retirer. C'est un réchauffement inévitable est des morts certaines.

Pour répondre à ce problème, rappelons que le nucléaire ne rejette pas DU TOUT de CO₂. En terme de gaz polluants, le nucléaire, c'est propre. Oui, la construction des centrales, le traitement des déchets, la sécurité à assurer ne sont pas négligeables. Oui. Comme toujours, il y a des inconvénients, qui sont pourtant moins préoccupants que l'inévitabilité des dégats causés par les hydrocarbures.

J'aimerais profiter de ce billet pour rappeler, à mes élèves, à mes lectrices et lecteurs et à moi même (jeune papa) qu'il EXISTE DES SOLUTIONS. Parfaites? Sans doute pas, mais sans aucun doute meilleures que celles précédemment citées, ou en tout cas complémentaires.

L'espoir est permis, et ne laissons pas des débats politiques et peu scientifiques éclipser ces possibilités.

Ce que je vais décrire là, c'est un petit peu de chimie toute bête, pas besoin d'avoir un master pour comprendre.

Plutôt que de brûler des hydrocarbures, on peut brûler le dihydrogène (H₂). Cette combustion dégage de la chaleur que l'on peut utiliser pour faire tourner un alternateur et récupérer de l'électricité : exactement ce qui se passe dans une centrale à charbon, dans une centrale nucléaire, dans une centrale hydraulique...

L'avantage de cette combustion, c'est que son unique produit est de l'eau. DE L'EAU! Juste de la vapeur d'eau qui donnera de la pluie si on ne la récupère pas :

2 H₂ + O₂ → 2 H₂0

Le point critique est la façon dont on obtient du dihydrogène. Ça peut être très polluant, mais aussi très propre. En effet, on peut casser la molécule d'eau (hydrolyse) et faire la réaction inverse :

2 H₂0 → 2 H₂ + O₂

C'est très facile à réaliser, vous pouvez même le faire avec une pile : reliez un fil électrique de chaque borne dans de l'eau : des bulles vont apparaître. D'une borne, c'est le O₂ qui se forme, de l'autre le H₂. Si vous tentez, faîtes-le avec une pile, c'est dangereux de le faire avec le secteur, à moins de savoir ce que vous faîtes.

Il suffit alors de stocker H₂ et O₂ pour les utiliser comme combustibles lorsqu'on a besoin d'énergie. Le courant électrique utilisé pour les récupérer, c'est celui dont on n'a pas besoin lorsqu'il y a trop de soleil ou trop de vent, ou qui vient de smarées, ou une autre source propre...

Bien sûr, stocker le dihydrogène n'est pas si simple (c'est explosif), cela demande des matériaux qu'il faudra recycler (comme pour les éoliennes), mais ces contraintes sont TELLEMENT moins pénibles que celles imposées par les autres alternatives (déchets radioactifs, gaz à effets de serre). C'est un système pour laquelle nous comprenons les principes et pour lequel nous avons la technologie, qu'il reste à développer si on le souhaite.

À ce titre, je l'affirme, il existe des solutions propres, l'espoir est possible, mais il faut déjà en avoir conscience.

La 2e solution, c'est d'arrêter de consommer n'importe comment.

À ce titre, je vais bientôt passer 1 journée sans électricité. Ça va arrêter mon serveur, ainsi que tous les autres appareils. Cette petite expérience, je l'ai déjà faite, et j'en ressort toujours satisfait et apaisé pour de mutiples raisons qui sortent du cadre de cet article. Je vous invite à tenter, rien que pour démontrer qu'on peut très bien vivre avec moins (pas) d'électricité pendant une journée sans problème :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-03-22-nethack-11.txt

2022-03-22T21:47:28Z

<![CDATA[

Hello prx, the gnomish Wizard, welcome back to NetHack!

Mouhahaha, à moi les forces du cosmos!

Je me promène un peu, tout va bien, le sort "force bolt" fait des dégats et mon chaton m'aide bien.

Ce n'est qu'arrivé au niveau 3 que je pense à revérifier mon inventaire, après avoir laissé cette partie traîner quelques semaines. Et que vois-je? Des anneaux! Je m'empresse de les enfiler, et je ne suis pas déçu :

J'enfile d'abord l'anneau d'invisibilité :

Gee! All of a sudden, you can't see yourself.

Puis un anneau pour voir l'invisible :

Suddenly you are transparent, but there!

Les devs ont vraiment pensé à tout !

Je termine le niveau 3 sans encombre et gagne un peu d'expérience.

Maintenant que je suis invisible (je suppose), je vois ce message apparaître sur le sol :

"You nig?t tr?c? a ?hopkeepcr if you'r? ?nvi?ib|c.".

Hum... Apparemment je dois pouvoir faire un truc à un vendeur si je suis invisible...

Le truc quand on lance des sorts, c'est que ça donne faim. Je trouve heureusement 2 rations par coup de chance.

Ce niveau est tout en zig zag, c'est difficile de trouver les passages secrets.

Alors que mon chaton tombe dans un piège qui le téléporte, je choisis de descendre un peu plus profond.

C'est en fait un escalier vers les mines. Pas sûr qu'y aller sans mon chat soit très prudent... Tant pis, je suis un sorcier, il faut que j'entraîne mes sorts :)

J'y trouve une amulette, et puisque je suis curieux, je l'envie aussitôt :

It constricts your throat! B - an amulet of strangulation (being worn).

Quelle bonne idée!

Et bien sûr, elle est maudite, impossible de l'enlever.

Vite, un parchemin pour retirer ce mauvais sort

You feel like someone is helping you. You find it hard to breathe.
You can breathe more easily!

Ouf !

Je craignais de ne pas pouvoir lire tout en étant étranglé.

L'exploration continue, et j'ai la joie de découvrir un pot de graisse. Merveilleux!

On croise des nains et des gnomes sympas dans le coin. C'est rare de ne pas se faire attaquer dans nethack, c'est sans doute parce que je suis invisible, et parce que je suis moi même un gnome :). J'en profite pour amasser les XP en tuant tout ce que je croise.

Malheureusement, je tombe dans un trou pendant cette exploration! Je ne perds pas de PV, mais je n'ai plus d'échappatoire.

Alors que j'explore tranquilou, récupère une bagette magique sur le corps d'un hobgoblin, je re-tombe dans un trou !!!

Me voilà donc au niveau 8 du donjon, avec 2 niveaux partiellement explorés et sans mon chat. Toutefois je tombe juste à côté d'un escalier. Le bol! Alors je remonte :)

Cela me permet de reprendre mon exploration.

Je trouve des baguettes que je m'empresse de tester. La première accélère un rat. La seconde resuscite un orc. La seconde n'était pas une bonne idée...

Je n'ai plus de points de magie, je dois trouver refuge alors que les orcs sortent du mordor. C'est en remontant d'un niveau qu'un werejackal se transforme en humain XD.

Heureusement je récupère vite pour pouvoir déguster mon plat :

This Mordor orc corpse tastes okay. You finish eating the Mordor orc corpse.

Me voilà niveau 6 avec le debuff "Satiated", ce qui fait plaisir après avoir frôlé la famine :)

En reprenant mon exploration, sans savoir pourquoi, je me transforme!

You turn into a werejackal! You shrink out of your cloak!
Your helm falls to the floor! Your boots are pushed off your feet!
You find you must drop your quarterstaff!
Use the command #monster to summon help.
You can't even move a handspan with this load!

Donc, ça veut dire plus d'équipement et surcharge qui m'empêche de bouger. Mais POURQUOI??? Serait-ce parce que je me suis fait mordre auparavant par un werejackal ? Si oui, c'est vraiment embêtant (et très bien pensé par les devs :)) Je n'aurais peut-être pas dû en manger aussi...

Je suis le conseille et lance "#monster" : cela attire des jackals à ma rescousse!!! oO

Je n'ai vraiment pas envie de rester un lycan. Tentons le tout pour le tout :

#pray
The voice of Thoth booms out: "Thou hast strayed from the path, creature.
"Thou must relearn thy lessons!" You feel foolish!

Hum... Le cannibalisme n'a pas dû être apprécié! Quel chipoteur ce Thoth! Il n'avait plus besoin de ses jambes voyons, il était décédé ce gnome! (en vrai j'avais oublié que j'étais un gnome à ce moment là, à force de jouer en découpé...)

Bon, plus qu'à continuer ainsi... Ou alors, je tente de boire les potions dont j'ignore les effets... Avec une énooorme chance, qui sait?

En vrai, je n'ai surtout pas envie de continuer dans cet état, alors je jouerai bien le tout pour le tout.

Gloups!

Bon, ça ne fait rien apparemment...

Je me débarasse de mon équipement superflu et c'est reparti. En quelques tours, me revoilà sous forme normale, mais entouré de tous ces anciens copains venus à mon aide, qui maintenant sont hostiles !

Pas de problème, j'utilise la baguette lance missile qui traverse tous ces ennemis dans le couloir \o/.

Sauf que de l'autre côté, des orc du Mordor se lancent à l'attaque. Gasp

Je n'ai plus que 11 PV et presque plus de Mana, coincé dans un couloir. Ça semble vraiment mal barré. Pas le choix :

What do you want to write in the dust here? Elbereth

Ça n'a pas l'effet escompté :

The wolf bites!
You die...

Leçons : ne pas manger les gens et se méfier des lycans

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      120 Au      |
                  | killed by a wolf |
                  |                  |
                  |                  |
                  |                  |
                  |       2022       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Wizard...

You died in The Gnomish Mines on dungeon level 6 with 1942 points,
and 120 pieces of gold, after 3026 moves.
You were level 6 with a maximum of 56 hit points when you died.

La prochaine fois, je fais une partie d'une traite.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-03-16-pick.txt

2022-03-16T13:43:49Z

<![CDATA[

Pour sélectionner rapidement un fichier dans une liste, pour choisir un emoji, pour copier une adresse mail stockée dans un fichier et j'en passe, on entend souvent parler de fzf.

Certes, il est excellent, mais je voulais vous parler aujourd'hui de pick :

=> https://github.com/mptre/pick

Ça fait la même chose, mais en plus léger :)

Pour par exemple choisir un fichier "modèle", j'utilise ce script :

#!/bin/sh
tpl=$HOME/.templates/
cp $(find $tpl -type f | pick) .

=> Voir aussi l'excellent et plus rapide fzy

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-03-09-pensees-positives.txt

2022-03-09T08:02:25Z

<![CDATA[

Je me suis réveillé avec une idée qui m'a donné le sourire. Suite à tout ce merdier à cause du dictateur Poutine (qui semble avoir oublié que son peuple est originaire d'Ukraine, donc que la Russie devrait revenir à l'Ukraine en fait :trollface:), on va finalement avoir une raison inévitable de recourir à des sources d'énergie différentes des hydrocarbures.

Cela va peut-être, j'espère, accélérer la transition énergétique indispensable à notre survie en tant qu'espèce. Allons nous gagner en intelligence ensuite? L'humanité va-t-elle grandir un petit peu? J'ose l'espérer.

Bon, d'ici à ce que je soit obligé d'acheter une voiture électrique pour aller au travail, j'aurai vidé toutes mes économies dans le carburant, mais c'est un autr eproblème :P. Ironie à part, il faut se faire une évidence : les hydrocarbures doivent devenir hors de prix pour qu'une dynamique de changement opère. L'énergie carbonée est très peu chère!

Je profite de ce mini billet d'humeur pour partager toutes mes pensées et mon soutien à ces humains qui fuient la guerre pour rester en vie ou qui subissent l'oppression dictatoriale d'un mini Ivan-le-Terrible.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-03-03-sit-and-talk.txt

2022-03-03T11:58:00Z

<![CDATA[

I had to host it, just so you can remember :

=> Sit and Talk !

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-02-28-httpd_gzip-committed.txt

2022-02-28T09:37:31Z

<![CDATA[

=> Aujourd'hui, j'ai pu lire le message suivant :

Add gzip-static option to httpd. This allows to deliver precompressed files with content-encoding gzip. from prx at si3t dot ch; OK tracey@

Wouhou, après avoir été initié par Solène, proposé une fois, puis reproposé récemment, puis légèrement modifié, c'est finalement intégré \o/

Le serveur http par défaut d'OpenBSD peut désormais servir les fichiers compressés de façon transparente et réduire considérablement la quantité de bande passante nécessaire.

Autrement dit, si une version gzippée d'un fichier est disponible à côté du fichier non compressé, et si le navigateur supporte la décompression, alors c'est le fichier compressé qui est transféré.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-02-26-violence-refuge-incompetence.txt

2022-02-26T15:12:24Z

<![CDATA[

Cette phrase a été écrite par Azimov. Cette dernière m'avait touché la première fois que je l'ai lue. Elle résonne d'autant plus fort au regard des évènements en Ukraine.

Je suis effrayé.

Depuis tout gamin lorsque j'ai vu un livre illustrant "Malbrough s'en va-t-en guerre", puis lorsque comme tout écolier on m'a parlé des 2 guerres mondiales. Mon grand frère, mon père vont ils être appelés pour faire la guerre ?

Maintenant, c'est moi le père.

Ce n'est pas moi que l'on appelle (pour l'instant), mais je constate avec horreur des publications sur les réseaux sociaux de photos m ontrant des jeunes s'enrôlant de plein gré.

Pire, ces derniers sont mis sur un piédestal, chacun saluant leur courage.

Cela m'effraie

Ils ne sont pas courageux, ils sont inconscients. Dans quelques jours, ils seront morts.

Des héros, mais morts.

Où est l'héroïsme là dedans? Des vies gachées pour des états qui ne sont que des conceptions virtuelles et servant des intérêts démesurés.

Alors forcément je me projette, je m'imagine devoir prendre les armes.

Pour ma famille, en dernier recours, j'en serais capable. Peut-être.

Pour un pays? Jamais je n'en aurait le courage.

Je déteste la violence, je hais les armes. Elles ne servent qu'à faire du mal, dire le contraire est idiot.

Lire le contraire m'effraie

Peut-être suis-je un lâche.

J'aime à penser que le vrai courage se situe à réfléchir à des solutions non violentes. D'être capable de se tenir devant l'ennemi sans armes et trouver une solution intelligente à un conflit. Une sorte de Dr Who. Ça, c'est de l'héroïsme.

Je ne serais jamais un héros. Qu'on me méprise, qu'on me traîte de lâche, c'est ainsi. Mais que l'on ne décrive pas comme héros un groupe de soldats répondant avec vulgarité "allez vous faire foutre". Ils sont juste morts, pour rien, car cette bravade n'a rien changé. Ce n'est ni drôle, ni courageux : c'est affreusement triste.

Qu'on plébiscite cet évènement... Cela m'effraie

Tout ça pour des histoires d'intérêts financiers, de gaz qui pollue de toute façon la terre de nos enfants, au profit de quelques égoistes.

Imaginer que mes enfants vont devoir grandir dans un monde où l'humain n'a rien appris du passé m'effraie.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-02-14-zerohost12.txt

2022-02-14T15:46:16Z

<![CDATA[Une petite brève pour signaler la mise à jour de zerohost.

Pour rappel, il s'agit d'un script qui rassemble depuis plusieurs ressources une liste de domaines malveillants à blacklister. L'utilisation d'un fichier /etc/hosts permet d'alléger la charge d'une machine puisque cela évite une requete DNS pour un domaine qu'on voudrait de toute façon ensuite bloquer (avec un addon ou je ne sais quoi).

=> zerohosts (html) | zerohosts (gemini)

Comme toujours quand je remets le nez dans du vieux code, je désespère de lire mes anciennes bafouilles.

Le code est désormais nettement plus court (merci awk).

Je suis toujours à la recherche de sources si vous en connaissez davantage ;)

Si utiliser ce script ne vous tente pas, rappelez vous que je sers un fichier hosts disponible ici :

=> hosts.txt (contient actuellement ≈ 135000 domaines)

Ceci parmi d'autres listes ;) :

=> /evils/

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-02-09-isitdown.txt

2022-02-09T14:11:37Z

<![CDATA[

Pour être automatiquement averti si mon site ou un des services que j'héberge est en panne, j'ai configuré un petit script que j'appelle périodiquement sur ma VM chez openbsd.amserdam : il s'appelle isitdown.

Vous pourrez le télécharger ici :

=> /code/isitdown.tgz

Voici la ligne ajouté à mon crontab afin de faire tourner ce script toutes les heures:

~ * * * * /home/prx/bin/isitdown /home/prx/isitdown.cfg

Comme vous le voyez, il prend en entrée un ficher "isitdown.cfg". On pourrait l'appeler comme on veut, il s'agit d'un bête fichier texte rempli de lignes ressemblant à :

# services persos
si3t.ch www prx@si3t.ch
si3t.ch smtp prx@si3t.ch
si3t.ch imaps prx@si3t.ch
si3t.ch domain prx@si3t.ch
si3t.ch xmpp-server prx@si3t.ch

# Les cop(ain|ine)s
unbon.cafe 1965 foo@bar
automario.eu 443 foo@bar
linuxmario.net 443 foo2@bar
vinishor.xyz 443 foo@bar
...

Le script va simplement lancer un netcat sur chacun de ces domaines au port correspondant. Le port peut être un nombre ou bien le nom du service défini dans /etc/services.

En cas d'échec, l'adresse mail de la ligne correspondante est notifiée.

Par la même occasion, on garde trace de l'heure à laquelle le service était inaccessible. Ça permettra d'éviter de spammer une adresse en vérifiant si un fichier contenant cette information existe déjà.

Voici à quoi ressemble le script avec des commentaires :

#!/bin/sh
# Author: prx 
# licence: MIT
# read $1 with lines like : 
#   

# adresse mail de l'expéditeur
fromaddr="$(whoami)@$(hostname)"
# dossier où on gardera trace des échecs
db=$HOME/.isitdown

# on crée ce dossier s'il n'existe pas déjà
test -d "${db}" || mkdir -p "${db}" # create db directory if needed

# on envoie le fichier de configuration en supprimant les commentaires avec grep
# puis on met chaque champ dans les variables domain port et email
grep -v "^#" "$1" | while read domain port email
do
	# vérifications idiotes pour s'assurer qu'il ne manque pas un champ
	test -z "$domain" && continue
	test -z "$port" && continue
	test -z "$email" && continue
	# on enregistre à quoi ressemblera le fichier qui contiendra l'heure d'un éventuel échec
	r="${db}/${domain}-${port}"

	# hop, netcat tente une connexion
	/usr/bin/nc -zw1 "${domain}" "${port}" >/dev/null 2>&1

	# netcat a échoué
	if [ $? -ne 0 ]; then
		# on vérifie si un fichier attestant d'un échec précédent existe
		if [ ! -f "${r}" ]; then
			# ce fichier n'existe pas, on alerte la personne concernée
			printf "Connection to %s port %s failed 😨\nIs it down?"\
						"$domain" "$port" \
				| /usr/bin/mail -s "ISITDOWN: ${domain} down?" \
						-r "${fromaddr}" "${email}"

			# On enregistre la date dans ce fichier
			date "+%Y-%m-%d %H:%M" > "${db}/${domain}-${port}"
		fi
	else
		# la connexion a réussi
		if [ -f "${r}" ]; then
			# La connexion avait échoué auparavant, on prévient que tout est revenu à la normale

			printf "%s on port %s is back online 😃\nIt was down since %s."\
						"$domain" "$port" "$(cat ${r})" \
				| /usr/bin/mail -s "ISITDOWN: ${domain} up :)" \
							-r "${fromaddr}" "${email}"
			rm "${r}"
		fi
	fi
done

Si vous le souhaitez, je peux ajouter le nécessaire à ma liste pour vous notifier si votre serveur a un souci. Juste, envoyez moi un mail ;)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-02-06-gemini-services.txt

2022-02-06T14:59:17Z

<![CDATA[

Just for you, I host a few gemini-only services on my server.

=> https://tildegit.org/solene/vger They're just CGI's executed by vger server.

=> Get a few random passwords | Read an OpenBSD's manpage | Read a fortune | Check if a domain is reachable on a specific port

You also can check if a service is up by entering domain and a port directly : "gemini://si3t.ch/cgi-bin/isitup?wikipedia.org%20443". The "%20" is a percent-encoded space :)

I wonder what other things may be useful. Any idea?

Something to say ?

=> A comment? | How to read answers to you comments ?

]]>

https://si3t.ch/log/2022-01-29-xhtml.txt

2022-01-29T14:42:49Z

<![CDATA[

On est en 2022, et je me suis donné pour défi de refaire mon site en xhtml.

Désormais, mes pages sont livrées avec un "Content-Type application/xhtml+xml".

Mais pourquoi?

À l'origine, c'est en réfléchissant à une façon de convertir du gemtext en epub. Or le epub, c'est du xhtml gzippé (en gros).

Ce n'était pas bien difficile, il suffisait de bien fermer les balises html.

Ensuite, je me suis aperçu que cela me forçait à écrire du code plus propre. Un peu comme être contraint par le langage C force à mieux s'y prendre.

Enfin, je dois admettre que je ne connaîtrait jamais toutes les balises en html5. D'ailleurs, c'est même difficile de savoir s'il vaut mieux utiliser l'une ou l'autre pour favoriser l'accessibilité. "" ? "" ? "" ?

En xhtml, la liste est plus accessible pour moi.

Voilà donc un petit exercice personnel que j'ai apprécié : j'aime la rigueur parfois ^^. Au moins, s'il y a un souci quelque part, ça se voit très vite puisque le navigateur refuse d'afficher la page.

J'ai appris des choses, notamment que le xhtml n'est pas parsé de la même façon que du html.

=> Quoi qu'il en soit, c'est satisfaisant de réussir à produire une page de plus de 530k (guide auto-hébergement) destinée à être imprimée ou convertie en PDF et de voir le w3c le valider :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-01-24-ou-sont-les-masques.txt

2022-01-24T11:29:12Z

<![CDATA[

=> Les annonces "exceptionelles" (wouhou) suite au mouvement de grève dans l'éducation nationale promettaient :

  • Des masques chirurgicaux voire même FFP2
  • Des remplaçant supplémentaires

C'était le 13 janvier. Nous sommes le 24.

Je n'ai toujours pas de nouveau masques que ceux donnés en octobre (sous réclamation). Ni chirurgicaux, ni FFP2.

Mes collègues tombent malade les uns après les autres, sans jamais être remplacés.

Les écoles restent ouvertes, mais sans profs ni élèves dedans.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-01-17-apprendre-a-se-satisfaire.txt

2022-01-17T10:41:14Z

<![CDATA[

Est-ce la période anxiogène ou seulement un peu trop de travail, je me retrouve actuellement dans une période où j'enchaîne les insomnies. Les jeunes enfants ne sont pas en cause, ils dorment, mais j'ai gardé l'habitude de me réveiller à 4h du matin sans pouvoir me rendormir.

Ce sentiment opressant qu'il y a urgence de faire tout un tas de choses, et la liste tourne en tête en analysant tous les moyens pour y arriver le plus efficacement possible. Mon coeur bat à tout rompre, le souffle s'accélère et l'anxiété devient étouffante.

Alors que... Je n'ai pas de quoi stresser !

Je dois donc me ménager un peu de temps pour souffler et réussir à me coucher satisfait. Entre le travail, et gérer les enfants, deux activités que j'aime mais qui prennent tout mon temps et mon énergie, ce n'est pas facile de retrouver du temps pour des activités personnelles.

Or, j'en ai besoin.

Aussi, au lieu de vouloir faire un peu de tout ce que j'aimerais faire, et finalement réussir à dégager suffisamment de temps pour chaque, je dois me rendre à l'évidence. Je dois apprendre à me satisfaire de ce que j'ai réussi à faire, voir cela comme une réussite plutôt que me concentrer sur ce que j'aurais aimé faire.

À partir d'aujourd'hui, je dois donc me sentir satisfait si j'ai pu réaliser l'une de ces activités pendant 30 min:

  • Aller courir / faire du sport
  • Jouer à l'ordinateur
  • Jouer de la musique
  • Lire quelques chapitres
  • Coder / hacker
  • Dessiner

Bon courage à mon moi du futur ^^

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-01-13-greve-de-prof.txt

2022-01-13T08:19:51Z

<![CDATA[

Aujourd'hui, on est grévistes à la maison.

Il est 7h45, et devinez quoi? Madame termine de préparer sa séquence sur la proportionnalité. Quant à moi, j'ai sorti les paquets de copies.

On fait grève, mais le travail ne manque pas. Il faut dire que depuis la rentrée, on n'arrête pas : gérer les absences, envoyer du travail à distance, ajuster le lendemain puisque des élèves étaient malades... À ceci s'ajoute pour moi les conseils de classe : 3h de réunion le soir + 1h de route ensuite. Oui, réunion, en PRÉSENTIEL : qu'on se le dise, le prof doit être ultra résistant au virus responsable d'une pandémie mondiale.

Tout à l'heure, nous irons manifester.

Je n'aime pas les manifs : c'est trop violent pour moi. Violence de la part de tous les acteurs d'ailleurs. Cependant, c'est tout ce qui reste pour faire passer un message.

J'irai manifester car mon employeur n'assure pas ma sécurité. Il annonce qu'un enseignant sur 3 sera malade d'ici un mois, mais n'investit aucune mesure pour m'en protéger. Pire, il n'assume pas non plus la sécurité de mes élèves et leur renvoie la responsabilité de transmettre le virus si l'autotest est mal fait. Un collègue est cas contact ? Qu'il finisse sa journée en classe avant de se faire tester, et tant pis pour les enfants.

Voilà 2 ans qu'on bricole tant bien que mal au nom de la continuité pédagogique. C'est épuisant de compenser l'incompétence gouvernementale avec si peu de moyens et surtout un manque total de considération. Pardon, il y a eu de la considération : on a filé des badges aux enseignants (https://www.20minutes.fr/societe/2811555-20200701-coronavirus-badges-remis-enseignants-mobilises-vrai).

On a tenu, pour les enfants, comme d'habitude.

Désormais, la "continuité pédagogique" n'est qu'un prétexte pour me rendre complice d'une désorganisation dangereuse.

Il me reste 30 minutes avant d'enfiler mon masque en tissus fourni par l'éducation nationale l'été dernier et aller rejoindre la marche des collègues excédés. D'ici là : copies et cours à distance \o/

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2022-01-05-mois-a-risque.txt

2022-01-05T13:49:32Z

<![CDATA[

... et pas que.

Mais je vais parler ici de mon cas.

J'entends à la radio qu'il n'y a pas de mesures particulières de prévues pour protéger les personnels (enseignants et autres) au contact quotidien de plusieurs centaines d'élèves et donc de foyers.

J'entends que l'on attends 1/3 de prof absent car malade d'ici la fin du mois. On le SAIT, et... c'est tout, on ne fait rien.

J'entends qu'il y a une augmentation des enfants hospitalisés à cause du COVID. Pas seulement, certes, et ça devait forcément arriver. Mais voilà...

J'entends qu'il faut privilégier le télétravail, mais les conseils de classe en présentiel sont tous maintenus et imposés.

Je ne me sens pas du tout en sécurité avec mes vieux masques pas du tout renouvelés. D'ailleurs, comme tout le monde, j'en achète des nouveaux. Ce n'est pas mon employeur qui va le faire.

Je n'ai pas peur d'être malade, j'ai fait ce qu'il faut : vacciné, j'aère ma classe... Mais est-ce suffisant pour assurer la sécurité de tous? Je ne peux pas faire mon métier assis derrière mon bureau : j'aide les élèves, je me déplace, je manipule avec eux. C'est normal, c'est mon métier, impossible de faire autrement.

J'ai peur de revenir avec ce virus à la maison et que cela mène ma conjointe asthmatique ou mes 2 enfants en bas âge en réanimation.

Je ne devrai pas avoir à subir cette responsabilité pour moi, mes proches et mes élèves.

Mais il faut tenir, Bruno Lemaire a annonce un maintien des prévisions de croissance, c'est apparemment le plus important.

Les soignants sont épuisés.

La charge que l'on impose aux services publics est traumatisante.

Pendant ce temps, on s'insurge des propos du président de la république à propos des antivax : ça fait du bruit, ce qui permet de ne pas s'intéresser aux vrais problèmes comme le dédain du ministre de l'éducation pour les enfants et personnels, du manque de moyens attribués aux hopitaux ou encore de l'urgence climatique. (par ordre croissant d'urgence).

Bon courage!

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-31-fin_2021.txt

2021-12-31T14:50:18Z

<![CDATA[

Nous vivons les dernières heures de 2021.

Alors que cette période de fin d'année est souvent synonyme de fête, de rires et de joie, je me sens comme d'habitude à cette époque : mélancolique.

Est-ce le regret du temps passé trop vite?

Peut-être un peu. C'est surtout que ça m'énerve de courir partout, voir les gens à 100 à l'heure parce qu'il faut s'organiser pour la prochaine visite à faire. Puis la fatigue de rester jusqu'à pas d'heure à table (j'ai envie de jouer à 7wonders moi, j'ai pas envie de reprendre des langoustines), de voir la débauche de surconsommation partout (j'ai pas envie de plein de cadeaux, juste jouer à Smallworld et aller me promener), sans parler de toutes les bétises que l'on vite avec la pandémie.

C'est aussi parce que encore une fois cette année, mon meilleur ami ne sera pas là pour commencer 2022.

2022 qui je le sens va commencer dans le chaos. J'espère me tromper, mais je parie que d'ici 2 semaines c'est la folie dans les écoles avec tout le monde malade.

Heureusement, je suis entouré d'une femme exceptionnelle dont l'intelligence et l'amour me fascine, de 2 enfants qui grandissent et m'étonnent chaque jour autant qu'ils m'empêchent de dormir ^^.

Je souhaite à tout le monde de trouver près de soi ceux qui vous font vous sentir vous même.

C'est pourquoi 2022 va aussi commencer par l'anniversaire de mon fils, puis par la lecture de la fin des archives de Roshar, puis par la lecture du tome 100 de one piece (oui j'ai du retard), puis par le recueil de nouvelles des utopiales, puis... tant de choses à lire \o/

C'est parti pour 2022 !

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-21-nethack-10.txt

2021-12-21T15:40:08Z

<![CDATA[

Hello prx, welcome to NetHack! You are a neutral male human Monk.

Niveau 1

Ça commence mal, je me prends les pieds dans un piège à ours dès les premiers pas. Finalement je m'en sors, mais en ayant perdu la moitié de mes points de vie :/

Ceci dit, je trouve un peu plus loin un fléau pour taper un peu plus fort, et l eniveau se termine vite :


                                  ----------     ---------
                                  |........| ####-.......|     ------------
                                  |.........##   |.......|    #-..........|
                                  |.....#{.| ##  |.......|    #|..........|
      --------------              -.--------     --|-#-.--    #|..........|
      |.......%....|               #               #   #      #---------.--
      |............|               #                   ########         #
      |.........^..|               #                #         ##        #
      |............|              ##                ######    ######  ###
      |<............####    ------|---                   #    #   -.--.-
      --------------   ##   |........|                  ##   ##   |....|
                        ##  |..@.....|                  ###  #    |....|
                         ###-........|                 -.-|-##    |..^.|
                            |........|                 |...|#     |....|
                            ----------                 |...|#     |....|
                                                       |....#     ------
                                                       |...|
                                                       |...|
                                                       -----

Prx the Candidate              St:16 Dx:10 Co:10 In:12 Wi:17 Ch:8 Neutral
Dlvl:1 $:13 HP:14(14) Pw:4(4) AC:4 Xp:1

Niveau 2

Descendons bien vite au niveau suivant.

Je constate alors que j'ai un livre de soin dans mon inventaire. En effet, je suis un moine, j'ai donc la possiblité de lancer des sorts. Chouette, c'est le genre qui devrait me plaire : des sorts et pas à m'inquiéter de l'arme choisie : je me bats à mains nues. Kiaï!

En me promenant dans ce niveau, je n'ai aucun mal à y tuer les monstres : un gobelin par ci, une grid bug par là...

J'ai l'heureuse surprise de trouver une grosse boite contenant plein d'or, un parchemin et encoooore un livre de soins. De quoi bien m'équipper dans le prochain commerce :)

     ------         ---------------
     |....|         |.............|
     |.....#########|.............|                                    ------
     |....|        #-.............|                                   #-....|
     |<...|    #####|.............|                                 ###|....|
     -.----   ##   #|.............|                        ############..>..|
      #      ##    #----.----------          ###############        #  |..(.|
      #      #     ######                 ####       ##          ####  ------
      #      #          #                ##      ###  ##         #
      ###    #          #               ##    -----.---.-----    #
        #    #         -.------------   #     |.............|#####
        #    #         |.........>..-####     |.............|#
        #    #         |.........@..|        #..............|#
        #    #         |.........f..|     ####|.............-#
       -.----#         |.............######   |.............|
       |....|#         |............|         ---------------
       |.....#         --------------
       |....|
       ------

Prx the Candidate              St:16 Dx:10 Co:10 In:12 Wi:17 Ch:8 Neutral
Dlvl:2 $:147 HP:14(14) Pw:4(4) AC:4 Xp:1

Niveau 3

Ici je découvre un nouveau monstre : un seigneur gnome. Après l'avoir aperçu, j'entends :

You hear crashing rock

Hum... pas sûr si c'est dangereux ou non...

Tant pis, j'y vais, c'est le tout début.

Alors en fait, il y a des gnomes partout... oO

Un gnome m'envoie une flèche, mais touche heureusement celui qui est devant lui et le tue.

Je fonce au combat, yaaah!

Ça secoue un peu, je tue un, puis 2 gnomes, et me trouve face à un sorcier.

Et après m'être fait pointé du doigt de multiples fois par ce sorcier gnome :

The gnomish wizard staggers from your powerful strike! You kill the gnomish wizard! Welcome to experience level 2

Je pense avoir compris : c'est comme la dernière fois, je ne suis pas dans le donjon principal, mais dans les mines. Je vais continuer un peu et m'enfuir dès que ça devient trop dur.

En quelques tours, j'en suis au niveau 4 à force de taper du nain et du gnome \o/

Mon chat a disparu cependant...

C'est étonnant comme niveau, c'est plein de petites pièces.

Il y a un piège, mais je survis. Le sort "healing" est finalement très utile.

Je retrouve mon chat un peu plus loin, il a du manger du gnome ^^

Sous un piège, j'y trouve un stétoscope. Bizarre, mais qui sait, peut-être pourrais-je l'utiliser contre un mur pour trouver des passages secrets? Ça semble tordu mais bon...

Je trouve aussi une pioche et un miroir \o/

Pour rigoler, je teste le stétoscope sur mon chat :

Status of the kitten (neutral): Level 1 HP 1(8) AC 6, tame.

Je crois qu'il a bien besoin de soins le pauvre :/

Après m'en être occupé, je crois avoir terminé d'explorer ce niveau qui ne mène nulle-part : il faut remonter :

                                     --------
   -----           ----         ---  .......----
   |...|           |..-----------..| ...---....-------      ---
   --.--           |.`........%)...----...|---.<.@...|      |.--         ------
    |.|           --.------------.......|.---|..#---.|      --.--        -....|
    |.|          --..|       -----.----.|....##--  |.-----   |.[|     # |.^...|
    |.--        --.)--      --..--.|   ...--..---  -.....----#.--     -#-...---
    |..|        |..--    ----......| ---#..#-....--..--([......#--#   |...--
    --.|        |%--    --.........---.#...----......|--.)........--  |.-#-
     |.|       --.|     |...........|................-----......|..-- |.| #
     |.|       |..|     |`..^)............----.--......|  --...---..--|.|
     |.|       |.--      -..............   --..--......--  --..|  -...|.|
     |.----    |.|       |.+--.........    -............|.--...|   --...|--.
     |....|    |.|       ---|..................................|    -...|..-
     ----.|    |.|          |.-..........*..................----   |......:.|
      |...------.--         |.................---..........--     --........|
    ---...........-----   ---.#...............|  -.........|      |.....--.--
    |........(........--  |...|........-......|  --........|      |.....|---
    |..........|.......|  |..-|..---......|...|   ----------      ----..|
    ---.|..--.---..--.--  ---- --- -----.---.--                      ----
      ----- --- -------                --- ---
Prx the Novice                 St:16 Dx:10 Co:11 In:12 Wi:17 Ch:8 Neutral
Dlvl:3 $:189 HP:34(34) Pw:17(22) AC:4 Xp:4

Niveau 3 (le vrai)

On se sent tellement mieux avec un niveau de vie correct et assez de force pour taper ce qui se présente sans se mettre en danger.

Ce niveau est plein de passages secrets, mais rien de trop surprenant.

J'ai trouvé 2 anneaux, sans trop savoir à quoi ils pourront m'être utiles.

Voici à quoi il ressemble :


             --------
             |......|      -----
             |).....|      |...|       -----------                   -------
 -----  #####........#     |...|       |..........######             |.....|
 |...|###    ---|--|-######-...-#      |.........|     ########      -.....|
 |...|#         # #####    |...|#######.....).[..|      # # # ##    #|.....|
 |.<.|#   ########### #    |...|       |.........|     -.----- ######-.....|
 |...-#           #   #    --.--     ##...........#####-.....|      #|.....|
 -----##          #   #    ###     ### ----.------     |.....|    ###|.....|
       #         ##   #    #     ###       #          #......|   ##  -------
       #         #    ##   #    ##       ###      #####|.....| ###
       #         *     # ########        #        #    |.....| #
       ##       #      # #-------       -.------- #    |.....| #
        #   ----.----  # #|.....|       |.......| #    -------##
        ####-.......|  ###|.....|       |........##############
            |.......|   ##-.....|       |.......|
            |.@.....|  ## |.....|       ---------
            |.>..f...###  -------
            ---------

Prx the Novice                 St:16 Dx:10 Co:11 In:12 Wi:17 Ch:8 Neutral
Dlvl:3 $:219 HP:40(40) Pw:28(28) AC:4 Xp:5

Vivement un magasin pour vendre tout le bazar que je laisse trainer.

Avant de descendre, je vais tenter de lire les parchemins : j'ai trop de trucs dont j'ignore la fonction, et j'espère toruver un scroll d'identification.

Le premier semble être un parchemin d'exorcisme.

Le second, bim, est un parchemin d'identification \o/

Bon, je n'en ai qu'un seul malheureusement et cela me permet d'identifier un parchemin "create monster" qui semble prometteur :)

Niveau 4

Ici on tombe sur des monstres plus coriaces : un "imp" m'aura donné du mal, mais mon petit chat m'aide :)

Du coup on s'en sort sans trop de soucis :


                             --------     -----      ------------
                             |.......#####-...|      |..........|
          ---------          |......|#    |...|      |..........|
          |...).._|         #-......|#    ....|      |..........|
          |.......-#        #--------#    |....######...........|
          -.-------#        ###      ##   |.<.|      |..........|
          ##       #          #     ###`  --|--      |..........|
          #        #          #    ## #     #        -----.------
          #        #          ##  ##  #     #             #
          #        ##          #  #   # #####             %
          #         ###--------#  ##  # #                 #
          #           #|.......#  ##  # #     ##############%###`########`
       ---|------     #|......|   ##  # #     ###############          --.---
       |.........    ##|......-#####  # #                -.-.----      |....|
       |........|     #--------   #   #-.-.-------       |.......######|....|
       |.........##################   #.......[..|       |......|     #-....|
       |........|                      |>@.......|       |......|      ------
       |........|                      |......f..|       --------
       ----------                      -----------

Prx the Novice                 St:16 Dx:10 Co:11 In:12 Wi:17 Ch:8 Neutral
Dlvl:4 $:226 HP:40(40) Pw:28(28) AC:4 Xp:5

En route pour le niveau 5!

Niveau 5

En visitant ce niveau, j'ai la malchance de tomber sur un leprechaun qui me vole quasiment tout mon or lorsque je le tue! J'ai intérêt à m'en souvenir de ce monstre... GRRR. En voilà un qu'il vaut mieux faire fuir plutôt que combattre lorsqu'on ne peut pas envoyer d'attaques à distance.

Je me retrouve vite coincé, il semble que je manque d'expérience pour repérer les passages secrets... Tant pis, on va descendre au niveau 6.

                                                           --------#-
                                  -----       --------     |........|
                                  |...-#      |......-#    |.........#
          *`                      |..||#     #....)..|#####-........|#
           #`       ----------    |...|#     #|......|#    |........|#
           #        |.........####..*.|#     #|......|#    |........|#
           #  # ####.........|    -----#     #--------#    -.--------#
     ------.---##   |........-###########    #        #     #        #
     |.....<..-[####----------         #     #        #     #        #
     |........| #` **#*###*####        #     #        ##    #        #
     |.........## #**#        ######   #     #         #   ##        #
     |........|                        #     #         #   #         #
     |........|                        #     #         #---.-----    #
     |........|                        #-----#         #|.......|    #
     ----------                        #|.f[.#         #-..{....|    # ------
                                       #-.@.|           |.......|    # |....|
                                        |.>..##         ---------    ##.....|
                                        -----                          ------

Prx the Novice                 St:16 Dx:10 Co:11 In:12 Wi:17 Ch:8 Neutral
Dlvl:5 $:23 HP:40(40) Pw:28(28) AC:4 Xp:5

Niveau 6

Oh !

À peine descendu, mon chat disparaît :

Suddenly, the kitten disappears out of sight.

Il semble qu'il ait marché dans une trappe de téléportation. Je vais le suivre en espérant que cela me mène près de lui.

On me dit :

You escape a level teleporter.

Mais je veux y alleeeeer !

Bon, tant pis... Je le retrouverai peut-être plus loin.

Je trouve une nymphe des montagnes. Elle ne semble pas belliqueuse, alors passons.

La difficulté semble plus importante : on trouve des killer bee, des portes sont piégées, des zombis, des orcs du Mordor...

Cependant je trouve un marchand de potions. Je n'ai malheureusement plus assez d'argent à cause de ce fichu leprechaun.

Après avoir mangé un truc pas frais, je commenc eà halluciner.

Sans trop savoir de quoi il s'agit, si je rêve ou si c'est la réalité, me voilà encerclé par des monstres qui changent de forme à chaque tour. J'ai beau me soigner, rien n'y fait, je succombe sous leurs coups.

You hit Strong Bad. The fog cloud summons help! The xorn bites!
You feel better. The glass golem bites! The wereplatypus bites!
The white dragon summons help! You feel hemmed in. The giant rat bites!
You die...
                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      40 Au       |
                  |   killed by a    |
                  | hallucinogen-dis |
                  |   torted warg    |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Monk...

You died in The Dungeons of Doom on dungeon level 6 with 1948 points,
and 40 pieces of gold, after 3631 moves.
You were level 6 with a maximum of 47 hit points when you died.

C'était une bonne partie, je ne suis jamais allé aussi loin :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-17-comment-jutilise-tmux.txt

2021-12-17T11:16:39Z

<![CDATA[

Voilà plusieurs semaines que j'utilise tmux au quotidien. Alors qu'auparavant j'ouvrais plusieurs fenêtres afin d'avoir de multiples terminaux, je n'ai maintenant plus qu'une session tmux.

Si tmux ne vous dit rien, sachez qu'il s'agit d'un outil permettant d'avoir "plusieurs terminaux dans 1 seul". (oui, c'est très approximatif...).

Cela permet notamment :

  • De diviser l'écran en plusieurs parties,
  • De copier/coller du texte sans avoir besoin de la souris
  • De garder la session disponible même si le terminal est fermé par inadvertance
  • D'automatiser le lancement de tâches : scripter son terminal.

Vous remarquerez certainement de nombreuses similitudes avec la configuration de Roman Zolotarev.

=> Configuration tmux de Roman Zolotarev

Au fait, tmux est présent de base dans OpenBSD :)

Ça ressemble à quoi ?

=> Démonstration de tmux (IMG)

Comme vous pouvez le voir, ma fenêtre est divsée en plusieurs parties un peu comme le ferait un tiling window manager. Chaque partie est appelée un "pane", avec à gauche cet article pendant que je le rédige, en haut à droite un peu de code awk et en bas à droite la prise de capture d'écran.

Vous distinguez en bas à gauche la liste des fenêtres disponibles : je les ai regroupées par thèmes, la plupart sont lancés automatiquement avec ma session.

En bas à droite, il s'agit d'une barre de status : mon terminal est en plein écran. J'y affiche l'espace disque restant, le niveau de batterie, le volume sonore et la date. Lorsque mpd joue de la musique, on voit le titre de la chanson jouée.

Au démarrage

Je démarre à chaque début de session un script qui va créer les différentes fenêtres que je veux dans tmux, à savoir une pour mes mails, une pour un client XMPP, une pour pouvoir accéder rapidement à mes cours.

Cela se passe dans le script starttmux suivant :

#!/bin/ksh

session=0
showtmux()
{
    xterm -class tmux -e tmux a -t $session
    exit
}

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

# show sync by default, then run ksh
tmux new -d -s $session "/home/prx/bin/prxsync pull; ksh"

# mutt
tmux new-window -d -n "mails" "mutt"

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

# educ
tmux new-window -d -n "educ" -c "$HOME/work/educ/College/Cours" rover
tmux split-window -h -d -t "educ" -c "$HOME/work/educ/College/Cours" ksh

showtmux

Je n'utilise qu'une seule session tmux, sauf exceptions : la 0.

Au début, le script vérifie si la session n'existe pas déjà pour l'afficher au lieu de la charger.

Ensuite, je lance un script de synchronisation appelé "prxsync" et ouvre un shell ksh dans la fenêtre principale.

Puis, j'ouvre dans leurs fenêtres respectives mutt et profanity.

Enfin, je crée une nouvelle fenêtre "educ" que je divise en 2 (split-window) pour y afficher mes cours avec le gestionnaire de fichiers rover.

La dernière ligne permet d'afficher tmux dans xterm.

La configuration

Pour retrouver les mêmes habitudes, peu importe la machine sur laquelle je me retrouve, j'essaie au maximum d'utiliser les raccourcis par défauts.

J'ai bien évidemment réalisé quelques ajustements, mais je dois avouer qu'on se fait très bien aux raccourcis de tmux au départ un peu étonnants (ctrl-b par exemple).

Voici ma configuration :

set-option -g base-index 1    # my keyboard start from 1 at the left
set-option -g escape-time 0   # vi
set-option -g history-limit 50000
set-option -g default-command "/bin/ksh"
set-option -g default-terminal tmux-256color
set-option -g mouse on
set-option -g status-interval 10
set-option -g status-right-length 142
set-option -g status-right '#{?client_prefix,#[fg=green#,bg=black] PREFIX,#(bin/status)}'

Je veux que la numérotation commence à 1, pas à 0.

Ensuite, je retire le délai avant de prendre en compte la touche echap, que j'utilise très souvent avec vi.

La dernière ligne permet de définir une barre de status simple que je détaillerai ensuite. "PREFIX" est affiché lorsque j'ai entrée ctrl-b, ça évite les étourderies.

Voici maintenant les raccourcis que j'ai rajouté :

# map prefix to 'C-space', disabled
#unbind C-b
#set-option -g prefix C-space
#bind-key C-space send-prefix

# vi <3
set -g mode-keys vi
set -g status-keys vi

# à la dwm keybinds : resize with HJKL, select with hjkl.
bind -r H resize-pane -L 2
bind -r J resize-pane -D 2
bind -r K resize-pane -U 2
bind -r L resize-pane -R 2
bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R

# move to urgent window
bind a previous-window -a

# last window
bind Tab select-window -l

# copy-mode : v
bind v copy-mode 

# copy whole visible pane in new buffer, choose with "#"
bind y capture-pane -N -J

# split in same directory
bind c new-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"

# Save buffer also in X clipboard
bind -T copy-mode-vi 'y' send -X copy-pipe-and-cancel \
  'xclip -i -selection clipboard'

bind -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel \
  'xclip -i -selection clipboard'

bind -n MouseDown2Pane run \
  'tmux set-buffer "$(xclip -o -selection clipboard)";tmux paste-buffer'

J'ai laissé en exemple au début une façon d'utiliser ctrl-space au lieu de ctrl-b pour préfixe.

Je définis très rapidement des raccourcis ressemblant à ceux de vi, par habitude.

  • H/J/K/L permet de redimensionner les panneaux
  • h/j/k/l permet de sélectionner les panneaux souhaités
  • Tab permet de retourner à la fenêtre précédente : cela imite le comportement de dwm
  • "a" focalise la fenêtre urgente. Pratique quand un message arrive dans profanity par exemple
  • Pour entrer en mode copie, je définis la touche "v" plutôt que "[", c'est un vrai caprice.
  • "y" me permet de copier tout le contenu d'un pane. Je peux sélectionner cette portion de texte ensuite avec "#" lorsque je suis en mode copie.
  • Suivent des options me permettant d'ouvrir de nouvelles fenêtres ou pane dans le même dossier que celui actuel. Cela me semblait plus logique que de devoir à chaque fois me déplacer dans le dossier dans lequel j'étais juste avant d'ouvrir un nouveau shell. Dans les rares cas où je n'en a pas besoin, c'est plus rapide d'entrer "cd" pour revenir dans mon $HOME que d'entrer tout le chemin vers le dossier courant.
  • Enfin j'ai piqué à Roman Zolotarev la configuration pour que ce que je copie avec tmux soit aussi dans le presse-papier de la session X, si j'en utilise une... Ça ne m'est pas très utile, mais c'est plus naturel lorsque je colle du texte dans firefox après l'avoir copié dans tmux.

Le status

Voici le script pour afficher les infos en bas à droite :

fs_perc()
{
    df -h $1 | awk 'NR==2 {print $5}'
}

get_vol()
{
	sndioctl output.level | awk -F = '{printf "%d\n",$2*100}'
}

loadavg()
{
	sysctl -n vm.loadavg
}

bat()
{
	#apm | awk 'NR==1 && !/absent/ {printf " ⚡%s", $4}'
	test $(apm -a) -eq 0 && printf "⚡%s%%" $(apm -l)
}

printf "%s  %s  💽 %s  🔉 %s  %s" \
     "$(mpd-status)"\
     "$(bat)" \
     "$(fs_perc /home)" \
     "$(get_vol)%" \
	 "$(date "+📆 %Y-%m-%d 🕓 %H:%M ")"

Le script mpd-status est le suivant :

#!/bin/sh

mpc | awk '
(NR == 1) { 
	status = $0
	if (length(status) > 42) {
		status = substr($0, 1, 42) "..."
	}
}
(NR == 2) && /playing/ {
    isplaying = 1
}
END { if (isplaying) { printf "♪ %s \n", status } }
'

Le mot de la fin

Comme pour awk, je regrette de ne pas avoir pris le temps de me familiariser avec tmux plus tôt. Je vous invite donc à le faire ;)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-14-nethack-9.txt

2021-12-14T13:35:29Z

<![CDATA[

Hello prx, welcome to NetHack! You are a chaotic female human Rogue.

Niveau 1

Ce premier niveau est grand. Il y a beaucoup de boulets à ne pas déplacer, et pour une fois ce n'est pas moi.

J'y trouve des anneaux, des feuilles de lembas, une clé (que va-t-elle ouvrir?) et une potion rose.

Voilà donc des objets à identifier pour plus tard, car les tester maintenant c'est un coup à décéder.

On tue des renards, des rats, des kobolds, et on s'apprête à descendre :



                ---------------                                   ------------
 -------        |.............|      --------                    #-..........|
 |.....-#      #..>............##`###|......|                    #|..........|
 |.....|#      #|.@...........|     #|......|              #######|..........|
 |.....|#     ##|.............|     #|......|###############    # ----------.-
 |.....|#    ## --.------------     #|..<...-##  --------      ##         ###
 -------#   ##    ###               #|......|####-...`..-#######          #
        #  ##       ####            #.......|    |......|                 #
        #  #           ####         #-------- ###........#####            #
       ##  #        ------.-    ###############  --------#####            #
        #  #        |.....%.#####`#######    ###########    #######`##    #
        #  #        |......|####                    #####     ##-----|----|---
     ##### #        |.......###########`#               #      #|............|
     #---.-#        --------#           ########################|............|
     #|....#      ###########                              #####|......._....|
     #|...|                                                    #.............|
     #..{d|                                                     |............|
      -----                                                     --------------

Prx the Footpad                St:11 Dx:18 Co:18 In:10 Wi:7 Ch:11 Chaotic
Dlvl:1 $:6 HP:8(12) Pw:2(2) AC:7 Xp:1

Niveau 2

L'exploration ne pose pas de soucis. Quelques portes fermées ne résistent pas à mon matériel de crochetage.

J'entends souvent des bruits, il faut dire que Cahouète s'en donne à coeur joie. (Cahouète, c'est mon chien. C'est un gourmand Cahouète).

Un gobelin imprudent me permet d'atteindre le niveau 2 et je me sens prêt à descendre au niveau 3 :

                                          #
                                         -.---
 ----------                              |...|    -------             --------
 |........|                              |...-####-.<...-#############-......|
 |........|                           ###....|  ##|.....|             |......|
 |........-##                         #  -.---  ##|......#############......{|
 |........| ##                        # ###     ##-------             --.-----
 -|---|----  #                    ##### #       ####                    #
  ##` #      #####              ###   ###       #  ####
    # ##         #    -----######     #         #     #####
    #  #         #####|...d#       ###`         #         #
    #  #             #|.@>|                  ####         #
    ######           #|...|############      #            ###  ---------------
       # ####        #....|#   -------|------#            #####..............|
    ---.----|-        --.--### +............|#              ###|.............|
    |........|     ##########  |............|#                #..............|
    |........-######           |............-#                 ---------------
    |........|                 |............|
    ----------                 |............|
                               --------------

Prx the Footpad                St:11 Dx:18 Co:18 In:10 Wi:7 Ch:11 Chaotic
Dlvl:2 $:14 HP:20(20) Pw:6(6) AC:7 Xp:2 Hungry

Niveau 3

Un niveau vraiment tranquille. Pas de gros pièges pour l'instant. Cahouète continue de se régaler.

Quant à moi, je me retiens de tester les 2 parchemins que je viens de trouver.


                                                     --------
                              ----------             |......|              #
                             #|........|             |.......######       -.--
                             #.........|            #-......|     # `#####-..|
              -----------  ###|........|            #|.......#    #       |..|
              |.......... ####--.-------         ####--------#   ####     |.^|
          ####..........|  #    #              ###  ##  ############      |..|
         ##   |.@....d..-####################### #           ###   #######...|
         #    |.........|  #    #               ##             #          -.--
  -------#   #-..........###    #               #              #           #
  |......#####-|---------       ##              #              #           #
  |.....|#     #                 #######        #              #          ##
  |.....|                         -----|--------#              ###        #
  |.....|                         |............|#                #       ##
  -------                         |............|#                #####   #
                                  |............|#                    #---.---
                                  |<..........[|#                    #|...{.|
                                  |............-#                    #......|
                                  --------------                      -------

Prx the Footpad                St:11 Dx:18 Co:18 In:10 Wi:7 Ch:11 Chaotic
Dlvl:3 $:23 HP:20(20) Pw:6(6) AC:7 Xp:2

En route pour le niveau suivant.

Niveau 4

À peine arrivé, un hobgoblin m'attaque sauvagement. Mes blessures me laissent avec le quart de mes points de vie en moins. GASP. Heureusement Cahouète et moi parvenons facilement à le mettre en pièces. \o/

The little dog eats a hobgoblin corpse.

Niark niark niark

Je décide de prendre un peu de repos et reprends ma partie un peu plus tard (à vrai dire quelques jours plus tard). À mon retour :

Be careful! New moon tonight.

Hum, ça sonne encore comme une menace ça. Quand mon beau frêre me parle de pleine Lune, ça peut vite être traumatisant alors je vais rester méfiant.

Je fais bien, me voilà rapidement face à un chacal garou rouge!! Fuyons !

Alors que Cahouète mord ce chacal garou :

The werejackal reads a scroll labeled PHOL ENDE WODAN!

Oh mon dieu, un chacal lettré!

Il a disparu. Je suppose que PHOL ENDE WODAN permet de se téléporter...

Je le retrouve d'ailleurs un peu plus loin. Et cette fois :

The werejackal zaps herself with a curved wand!
The werejackal is suddenly moving faster

Maman! Un chacal magicien!

Il faut s'y résoudre, cet animal est un danger sur lequel je ne peux risquer de retrouver plus tard, peut-être affaibli. Je décide donc avec bravoure de le combattre...

De loin, en lui lançant des dagues.

The dagger hits the werejackal
You throw 2 daggers. The 1st dagger hits the werejackal
The 2nd dagger hits the werejackal
You hit the werejackal! The werejackal hits!
You kill the werejackal! Welcome to experience level 3.

Ouuuuuh yeah .o./

Le niveau se termine sans encombre, si ce n'est que la nourriture commence à manquer.

Voilà où j'en suis juste avant de descendre les escaliers menant au niveau suivant:



                                 -------------            --------------
                                 |............############....^........-#
                                 |..<........|            |............|#
      ------------               |............#           --|-----------#
      |...........###            ---------.---#             #           #
      |..........|  #                     #   #            #            #
      |..........|  #                     #   #            #            #
      |......d...|  #                    ##   #            #            #
      |.......@..|  #######             ##   ##         ####            #
      |..........|  ############   ######    #         -.---------      #
      ----------.- ##     ### -|---.--     ########    |........^|      # #
                ####        ##|......|      #-----# ###-.........|     #--.---
                             #|{......#######|...-###  |.........|     #|....|
                             #|......|      #%...|# ## |.........|     #|....|
                             #-......|      #|....###  |>........|     #|....|
                              --------      #-...|  ###..........|     #.....|
                                             -----     -----------      ------

Prx the Cutpurse               St:11 Dx:18 Co:18 In:10 Wi:7 Ch:11 Chaotic
Dlvl:4 $:29 HP:30(30) Pw:8(8) AC:7 Xp:3

Niveau 5

The little dog falls into a pit!

Houla, attention à toi Cahouète!

Me voilà seul...

J'avance à peine qu'un gnome se rue sur moi. J'ai vite fait de le tuer et récupère les 2 gemmes rouges qu'il laisse tomber.

Cependant, quelques pas plus loin :

You are almost hit by a stout spear.
The dwarf wields a broad short sword!
You hit the dwarf. The dwarf thrusts her broad short sword.
The dwarf hits!
You hit the dwarf. You hear some noises in the distance.
The dwarf thrusts her broad short sword. The dwarf hits!

Quoi??? Un 2e nain ? Fuyons !

The dwarf thrusts her dagger. The dwarf hits!
The dwarf thrusts her broad short sword. The dwarf hits!
You die...

Gasp...

Adieu monde cruel!

(il semble qu'il y avait 2 escaliers au niveau d'avant. Je suis descendu dans les mines, l'autre escalier aurait-il été plus à mon niveau ?)

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      29 Au       |
                  |   killed by a    |
                  |      dwarf       |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Rogue...

You died in The Gnomish Mines on dungeon level 5 with 451 points,
and 29 pieces of gold, after 2559 moves.
You were level 3 with a maximum of 30 hit points when you died.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-13-astuces_awk.txt

2021-12-13T13:09:56Z

<![CDATA[

Je tiens la page suivante à jour au fil de mes découvertes :

=> Quelques notes sur awk (html) | Quelques notes sur awk (gemini)

Si j'avais su combien awk est pratique, je l'aurais appris bien avant. Je vous invite à vous y intéresser ;)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-08-les-grands-s-en-occupent.txt

2021-12-08T11:17:34Z

<![CDATA[

Ci-dessous, je cite mon principal :

je vous confirme par ce message que trois cas positifs ont été diagnostiqués en classe de 6***.
Malgré deux messages envoyés hier à la cellule du rectorat qui seule peut définir les fermetures de classe, cette dernière n'a toujours pas repris contact avec le collège.
La classe de 6*** reste donc ouverte. Je remercie donc les professeurs de s'assurer que les travaux sont régulièrement mis sur E-lyco

Envoyez les enfants à l'école, l'éducation nationale gère...

Je suis bien content que mes enfants ne soient pas encore scolarisés.

😫

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-07-tout-va-bien.txt

2021-12-07T09:28:23Z

<![CDATA[

Chaque jour, dans chaque classe, je recense jusqu'à 5 élèves absents car malades, positifs au covid. Heureusement, on affirmait que les enfants n'étaient pas porteurs et qu'il n'y avait pas de contamination à l'école il y a encore quelques mois.

Les élèves des classes contenant un cas positif sont traités avec bienveillance : chaque midi, ils ont la chance de manger sur une table à l'écart des autres, chacun d'entre eux étant placé en quinconce afin que personne ne soit assis en face.

Tous les élèves vivent avec un masque depuis plus d'un an. Je ne connais pas le visage de la moitié d'entre eux. Je ne connais pas mes élèves dont je dois m'occuper et que je veux accompagner.

Dans mon entourage, les personnes non vaccinées revendiquent en souriant aller au restaurant et s'amuser sans vergogne en se servant du pass sanitaire de quelqu'un d'autre. En effet, l'identité n'est pas vérifiée. Le pass sanitaire ne sert donc à rien.

Heureusement, les discothèques vont fermer.

C'est important, puisque c'est dans les bars, au sport et à l’école qu'on a le plus le risque de tomber malade du COVID (source en bas de page).

In those aged 40 years and older, having children attend daycare (aOR:1.9; 95%CI:1.1-3.3), kindergarten (aOR:1.6; 95%CI:1.2-2.1), primary school (aOR:1.4; 95%CI:1.2-1.6) or middle school (aOR:1.3; 95%CI:1.2-1.6) were associated with increased risk of infection.

Traduction rapide :

Pour ceux agés de 40 ans et plus, avoir des enfants qui vont à la garderie ou à l'école augmente le risque d'infection.

Tout va bien.

Liens

=> Impact of SARS-CoV-2 Delta variant on incubation, transmission settings and vaccine effectiveness: Results from a nationwide case-control study in France | Où a-t-on le plus de risques d'être contaminé par le Covid-19 ?

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-06-mpd-status-avec-awk.txt

2021-12-06T13:27:53Z

<![CDATA[

Pour afficher quelle est la chanson jouée avec mpd dans une barre de status, j'utilisais ce script:

#!/bin/sh

MPC="$(mpc)"
if [ -n "$(printf "%s" "$MPC" |grep playing)" ]; then
	info="$(printf "%s" "$MPC" |head -n1 | cut -b -42)"
	L="$(printf "%s" "$MPC" |grep -Eo '[0-9]+:[0-9]+/[0-9]+:[0-9]+')"
	printf "%s\n" "♪ $info - $L"
fi


exit 0

On voit qu'il appelle mpc, head, cut, grep, et printf, soit en tout 5 commandes.

Voici comment je l'ai simplifié avec awk :

#!/bin/sh

mpc | awk '
(NR == 1) { status = $0; next }
(NR == 2) && /playing/ {
    isplaying = 1
    progress = $3
    next
}
END { if (isplaying) { printf "♪ %s - %s\n", status, progress } }
'

J'aime beaucoup awk :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-12-01-gemcol.txt

2021-12-01T15:12:43Z

<![CDATA[

Afin de m'entraîner avec awk, et pour préparer une petite idée que j'ai en projet, j'ai pris quelques minutes pour écrire un script permettant de colorer un fichier écrit en gemtext.

C'est déjà de base très lisible, donc c'est vraiment un caprice.

Voilà à quoi ça peut ressembler :

awk -f gemcol.awk test.gmi

=> Aperçu de gemcol

Voici le script gemcol.awk:

#!/usr/bin/awk -f
#
# Display gemtext file with colors

BEGIN {
    bold = "\033[1m";
    red = "\033[0;31m";
    green = "\033[0;32m";
    orange = "\033[0;33m";
    blue = "\033[0;34m";
    purple = "\033[0;35m";
    cyan = "\033[0;36m";
    gray = "\033[0;37m";
    reset = "\033[0m";

    pre = 0;
}

/^```/ { pre = (pre + 1 ) % 2; next}  # toggle pre
!pre && /^#/ { print bold $0; next}
!pre && /^=>/ { print blue $0; next}
!pre && /^\*/ { print green $0; next}
!pre && /^>/ { print gray $0; next}
pre { print "\t" $0; next}
{ print reset $0 }

La section "BEGIN" me permet de définir quelques variables.

Ensuite, je vérifie si on est dans un bloc préformaté et selon le cas, modifie la variable "pre".

Puis, à chaque fois qu'on n'est pas dans un bloc de code préformaté et qu'une ligne commence par un certain pattern, je l'affiche en couleur et pase à la suivante.

Si on est dans un bloc préformaté, alors on affiche la ligne après une tabulation.

Enfin, si ça ne correspondait à aucun pattern, alors on affiche la ligne sans couleurs.

C'est un brouillon, je compte en faire un truc permettant de lire tout en choisissant une largeur définie. (en fait, "gemcol fichier.gmi" | fold -s -w 80" fonctionne déjà).

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-11-29-emoji-fzf-vi-snippets.txt

2021-11-29T11:08:57Z

<![CDATA[

Bien que cela surprenne par son extrémité, mon éditeur de texte quotidien est vi.

Oui, vi.

Pas vim. vi.

Celui livré par défaut à l'installation d'OpenBSD.

Ou alors, si j'ai vraiment besoin de voir les jolis accents, j'utilise son équivalent "nvi-iconv".

Sa simplicité le rend agréable à configurer. Alors certes, pas de coloration syntaxique. Cela m'a manqué au début. Toutefois, devoir m'en passer me force à écrire du code plus clair (je crois).

=> J'en parle ici [GEMINI] | J'en parle ici [HTML]

J'ai récemment ajouté la possibilité de sélectionner et insérer des emojis 😃. Cela se passe avec un raccourci dans le fichier de configuration ~/.exrc, un fichier contenant les émojis et leur description séparés par un espace et le bien connu fzf.

(On peut remplacer fzf par slmenu)

=> slmenu | fzf

Voici le raccourci dans ~/.exrc :

map ge :!emojisel > /tmp/vi-$USER.tmp^M^M:r/tmp/vi-$USER.tmp^M:!rm /tmp/vi-$USER.tmp^M

(Si vous voulez l'utiliser, évitez de copier/coller. En effet, "^M" correspond à "valider avec Entrée". On l'obtient en tapant "ctrl-v" puis "Entrée".)

Cette ligne est décomposée en plusieurs parties.

Tout d'abord "map ge" ajoute le raccourci constitué de la suite de lettres "g" et "e".

Ce dernier permet de lancer une commande shell : ":!".

Cette commande est en fait un script shell appelé "emojisel" dont voici le contenu :

#!/bin/sh
emojis=$HOME/.templates/emojis.txt
fzf < $emojis | awk '{print $1}'

Rien de très original, fzf permet de choisir une ligne dans le fichier d'emojis. On n'en garde que l'emoji, pas la description avec awk.

On voit ensuite que ce que ce script renvoie est enregistré dans un fichier temporaire /tmp/vi-$USER.tmp.

On lance ensuite une nouvelle commande qui consiste à insérer le contenu d'un fichier ":r" : celui contenant notre emoji.

Enfin, on supprime ce fichier temporaire avec ":!rm /tmp/vi-$USER.tmp".

Le fait de passer par un fichier temporaire est discutable : pourquoi ne pas directement mettre l'emoji dans le presse papier avec xclip ou xsel? C'est ce que je faisais initialement. Cependant, cela ne fonctionne pas si vous n'êtes pas dans un environnement graphique (X). Là, ça marche même en tty, via ssh ou que sais-je.

Voilà à quoi ça ressemble :

=> Enregistrement asciinema [HTTP]

(Préférez : 😉)

curl "https://asciinema.org/a/452230.cast?dl=1" | asciinema play -

Ce que je viens de décrire pour des emojis peut très bien être adapté pour insérer n'importe quel texte. Je m'en sens pour ma part pour des morceaux de LaTeX : ajout de tableaux, de listes...

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-11-20-livres-favoris.txt

2021-11-20T16:17:00Z

<![CDATA[

Lire est une de mes activités favorites.

Voici une page qui décrit quelques ouvrages que j'ai apprécié et que je vous recommande.

Ils peuvent m'avoir transformés en profondeur ou simplement divertis, mais à chaque fois ils méritent d'être cités ici.

Ma description est forcément subjective : filez lire les pages wikipedia correspondantes pour vous faire un avis :).

Les genres sont multiples bien que j'apprécie la SF et la Fantasy. Dans tous les cas, vous remarquerez que j'aime les sagas constituées de plusieurs tomes plutôt qu'un seul livre : c'est d'ailleurs toujours difficile de quitter un univers à la fin du dernier tome. Paradoxalement, j'adore les nouvelles.

La science fiction est un excellent outil de pédagogie du réel. -- Roland Lehouq, président des Utopiales

Je ne prétends pas être une référence en terme littéraire. Aussi mes goûts peuvent être critiqués, je n'en doute pas.

Piochez, découvrez, lisez, et n'hésitez pas à me faire part de vos coups de coeur ;).

Je tiendrai cette liste à jour ici :

=> Livres favoris (gemini) | Livres favoris (http)

Fils des brumes (Sanderson)

Nous suivons une héroïne (pour une fois!) aux pouvoir particuliers. Brandon Sanderson décrit une magie particulière : on puise des pouvoirs différents selon le métal que l'on "brulant".

Sanderson est très fort pour inventer des règles et jouer avec. Pour sûr, il est inventif et sait nous tenir en haleine.

En toile de fond, on y retrouve la question de l'écologie. Il faut en effet sauver le monde d'une menace venant des origines de l'univers.

Les archives de Roshar (Sanderson)

Un univers complet et riche nous est décrit ici (nations, coutumes et croyances...). Les émotions des hommes se manifestent sous forme de sprènes. On y suit des personnages profonds qui découvriront des pouvoirs en même temps que le lecteur. C'est aussi amusant que surprenant. On est loin des pouvoirs "classiques" : l'un peut contrôler la gravité (en quelque sorte), l'autre tire ses capacités de son imagination ou encore peut retirer à sa guise les forces de frottement l'entourant.

On y retrouve ici aussi la question de l'écologie : une tempête régulière et mortelle ravage régulièrement les contrées : comment s'y adapter? Quelle est son origine?

Le cycle Drenaï (Gemmel)

Avec Druss la légende ou encore Waylander, on plonge dans l'univers de David Gemmel où les ambitions des hommes se heurtent à leurs passions.

J'ai découvert cette saga avec Druss la légende. Il y est question d'honneur. On suit un homme qui semble indestructibe et si fort que tous ses ennemis échouent. Pourtant, la forcé véritablement importante est-elle celle des muscles de nos bras?

C'est toute la contradiction de Druss.

Récits épiques et guerres perdures d'avance, la valeur des Hommes (et des femmes) y est décrite de façon touchante.

Depuis, je recommande chaudement tout ouvrage de David Gemmel :)

La citadelle des ombres, Les aventuriers de la mer, Dragons et serpents (Robin Hobb)

Dans la saga "La citadelle des ombres", bous découvrirez le monde de Fitz, l'homme le plus nul de tous les temps! Il est faible, il fait constamment des erreurs, et pourtant c'est le héros. Rien de comique ici, mais que c'est frustrant d'être confronté à ses erreurs. Il doit pourtant dans le secret aider à sauver le royaume de pirates qui forgisent la population : les habitants sont dénués de sentiments et d'émotion. Qu'en faire ensuite? Et d'où vient cette menace exactement? Les anciens parlent de dragons qui pourraient leur venir en aide, mais semblent avoir disparu.

Robin Hobb invente de nouvelles formes de magie : l'Art (qui permettrait de communiquer à distance par la pensée notamment) et le Vif pour échanger avec les animaux.

Poursuivez l'aventure avec les aventuriers de la mer et Dragons et serpents qui se déroulent dans le même monde, avec des personnages différents mais toujours aussi riches. Ainsi on comprend l'origine de la magie et des Dragons de cet univers.

Comme tous les ouvrages de Robin Hobb, c'est lent... mais on en veut toujours plus ! Les personnages sont d'une richesse et d'une profondeur passionnante. C'est à mon avis toute la force de ses récits : les voir évoluer, changer, souffrir, espérer... Qu'ils sont vivants!

Le soldat chamane (Robin Hobb)

Encore du Robin Hobb. Un gros coup de coeur pour moi.

Différents peuples se partagent un monde, et forcément, ils ne sont pas en paix.

Le héros doit se former en tant que soldat pour plaire à son père, mais est confronté à la magie des autres peuples qui va le transformer en profondeur.

L'identité de ce dernier est fractionnée. Il souffre et trébuche encore et encore. Entre plusieurs cultures et mondes, il doit faire des choix impossibles pour protéger ces derniers.

Le seigneur des anneaux (Tolkien)

Est-ce vraiment nécessaire de présenter cette saga?

Je me souviens d'entendre mon coeur battre à tout rompre au rythme des tambours de la Moria et l'angoisse m'étreindre alors que Minas Morgul vomit ses armés et que mon lecteur cassette jouait du Gorillaz. ^^

Le cycle de Dune (Frank Herbert)

Bon vous vous en doutez, c'est ma saga préférée.

L'univers développé est aussi complexe que riche.

On y parle écologie, mythologie, religion, croyances et intrigues politiques.

Il y est question de libre arbitre, et d'intelligence!

Quoi de mieux que de la SF dans un univers où les ordinateurs sont interdits?

À lire !

Fondation (Asimov)

Une suite de nouvelles dont l'issue est à chaque fois étonnante. Alors que tout semble perdu, une solution à laquelle on n'avait pas pensé surgit : si seulement on réfléchissait un peu plus...

C'est mon 2e ouvrage préféré avec Dune :)

À lire!

Les robots (Asimov)

Quoi de mieux que les robots pour parler des humains ?

On ne présente pas Asimov : il joue avec les 3 lois de la robotique avec finesse. À lire!

Le Don, le Sang, l'Âme (Fiona McIntosh)

Malédiction : à chaque fois que le personnage principal est tué, il se retrouve dans le corps de son assassin.

C'est gé-nial !

Les racines du mal (Maurice G. Dantec)

Première partie : on suit un assassin complètement félé. Un homme est chargé de développer une IA qui modélise le cerveau de ce genre d'assassin.

Deuxième partie : l'IA révèle que certains meutres qui ont été commis ne correspondent pas au mode opératoire. L'assassin a donc été condamné à tort, et les véritables coupables sont toujours en liberté... et sont bien pires.

C'est aussi horrible que bien écrit. Accrochez-vous et préparez les somnifères!

Farenhein 451 (Ray Bradbury)

Il faut vraiment le présenter ?

À lire!

Le Petit Prince (A. de St Exupery)

Ben oui, j'adore!

C'est très vite lu, et ce voyage initiatique rappelle la vraie valeur des choses.

Zadig ou la destinée (Voltaire)

Plusieurs comptes philosophiques dont j'apprécie la morale pour en discuter avec autrui.

Notre Dame de Paris (V. Hugo)

Un drame comme on les aime. Hugo écrit vraiment bien et je trouve ce livre très poétique bien que triste.

Nouvelles (P. K. Dick)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-11-16-makefile-graphos.txt

2021-11-16T12:48:04Z

<![CDATA[

Après avoir corrigé quelques détails concernant le générateur de ce site, pour m'amuser un peu avec l'apparence, corriger de petits bugs et simplifier la gestion des mises en ligne, j'ai pensé qu'il serait intéressant d'expliquer un peu comment le Makefile est construit. C'est en effet grâce à "make" que seules les pages qui en ont besoin sont générées, et dans le bon ordre en plus :).

Démystifions donc ensemble ce fichier.

On commence par importer le contenu du fichier "config.mk". Ce dernier n'est qu'une liste de variables utilisées ensuites.

include config.mk

Cela permet de pouvoir appeler les variables ensuite sous la forme "${VARIABLE}".

Maintenant, on liste les diverses extensions de fichier que le Makefile devra apprendre à traiter pour passer de l'une à l'autre:

.SUFFIXES: .${SRCEXT} .${HTMLEXT} .${GEMINIEXT} .${TXTEXT}

On enregistre dans la variable PAGES la liste des pages qu'il faudra convertir. Ce sont nos "sources".

Pour cela, on appelle la commande "find" qui liste dans le dossier "${SRCDIR}" (définit dans config.mk) les fichiers dont l'extension est ".${SRCEXT}".

PAGES != find ${SRCDIR} -type f -name \*.${SRCEXT}

Vous noterez l'utilisation de "!=" : PAGES contient ainsi le retour de la commande find, et non la chaîne de caractère constituant la commande elle-même.

Désormais, on peut établir la liste des fichiers que l'ont veut obtenir. Il s'agit juste de modifier l'extension. On utilise ":=" pour enregistrer nos variables : cela veut dire que c'est le contenu des variables qui est enregistré.

Autrement dit, écrire "VAR = ${VARIABLE}" met la chaîne "${VARIABLE}" dans VAR. Écrire "VAR := ${VARIABLE}" met le contenu de VARIABLE dans VAR.

HTMLPAGES := ${PAGES:.${SRCEXT}=.${HTMLEXT}}
GEMINIPAGES := ${PAGES:.${SRCEXT}=.${GEMINIEXT}}
TXTPAGES := ${PAGES:.${SRCEXT}=.${TXTEXT}}

Ici les substitutions sont écrites à l'ancienne. Les règles de substitutions avec le make d'OpenBSD sont plus lisibles et ressemblent à la syntaxe de la commande "sed". Cependant, je voulais proposer graphos aussi pour un système linux.

En gros, on peut résumer les choses ainsi : HTMLPAGES contiendra la même chose que PAGES après avoir remplacé les extensions SRCEXT par les extensions HTMLEXT.

On peut utiliser le caractère "%" pour désigner "tous les caractères" et le recopier ensuite. On s'en servira plus loin ;).

Dans tous les cas, nous avons ainsi la liste des fichiers à construire. S'ils sont absent, ou si les prérequis pour les obtenir ont été modifiés, alors ils seront construits selon les règles définies plus loin.

On arrive à la principale utilité du Makefile : définir des cibles et des dépendances.

Ça se présente ainsi : "cible: dépendance1 dépendance2 ...".

Cela signifie que lorsqu'on va construire "cible" avec "make cible", alors il faudra d'abord avoir construire "dépendance1" et "dépendance2".

Ici, on indique que la cible "all" (celle appelée par "make" sans arguments) a besoin des cibles "listall" et "${ENABLEDTARGETS}" (définies dans le config.mk):

all: listall ${ENABLEDTARGETS}

Parmi les valeurs que peut contenir ENABLEDTARGETS, il y a "html". On indique donc comment construire cette cible en précisant qu'il faut avoir auparavant construit les HTMLPAGES :

html: ${HTMLPAGES}

Cependant, pour l'instant, make ne sait pas comment fabriquer un fichier ".html" (.${HTMLEXT}) à partir d'un fichier ".md" (.${SRCEXT}).

C'est ce qu'on va lui expliquer maintenant avec une cible du type ".md.html:". C'est pour cela qu'on a indiqué plus tôt une ligne avec ".SUFFIXES":

.${SRCEXT}.${HTMLEXT}:
	@echo "$< -> ${@}"
	-@test -f templates/head.${HTMLEXT} && \
	    cat templates/head.${HTMLEXT} > $@
	@${TOHTML} $< >> $@
	-@test -f templates/foot.${HTMLEXT} && \
	    cat templates/foot.${HTMLEXT} >> $@
	@tools/vars.sh $@
	@mkdir -p $$(dirname ${@:${SRCDIR}%=${HTMLDIR}%})
	@cp -v $@ ${@:${SRCDIR}%=${HTMLDIR}%}

Comme vous pouvez le voir, la cible est suivie de lignes indentées avec une tabulation (c'est important ce tab).

Il s'agit des commandes à exécuter pour fabriquer un fichier .html à partir d'un fichier .md.

On remarque tout de suite que les commandes commencent souvent par un "@". C'est juste du confort, ça évite de voir la commande affichée dans la sortie de "make".

La première ligne affiche deux variables particulières :

  • "$<" : c'est le fichier source.
  • "$@" : c'est le fichier que l'on veut obtenir.

La ligne suivant est précédée d'un "-". Cela permet de ne pas stopper make même si cette commande échoue. Puisqu'ici on teste la présence d'un fichier avant d'en mettre le contenu dans le fichier ciblé, et qu'on veut garder facultatif cette fonctionnalité, le "-" est tout adapté :)

Remarquez aussi qu'on peut enregistrer dans des variables la commande à appeler. Ici ${TOHTML} contient la commande qui permet de convertir le fichier d'entrée en html.

À la toute fin, on crée un dossier avec mkdir et on copie le fichier html obtenu dans un autre dossier. Ces lignes sont un peu particulières, plusieurs choses sont à noter:

Parmi les instructions, on peut voir "$$(dirname ...)". Cela permet d'obtenir le retour de "dirname $@" et connaître le chemin du dossier du fichier que l'on veut copier pour le créer. Le fait d'avoir 2 "$" permet d'éviter que make confonde cette instruction avec une variable, puisqu'on peut les écrire "$(VAR)" ou "${VAR}" (ce que je faisais jusqu'à présent).

En plus, on fait une substitution : on remplace SRCDIR par HTMLDIR : en effet, on veut copier notre page html dans le répertoire de sortie.

Vous remarquerez l'utilisation du caractère "%" qui signifie "n'importe quelle chaîne". C'est intéressant à utiliser car on peut placer ladite chaîne du côté droit du "=" à l'emplacement que l'on veut :)

Autrement dit, par exemple si j'ai une variable "VAR = prx boit trop de bière", alors si je fais "${VAR:%trop=%trop peu}", alors j'obtiens "prx boit trop peu de bière". \o/

On continue.

J'avance un peu dans le fichier vers ce segment :

atom: ${ATOMS}
${ATOMS}: ${ATOM}
	@mkdir -p $$(dirname $@)
	@cp -v ${ATOM} $@

On a la cible "atom" qui dépend des fichiers contenus dans la variable ${ATOMS}.

On indique ensuite comment construire ces fichiers. Eh oui, on peut utiliser une variable comme cible :)

Pour constuire ${ATOMS}, j'ai besoin du fichier ${ATOM} (les instructions pour l'obtenir sont plus loin.

On va encore un peu plus loin pour observer cette partie :

sitemap: ${HTMLPAGES} ${SITEMAP}
${SITEMAP}:
	@DOMAIN="${DOMAIN}" tools/sitemap.sh \
		${HTMLPAGES:${SRCDIR}/%=%} > ${SITEMAP}

Ici je fais le choix de passer les options au script "tools/sitemap.sh" via des variables d'environnement. C'est plus facile que de devoir gérer des options.

Ce script prend en argument ce truc : "${HTMLPAGES:${SRCDIR}/%=%}".

Il s'agit de la liste des pages html HTMLPAGES, mais légèrement modifiée. On remplace ici le dossier source "${SRCDIR}/" situé avant tout ce qui suit "%" par seulement tout ce qui suit "=%". Autrement dit, on retire des chemins "{SRCDIR}".

Utiliser "%" permet donc de "matcher" sur n'importe quoi, et de garder ce contenu en mémoire pour le réutiliser de l'autre côté du "=".

Enfin, on inclus un autre fichier pour que chacun puisse ajouter son petit bout de Makefile :

include custom.mk

J'espère que ces détails vous auront donné envie d'en apprendre davantage sur les Makefiles.

Pour consulter le code complet :

=> /code/graphos.tgz

Et bien entendu :

=> https://man.openbsd.org/make

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-11-15-graphos.txt

2021-11-15T17:06:28Z

<![CDATA[

Tout d'abord, désolé, ça doit être le bazar dans le flux ATOM si votre client a gardé un cache : tout est régénéré.

En effet, j'ai terminé le plus gros du travail sur un petit projet dont je suis tout fier : graphos.

Il s'agit d'un outil pour écrire et exporter en de multiples formats et en de mutiples supports.

Cela me permet notamment d'héberger ce site en http, gemini mais aussi gopher tout en séparant les 3 sur mon serveur.

graphos est aussi capable d'envoyer les écrits à une mailing list si besoin.

Je garde la possibilité de lister toutes les pages, de générer un flux ATOM, un gemlog, un sitemap...

J'envisage aussi la publication automatique vers IPFS.

Quoi qu'il en soit, utiliser un Makefile pour gérer les dépendances m'aura beaucoup appris.

On verra à l'usage si c'est aussi facile à ajuster pour de nouveaux exports. Pour l'instant, je m'amuse :)

=> /code/graphos.tgz

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-11-10-ipv6-over-ipv4-wireguard.txt

2021-11-10T21:07:51Z

<![CDATA[

If your ISP or phone operator doesn't provide you an IPv6, you still can get IPv6 connectivity as long as you have somewhere a server with IPv6 -- let's say a VM at openbsd.amsterdam :).

Let's configure IPv6 over ipv4 with wireguard and OpenBSD.

Prerequisite:

  • A server with IPv6 connectivity running OpenBSD
  • A private IPv6 address range. In this example, it is fd9c:f774:0bfa:acfc. It could be fd42::1, fd42::2... but you might prefer doing this correctly.

=> Generate a private IPv6 range

On the server

# cat /etc/pf.conf

[...snip...]
pass in on egress proto udp from any to any port 4545 keep state
match out on egress from (wg0:network) to any nat-to (egress)
pass on egress from (wg0:network) to any
pass on wg0
# cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
# cat /etc/hostname.wg0
inet 10.0.0.1/24
inet6 fd9c:f774:0bfa:acfc::1/64
wgkey [...snip...]
wgport 4545
# peer 1
wgpeer [...snip...] wgaip 10.0.0.2/32 wgaip fd9c:f774:0bfa:acfc::2/128
# peer 2
wgpeer [...snip...] wgaip 10.0.0.3/32 wgaip fd9c:f774:0bfa:acfc::3/128
# peer 3
wgpeer [...snip...] wgaip 10.0.0.4/32 wgaip fd9c:f774:0bfa:acfc::4/128

up

I removed the key as you can see.

The port is 4545, but use whatever you want :)

It is really important to end ipv6 allowed ip by /128 !

On a client

# cat /etc/hostname.wg0
wgkey [...snip...]
wgpeer [...snip...] \
	wgendpoint  4545 \
	wgaip 0.0.0.0/0 \
	wgaip ::0/0 \
	wgpka 25

inet 10.0.0.3/24
inet6 fd9c:f774:0bfa:acfc::3/64
wgrtable 1
up
!route add -inet default 10.0.0.1
!route add -inet6 default fd9c:f774:0bfa:acfc::1
# cat /etc/hostname.iface
rdomain 1
up
inet autoconf

Of course, edit endpoint ipv4.

It is important to set wgaip to any IPv4 and IPv6 to encrypt for both.

As you can see, we set the default route to the VPN endpoint IP.

Links

=> https://openbsd.amsterdam/ | HE is another way to get IPv6 connectivity. | Full WireGuard setup with OpenBSD

Something to say ?

=> Send your comment by mail.

]]>

https://si3t.ch/log/2021-11-05-evils-deplaces.txt

2021-11-05T21:07:51Z

<![CDATA[

Pour information, j'ai déplacé/renommé les listes d'IP et de domaines malveillants que je maintiens :

=> /evils/

De cette façon, je propose par défaut une version gzippée automatiquement pour les clients qui le supportent.

Pour rappel, il y en a 4 (+1):

=> prx-brutes.txt | pf-badhost.txt | hosts.txt | unwind-block.txt

Pensez à mettre vos scripts à jour ;)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-22-internet-no-more.txt

2021-10-22T21:07:51Z

<![CDATA[

Solène recently wrote an article "What if Internet stops?" and ask for other's opinions.

=> gemini://perso.pw/blog/articles/huge-disaster-recovery-plan.gmi

Like a physicists wonders what happens when a force disappear to understand an equilibrium situation, I must say I like such questions. What if...?

=> https://what-if.xkcd.com

At first, I thought like Solène : save human kind knowledge. This means Wikipedia dumps at least.

Save important personal data too, mostly pictures and memories.

(Note to myself : print your favourite family pictures.)

Also, I thought : some games are like piece of art and must be kept safe. Music too.

Then I wondered : "what for do you use your computer?"

The answer makes me wonder...

I use it for my work. documents for my lessons. But actually, my best lectures are the ones without computer presentation but with more experiments and intelligence shared beteween students. So... meh.

I use my computer to communicate over the Internet (mostly emails, blog reading and XMPP). No internet means less time spend watching cats on youtube, drama about the color of a dress, reading jokes here and there while sitting on the toilet.

Seriously, I would miss the opportunity to meet great people, some with who I feel closer than my own neighbours. Taht would be a pity. So, backup those persons adress to write them letters (some around Lyon, other at Not-in-Canada-Montreal, even some in cities called something-over-Meu :))

On second thought, saving Wikipedia is probably not so relevant. Except programming, which is useless if computers disappear, almost everything I know doesn't comes from the Internet. The most important is already in good books like printed encyclopedia. Of course, if there is no Internet anymore, you won't be able to read the Kardashian's Wikipedia page. And this page probably doesn't exist in the library encyclopedia.

Is it bad?

Infact, stupid stuffs like Kardashian's hype probably exists only because of internet. No internet, no need to learn about it.

When searching "Top 100 Most Visited Websites by Search Traffic", it seems that most website are visited to look for/understand/waste time on other websites. I don't see anything in the top 10 I couldn't replace or stop using :

(from https://ahrefs.com/blog/most-visited-websites/)

    1. en.wikipedia.org : books
    1. youtube.com : Go to theater. Except some great creative content, it's a waste of time. Less access to creative content doesn't means it disappear.
    1. amazon.com : There are stores. Next to your house. That's probably better than buying cheap stuff delivered across hundred of kilometers by underpaid people.
    1. facebook.com : Talk.
    1. twitter.com : Again, talk.
    1. fandom.com : I only used it to read stuff about video games. No video games, no need fandom for me. I guess I could read the game files instead.
    1. pinterest.com : Hum, doesn't use already.
    1. imdb.com : Once upon a time, there was video clubs.
    1. reddit.com : speak god dammit!
    1. yelp.com : never used

What I mean here is that Internet self-feed itself and let us think it has become something we can't live without.

Big joke.

Try to live one entire day without screens. Shut down the house power and tell everyone with a very convincing voice :

Oh no, there is a problem at the power plant. (/quavering/) What a pity.

Then, go out, play with your kids, invite friends to eat marshmallow over a wood fire, sing songs, play hide and seeks, walk in the forest, gather some flowers, paint some stones to spread in the town to decorate, bring a pie to your grandma, watch the clouds, build a hut, listen to the wind, read a book at the candle light, write a letter to a long time no see friend, listen to music or dance, make love under the stars.

not necessarily in this order ;)

Something to say ?

=> Send your reaction by mail | Instructions

]]>

https://si3t.ch/log/2021-10-21-wg-ipv6.txt

2021-10-21T21:07:51Z

<![CDATA[

Let's assume you followed the instructions given by solene to reach the internet through a wireguard tunnel :

=> Full wireguard setup with OpenBSD

You can use this tunnel using ipv6 too \o/. Actually it's quite easy since you can add multiple option to wg configuration.

network

  • VPN Port used is 4545
  • VPN ipv4 network is 10.0.0.0/24
  • VPN ipv6 network is fd42::/64

Endpoint configuration

$ cat /etc/hostname.wg0
inet 10.0.0.1/24
inet6 fd42::1 64
wgkey changemeplease
wgport 4545

wgpeer changeme1 wgaip 10.0.0.2/32 wgaip fd42::2/64
wgpeer changeme2 wgaip 10.0.0.3/32 wgaip fd42::3/64
$ cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Peer configuration

wgkey changemeagain
wgpeer changemeplz \
        wgendpoint xx.xx.xx.xx 4545 wgaip 0.0.0.0/0 \
        wgendpoint yyyy:yyyy:yyyy:yyyy::yyyy 4545 wgaip ::0/0 \
        wgpka 25

inet 10.0.0.3/24
inet6 fd42::3/64
wgrtable 1
up
!route add -inet default 10.0.0.1
!route add -inet6 default fd42::1
  • xx.xx.xx.xx is endpoint public ipv4
  • yyyy:yyyy:yyyy:yyyy::yyyy is endpoint public ipv6

Firewall

Nothing to change compared to solene's guide.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-18-goaccess-setup.txt

2021-10-18T21:07:51Z

<![CDATA[

Since I have the pleasure to host the OpenBSD Webzine, the main author (Solène, that's you ;)) asked for some data about number of visits.

First, I dont want matomo : MariaDB, PHP, user tracking... Hum, not for me.

Then, I thought about webalizer, a log analyzer to generate charts. I like it, but as Solène notices, charts are image and not so easy to read.

Finally, I gave goaccess a new try and set it to generate html reports periodically for the webzine and my own website.

This is how I set up webalizer for multiple domains.

httpd setup

I like my logs to combined format. In server configuration "/etc/httpd.conf" :

server "athome.tld" {
    root "/htdocs/athome.tld"
    log style combined
    log access "athome.tld.log"
    ...

As you can see, logs are stored in "/var/www/logs/athome.tld.log"

Goaccess setup

First, let's install goaccess. Easy

# pkg_add goaccess

Then, edit "/etc/goaccess/goaccess.conf" for global configuration.

# httpd logs combined
date-format %d/%b/%Y
time-format %T %z
log-format %v %h %^ %^ [%d:%t] "%r" %s %b "%R" "%u"
# keep visitors identity safe
anonymize-ip true
# keep old stats
persist true
restore true

Other options will be set at command line.

Stats

I find more convenient to use a script for each server and store goaccess history in a dedicated directory. We will assume the server files belongs to user "foo".

# mkdir -p /var/db/goaccess/athome.tld
# chown foo /var/db/goaccess/athome.tld

Now, create a script to call goaccess with approriation flags.

#!/bin/sh
# generate goaccess stats

out=/var/www/htdocs/athome.tld/stats.html
db=/var/db/goaccess/athome.tld
log=/var/www/logs/athome.tld.log
title="My website stats"
u=foo

/usr/local/bin/goaccess $log \
  -o $out \
  --db-path=$db \
  --user-name=$u \
  --html-report-title="$title"

Notice the use of "--user-name".

Automatic updates

Set up a crontab to start above script

6,10,19,21 * * * * /usr/local/bin/goaccess-athome.tld.sh > /dev/null 2>&1

Here, stats are generated at 6am, 10am, 7pm and 9pm. You might use "@hourly" as well.

Report generation before log rotate

Edit /etc/newsyslog.conf to call goacces before logs archiving :

/var/www/logs/athome.tld.log               644  7     250  $W0   Z  "/usr/local/bin/goaccess-athome.tld.sh && pkill -USR1 -u root -U root -x httpd"

Real time

Yeah, goaccess can listen to a port for automatic updates (with real-time and daemonize flags). It requires to load ssl certificates, but those keys belongs to root only on OpenBSD. You can copy and change permissions on them, or start goaccess realtime as root. I think it's a bad idea to start a process as root.

Links

=> OpenBSD Webzine | Solène | webalizer | goaccess

Something to say ?

=> Send your comment by mail.

]]>

https://si3t.ch/log/2021-10-16-openbsd-7.0.txt

2021-10-16T21:07:51Z

<![CDATA[

OpenBSD est disponible depuis peu en version 7.0.

Cette fois ça y est, j'ai mis à jour toutes mes machines :

  • Mon serveur à la maison
  • Ma machine virtuelle chez openbsd.amsterdam, qui me sert de serveur secondaire pour les DNS et les mails (+ quelques sites)
  • Le portable de ma chérie
  • Le lecteur de salon
  • Mon pc fixe et mon portable sont déjà sous -current.

Avec cette versions, viennent quelques nouveautés qui me plaisent bien.

On notera un changement au niveau du fonctionnement de dhcp. Désormais, à partir du moment où le résolveur DNS unwind est activé, alors il est utilisé sans autre manipulations pour résoudre les domaines. Pour rappel, ce petit outil (unwind) permet de s'affranchir des résolveurs des FAI ou points d'accès pas toujours très regardant en terme de vie privée. Je m'en sers aussi pour bloquer les pubs.

Si vous n'utilisez pas encore unwind, vous devriez :)

doas rcctl enable unwind

De plus, il est désormais possible de configurer le kernel "à la volée" sans artifices particuliers tout en profitant de KARL. KARL, c'est un truc pour ajouter de l'aléatoire au chargement du kernel et rendre plus difficiles certains exploits.

En ce qui me concerne, je devais désactiver le module "ulpt" pour pouvoir utiliser mon imprimante USB. Je le faisais dans le fichier "/etc/rc.shutdown" et demandait le recalcul du hash du kernel. C'était "un peu" contraignant car la machine mettait un poil plus de temps à s'éteindre.

printf 'disable ulpt\nq\n' | config -ef /bsd
sha256 /bsd >/var/db/kernel.SHA256

Désormais, je peux virer ces lignes et utiliser la fonctionnalité "bsd.re-config".

Dans le fichier "/etc/bsd.re-config", je n'ai qu'à indiquer :

disable ulpt

Et plus rien à faire ensuite \o/.

Enfin, je découvre la commande "timeout" pour stopper un processus après un certain délai.

L'outil "openrsync" comprend maintenant l'option "--exclude" de rsync, et c'est un petit plus qui me fait plaisir : plus besoin d'installer rsync :).

Il y a bien évidemment un tas d'autres nouveautés, aussi je vous invite à tester cette nouvelle version rien que par curiosité :) .

Liens

=> OpenBSD | openbsd.amsterdam | undinw : blocage de pubs | bsd.re-config

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-15-xmpp.txt

2021-10-15T21:07:51Z

<![CDATA[

La messagerie instantanée et moi, c'est compliqué. Lorsque je participe à certaines discussions, je remarque rapidement que cela requiert trop d'attention. Je suis du genre à me laisser rapidement déconcentrer.

Récemment, j'ai tenté de participer davantage sur quelques salons IRC. Cependant, alors que j'essayais de réguler mon attention, j'ai fait le constat qu'il m'était difficile de discuter au regard de ma façon de travailler, c'est à dire de façon très découpée.

En effet, que ce soit parce que je suis interrompu très fréquemment par la vie non-numérique (#faîtes-des-enfants :)), ou bien parce que j'aime parfois travailler hors ligne pour rester concentré, suivre des discussions sur IRC était catastrophique : je manquais la plupart des messages. De toute façon, même en faisant tourner un client dans une session tmux sur mon serveur, il finissait TOUJOURS par être déconnecté à un moment donné.

Toutefois, rien n'est perdu. Voilà quelques temps que j'ai configuré prosody, un serveur XMPP pour me créer un accès et m'intéresser davantage à ce protocole avec lequel j'avais joué il y a quelques années (création de bots).

Et je dois dire que c'est un vrai plaisir! Je suis surpris que tant de personnes restent collées sur IRC, si ce n'est pas simple habitude et inertie. Selon moi, XMPP présente des avantages non négligeables, qui ne se limitent pas à quelques fonctionnalités supplémentaires.

En voici quelques uns :

  • Salons avec historique : on peut suivre discussion même si on n'est pas constamment connecté.
  • Pas de déconnexions intempestives contrairement à IRC.
  • On crée un compte, et basta. Ce dernier peut servir à tout, même à changer de pseudo selon le salon de discussion rejoint. C'est tellement plus pratique que d'enregistrer/réserver un nick sur IRC de je ne sais quelles façons differentes puisque la procédure n'est pas la même selon le serveur. D'ailleurs, la méthode d'identification passe par du tls par défaut. Selon les serveurs IRC, on peut y voir des messages à envoyer à "NickServ" ou bien des certificats à transmettre, là aussi ça change d'une fois sur l'autre.
  • Les serveurs XMPP peuvent communiquer entre eux. Cela veut dire qu'il n'est pas nécessaire de créer un compte pour libera.chat, geeknode, oftc sans pouvoir en sortir. Ça prend tout son sens lorsqu'on repense à la débacle récente qu'a connu freenode.
  • On peut utiliser plusieurs clients en même temps avec le même compte. Autrement dit, je peux participer à une discussion avec mon pc portable et en même temps avec mon téléphone. Ça n'a l'air de rien, mais c'est tellement pratique!
  • On peut recevoir des messages même lorsqu'on est hors ligne : on les lit lorsqu'on se reconnecte. Ça, j'adore! Ça ajoute la fonctionnalité du mail que je préfère :)
  • Il existe diverses solutions de chiffrement pour parler en toute intimité : GPG, OTR, OMEMO. Sans doute pas parfaits, mais mieux que rien du tout avec IRC. J'ai été surpris de l'efficacité d'OMEMO.
  • On peut corriger des messages (typo) dans les salons de discussion. C'est idiot, mais pour quelqu'un qui comme moi a tendance a accumuler les fautes, c'est pratique.
  • Possibilité de l'utiliser "hors-ligne" : connexion pour récupérer les messages, repondre. Pas besoin de connexion tout le temps.
  • À défaut de mieux, il existe des passerelles publiques vers des salons IRC. Il suffit de rejoindre un canal ainsi "#nom_du_chan%irc.serveur.irc@domaine.passerelle". Il en existe un paquet, alors voici un exemple : "#helpdesk@biboumi.tilde.team".

De tous ces points, c'est principalement la question de la vie privée et de la possibilité de chiffrer les communications qui, à ma grande surprise, semblent d'un seul coup peu intéressants pour des libristes habituellement scrupuleux sur ces questions. Pourtant, n'importe quel participant d'un salon sur IRC peut connaître votre IP. Certes, ça ne fait pas tout, mais ça reste énorme comme "fuite".

D'autres ont écrit sur le sujet, en préférant par exemple lister les défauts d'IRC :

=> IRC's flaws

J'aimerais bien voir XMPP plus souvent utilisé, aussi je vous invite à réessayer :) Un compte se crée en quelques instants, et un serveur se configure aussi très vite (prosody).

Je n'ai pas encore ouvert les inscriptions sur mon propre serveur. À vrai dire, je serais curieux de savoir si ça intéresse quelqu'un ? Ça pourrait être un truc que j'ajoute comme service en @si3t.ch (un CHATONS inofficiel ^^).

Par où commencer?

Téléchargez un client, créez un compte (une adresse), et c'est parti!

=> Getting started

Quel client utiliser?

Un client, c'est un logiciel qui permet d'utiliser un compte XMPP.

Voici des clients de qualité : gajim, dino, conversations (android), profanity (en console, j'adore \o/).

=> ConverseJS, client en ligne (bof, ça dépanne) | Dino, efficace et sobre | Gajim, le vénérable | Conversations sur Android, excellent! | profanity (en console, j'adore \o/).

Quels salons de discussion?

Voici quelques salons que j'apprécie:

  • auto-hébergement@muc.chapril.org : salon d'antraide autour de l'hébergement en général. On y apprends plein de choses et les gens sont sympas.
  • geminauts@chat.kwiecien.us pour parler de gemini, et tout un tas d'autres trucs sympas
  • openbsd@chat.si3t.ch : salon de discussion autour d'OpenBSD. Un certain Thuban avait créé il y a des années un salon équivalent sur jabberfr.org, mais ce dernier a paumé ses identifiants comme un gros boulet :-*.
  • openbsd_fr@chat.si3t.ch : pareil, mais pour parler en français
  • fremen@chat.si3t.ch : mon petit salon où vous êtes les bienvenus :)

Si vous cherchez un salon de discussion, il y a cette interface :

=> https://search.jabber.network/rooms/1

Vous en connaissez d'autres ? N'hésitez pas à m'en faire part. :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-10-nethack-8.txt

2021-10-10T21:07:51Z

<![CDATA[

Aloha prx, welcome to NetHack! You are a neutral female human Tourist.

Ça faisait un longtemps n'est-ce pas?

Me voilà touriste :) Youpi, c'est les vacances!

Et puisque le monde de Nethack est merveilleux, j'ai plein de thunes, de nourriture, des fléchettes et...

i - an uncursed carrot

À moi l'orbe ! ;)

Niveau 1

Le premier niveau se passe plutôt pas mal. J'aveugle les ennemis trop gros avec l'appareil photo et mon chat les défonce. Brave Kiki.

À la fin, il ressemble à ça :


            -----------      ----------
            |..........######|.........#####################     -------
            |.........|     #.........|                          |.....|
            |.........|     #|......<.|                          |.....|
            |.........-#    #-----.----       ---------          |.....|
            ---.-------#    #     #           |........#         ---.---
               #       #    #     ##       ###........|#        #####
           #####       #    #      ##      #  |.......|#        #
           #         ###    #       #      #  ---------#      ###
          -.----     #    ###       #    ###           #      #
          |....|    ##    ###`##    #    #             #      #
          |.....###################################################
          |....|    #      #     #  #    #           #   # ---|---.---
          |....|    #------#    ----.-- ###              ##-.........|
          |....|    #.....-#    |......#                   |.........|
          |....|     |....|     |.....|##                  |.........|
          ------     |....|     |.....|#                   |......@>.|
                     ------     |......#                   |......f..|
                                -------                    -----------

Prx the Rambler                St:12 Dx:15 Co:14 In:12 Wi:9 Ch:14 Neutral
Dlvl:1 $:176 HP:10(10) Pw:3(3) AC:10 Xp:1

Je suppose que je n'ai pas trouvé tous les passages, mais tant pis, je continue.

Niveau 2

Au niveau 2, je bloque sans faire exprès une porte avec un boulet. J'enrage : il y avait certainement un truc super dans cette pièce! Certainement un commerce vu les messages concernant des bruits de pièces d'or en train de tomber qui apparaissent. GRRR. Plus loin je trouve des lentilles. Je tente de les porter pour voir si ça change quelque chose, mais il semble que non.

Quelques jackal, rats et goblin plus loin, je décide de filer au niveau suivant.

                       ---------------
                      #..............|             --------------
                      #|..<..........|             |..>.........-#
 |                    #|.............|      #######-............|#
 |.                  ##|..............#######      |............|##
  |                  # -.-------------#        ####.............| #
  `################ ######           ##            ----.--------- #
       ####       #####               #           ######          #
       #         ######               ###        ##               #
       #         ##-.-.-----            #       ##                #
       #         ##|.......|            ###   ##                  #
     ###     ######|{......|              #   #          `#######`####
  ---|------####   |........###           #---.------------       #--.--
  |........|# #   #........|  ########    #-..@f).........|       #|...|
  |........-#######|^......|         ###   |.............{|       #....|
  |........|  #    ---------           ##  |..............|        |...|
  |.........###                         ###-..............|        -----
  ----------                               ----------------

Prx the Rambler                St:12 Dx:15 Co:14 In:12 Wi:9 Ch:14 Neutral
Dlvl:2 $:192 HP:4(15) Pw:7(7) AC:10 Xp:2

Ouep, pas top ce 4 HP. Il faudra faire gaffe ^^

Niveau 3

Youpi! Un magasin est présent dans ce niveau \o/

Et bien sûr, alors que je me précipite ...

Wait!  That's a small mimic!

Ouille, voilà les HP descendus à 2/15 :s

Je m'enfuis aussi vite que possible. Ouf, il semble que cette bestiole ne me suis pas.

Wait!  That's a small mimic!  The small mimic hits!
You die...

C'était trop bien parti ^^

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      201 Au      |
                  |   killed by a    |
                  |   small mimic    |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Aloha prx the Tourist...

You died in The Dungeons of Doom on dungeon level 3 with 261 points,
and 201 pieces of gold, after 1473 moves.
You were level 2 with a maximum of 15 hit points when you died.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-06-httpd_gzip_code.txt

2021-10-06T21:07:51Z

<![CDATA[

Comme promis je donne quelques détails sur la façon dont j'ai ajouté la possiblité de servir du contenu compressé avec httpd.

Tout d'abord, je tiens à remercier Solène pour ses judicieux conseils et pour m'avoir donné l'impulsion de m'y remettre.

En effet, j'avais déjà implémenté un truc similaire en demandant à httpd de servir le contenu au travers d'un cgi. Le principe était très simple : on vérifiait si un fichier avec le même nom et l'extension ".gz" en plus était présent à côté de celui demandé. Si oui, alors c'est celui-ci que l'on envoyait. (voir sbw).

Tout ceci était très peu efficace, vous vous en doutez.

Pourtant, c'est une fonctionnalité à mon avis indispensable car elle réduit considérablement la quantité d'octets à transférer au prix de quelques calculs supplémentaires pour décompresser. C'est bon pour les bandes passantes (tout le monde n'a pas la fibre) et la compression gzip ne nécessite pas tant de ressources.

Par ailleurs, puisque les fichiers sont déjà compressés à l'avance, il s'agit de compression statique. Autrement dit, ce n'est pas au serveur de compresser à la volée, ce qui pourrait représenter quelques problèmes en terme de sécurité.

C'est donc parti pour éditer le code source de httpd, le serveur http présent de base dans OpenBSD. Je ne vous cache pas mon très grand espoir de voir ces quelques rajouts intégrés pour de bon.

Description du code

Nos affaires se passent dans le fichier "server_file.c", dans la fonction responsable de l'ouverture/lecture du fichier à envoyer "server_file_request".

On commence par vérifier que l'on a activé l'option pour servir du contenu gzippé :

if (srv_conf->gzip_static) {

Ensuite, nous allons avoir besoin de quelques variables :

struct http_descriptor  *desc = clt->clt_descreq;
struct http_descriptor  *resp = clt->clt_descresp;
struct stat             gzst;
struct kv               *r, key;
char                    gzpath[PATH_MAX];

"desc" et "resp" permettront de vérifier que le navigateur supporte la compression gzip et d'envoyer l'entête indiquant que le contenu est bien compressé. "r" et "key" serviront à fouiller dans les entêtes.

(je m'aperçois que "desc" devrait plutôt s'appeler "req"...).

"gzst" et "gzpath" permettront de remplacer les informations sur le fichier demandé et son chemin d'accès si ce dernier est bien disponible chiffré.

On vérifie tout d'abord que le navigateur accepte le "gzip" en cherchant l'entête "Accept-Encoding". Si ce dernier existe, on cherche "gzip" puis on continue :

/* check Accept-Encoding header */
key.kv_key = "Accept-Encoding";
r = kv_find(&desc->http_headers, &key);

if (r != NULL) {
	if (strstr(r->kv_value, "gzip") != NULL) {

Ensuite, on ajoute ".gz" au nom du fichier demandé

strlcpy(gzpath, path, sizeof(gzpath));
strlcat(gzpath, ".gz", sizeof(gzpath));

La variable "gzpath" contient maintenant "path" + ".gz".

Reste à tester si l'accès à ce fichier gzippé est possible : s'il existe et s'il est lisible :

if ((access(gzpath, R_OK) == 0) &&
(stat(gzpath, &gzst) == 0)) {

Si c'est tout bon, alors on remplace le chemin d'accès par la version gzippée et on l'indique dans les entêtes envoyés :

path = gzpath;
st = &gzst;
kv_add(&resp->http_headers,
    "Content-Encoding", "gzip");

Et voilà :)

Le reste, on n'y touche pas, le serveur httpd se charge de servir le fichier.

Il aura fallu tout de même déplacer une ligne pour obtenir le type de fichier demandé avant de tester le gzip :

media = media_find_config(env, srv_conf, path);

Ça paraît en fait tout simple. Il aura fallu réfléchir tout de même un peu, mais très franchement il faut très peu de lignes. J'apprécie énormément la clarté du code d'OpenBSD, finalement très accessible pour un débutant en C comme moi. :)

Tester le diff

Pour ceux que ça intéresse, voici comment tester le diff :

  • Récupérer le code source comme indiqué ici : http://www.openbsd.org/anoncvs.html
  • Aller dans /usr/src/usr.sbin/httpd
  • Récupérer le diff et l'enregistrer dans /tmp/httpd_gzip.diff
  • Patcher : "patch -p1 < /tmp/httpd_gzip.diff
  • make && doas make install

Ajoutez l'option "gzip_static" dans la configuration d'un domaine servi par httpd.

Compressez les fichiers que vous voulez servir gzippés ainsi :

$ gzip -9 -c fichier.html > fichier.html.gz

Ouvrez un navigateur pour demander "fichier.html" et vérifiez que l'entête "Content-Encoding : gzip" est présent. Vous pouvez aussi remarquer que la taille téléchargée est bien plus petite qu'avant.

Le diff

Index: httpd.conf.5
===================================
RCS file: /cvs/src/usr.sbin/httpd/httpd.conf.5,v
retrieving revision 1.118
diff -u -r1.118 httpd.conf.5
--- httpd.conf.5	7 Jun 2021 10:53:59 -0000	1.118
+++ httpd.conf.5	5 Oct 2021 19:27:34 -0000
@@ -381,6 +381,10 @@
 features in use
 .Pq omitted when TLS client verification is not in use .
 .El
+.It Ic gzip_static
+Enable static gzip compression.
+.Pp
+When a file is requested, serves the file with .gz added to its path if it exists.
 .It Ic hsts Oo Ar option Oc
 Enable HTTP Strict Transport Security.
 Valid options are:
Index: httpd.h
========================================
RCS file: /cvs/src/usr.sbin/httpd/httpd.h,v
retrieving revision 1.157
diff -u -r1.157 httpd.h
--- httpd.h	17 May 2021 09:26:52 -0000	1.157
+++ httpd.h	5 Oct 2021 19:27:34 -0000
@@ -85,6 +85,7 @@
 #define SERVER_DEF_TLS_LIFETIME	(2 * 3600)
 #define SERVER_MIN_TLS_LIFETIME	(60)
 #define SERVER_MAX_TLS_LIFETIME	(24 * 3600)
+#define SERVER_DEFAULT_GZIP_STATIC 0
 
 #define MEDIATYPE_NAMEMAX	128	/* file name extension */
 #define MEDIATYPE_TYPEMAX	64	/* length of type/subtype */
@@ -542,6 +543,8 @@
 
 	struct server_fcgiparams fcgiparams;
 	int			 fcgistrip;
+
+	int		 	 gzip_static;
 
 	TAILQ_ENTRY(server_config) entry;
 };
Index: parse.y
========================================
RCS file: /cvs/src/usr.sbin/httpd/parse.y,v
retrieving revision 1.125
diff -u -r1.125 parse.y
--- parse.y	10 Apr 2021 10:10:07 -0000	1.125
+++ parse.y	5 Oct 2021 19:27:34 -0000
@@ -140,7 +140,7 @@
 %token	PROTOCOLS REQUESTS ROOT SACK SERVER SOCKET STRIP STYLE SYSLOG TCP TICKET
 %token	TIMEOUT TLS TYPE TYPES HSTS MAXAGE SUBDOMAINS DEFAULT PRELOAD REQUEST
 %token	ERROR INCLUDE AUTHENTICATE WITH BLOCK DROP RETURN PASS REWRITE
-%token	CA CLIENT CRL OPTIONAL PARAM FORWARDED FOUND NOT
+%token	CA CLIENT CRL OPTIONAL PARAM FORWARDED FOUND NOT GZIPSTATIC
 %token		STRING
 %token  	NUMBER
 %type		port
@@ -288,6 +288,8 @@
 
 			s->srv_conf.hsts_max_age = SERVER_HSTS_DEFAULT_AGE;
 
+			s->srv_conf.gzip_static = SERVER_DEFAULT_GZIP_STATIC;
+
 			if (last_server_id == INT_MAX) {
 				yyerror("too many servers defined");
 				free(s);
@@ -1140,6 +1142,9 @@
 			srv_conf->flags &= ~SRVFLAG_BLOCK;
 			srv_conf->flags |= SRVFLAG_NO_BLOCK;
 		}
+		| GZIPSTATIC				{
+			srv_conf->gzip_static = 1;
+		}
 		;
 
 block		: BLOCK				{
@@ -1400,6 +1405,7 @@
 		{ "fastcgi",		FCGI },
 		{ "forwarded",		FORWARDED },
 		{ "found",		FOUND },
+		{ "gzip_static",	GZIPSTATIC },
 		{ "hsts",		HSTS },
 		{ "include",		INCLUDE },
 		{ "index",		INDEX },
Index: server_file.c
============================================
RCS file: /cvs/src/usr.sbin/httpd/server_file.c,v
retrieving revision 1.70
diff -u -r1.70 server_file.c
--- server_file.c	29 Apr 2021 18:23:07 -0000	1.70
+++ server_file.c	5 Oct 2021 19:27:34 -0000
@@ -229,20 +229,49 @@
 		goto abort;
 	}
 
+	media = media_find_config(env, srv_conf, path);
+
 	if ((ret = server_file_modified_since(clt->clt_descreq, st)) != -1) {
 		/* send the header without a body */
-		media = media_find_config(env, srv_conf, path);
 		if ((ret = server_response_http(clt, ret, media, -1,
 		    MINIMUM(time(NULL), st->st_mtim.tv_sec))) == -1)
 			goto fail;
 		goto done;
 	}
 
+	/* change path to path.gz if necessary. */
+	if (srv_conf->gzip_static) {
+		struct http_descriptor	*desc = clt->clt_descreq;
+		struct http_descriptor	*resp = clt->clt_descresp;
+		struct stat		gzst;
+		struct kv		*r, key;
+		char			gzpath[PATH_MAX];
+
+		/* check Accept-Encoding header */
+		key.kv_key = "Accept-Encoding";
+		r = kv_find(&desc->http_headers, &key);
+
+		if (r != NULL) {
+			if (strstr(r->kv_value, "gzip") != NULL) {
+				/* append ".gz" to path and check existence */
+				strlcpy(gzpath, path, sizeof(gzpath));
+				strlcat(gzpath, ".gz", sizeof(gzpath));
+
+				if ((access(gzpath, R_OK) == 0) &&
+					(stat(gzpath, &gzst) == 0)) {
+					path = gzpath;
+					st = &gzst;
+					kv_add(&resp->http_headers,
+						"Content-Encoding", "gzip");
+				}
+			}
+		}
+	}
+
 	/* Now open the file, should be readable or we have another problem */
 	if ((fd = open(path, O_RDONLY)) == -1)
 		goto abort;
 
-	media = media_find_config(env, srv_conf, path);
 	ret = server_response_http(clt, 200, media, st->st_size,
 	    MINIMUM(time(NULL), st->st_mtim.tv_sec));
 	switch (ret) {

Liens

=> Solène | sbw dans l'archive de code

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-05-httpd_gzip.txt

2021-10-05T21:07:51Z

<![CDATA[

J'en avais envie depuis longtemps mais je ne m'en sentais pas capable.

Mais cette fois ça y est, j'ai édité le code de httpd pour qu'il serve mes pages compressées avec gzip.

C'est en test, alors si vous repérez des soucis, n'hésitez pas à m'en faire part.

Un article détaillant le code suivra ^^

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-10-01-openbsd_webzine.txt

2021-10-01T21:07:51Z

<![CDATA[

Il y a quelques jours, solene nous faisait part de son idée d'un webzine OpenBSD. Rapidement, l'idée nous enchante, et les suggestions permettent d'organiser les choses. On fait des tests, on joue avec LaTeX pour a voir un beau PDF, avec mdoc pour avoir un rendu 100% texte, scribus pour une présentation type magazine.

Finalement, l'organisation suivante est retenue :

  • Contenu lisible par un maximum de personnes, il doit donc être accessible.
  • Publication quand on a une page de prête, donc pas forcément de façon régulière.
  • Tout en html. Statique, mais rapide et pratique. un Makefile et des templates facilientent la tâche.
  • Organisation via un dépôt git, contributions bienvenues.
  • Location du NDD par vinishor (merci!)
  • Hébergement à la maison sur mon serveur.

Tout s'organise finalement assez vite. Il faut dire que c'est très stimulant et on apprends des choses.

Après la configuration des DNS (vinishor primaire, bibi secondaire), mise en place des certificats et renouvellement, quelques essais, installation d'une tâche cron pour mettre le site autmatiquement en ligne lorsqu'il est modifié, écriture de quelques articles (quand même), c'était parti :

=> Voici The OpenBSD Webzine

Je vous invite à vous abonner au flux :)

Je crois qu'on va bien s'amuser pour communiquer autour des nouveautés et de l'activité qui anime OpenBSD.

Liens

=> Blog de solene | Site de vinishor | Dépôt git openbsd-webzine

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-09-30-lynx.txt

2021-09-30T21:07:51Z

<![CDATA[

Je recopie ici quelques notes sur lynx que je tiendrai à jour à cette page :

=> Notes sur lynx

Je préfère lynx car il rend mieux les pages, et semble plus performant pour convertir les mails html dans mutt.

Il est reposant et pratique à utiliser.

Il permet aussi de naviguer sur le protocole gopher.

Le seul truc qui lui manque, c'est donc le support du protocole gemini. lynx est encore maintenu, alors qui sait?

=> Documentation officielle pour lynx

~/.lynxrc : configuration

Dans lynx, appuyer sur "o" permet d'avoir un menu de configuration. Bon, puisque lynx est isolé du reste du système sous OpenBSD (sécurité sécurité \o/), il y a peu de choses qui peuvent être enregistrées. Il faudra éditer le fichier de config à la main.

Voici ma petite sélection :

accept_all_cookies=on
bookmark_file=.lynx_bookmarks.html
case_sensitive_searching=off
character_set=UNICODE (UTF-8)
emacs_keys=off
file_sorting_method=BY_FILENAME
preferred_language=en
user_mode=ADVANCED
vi_keys=on

Raccourcis clavier

avec vi_keys=on, je peux naviger avec hjkl, et ça c'est cool!

  • h / l : précédent/suivant
  • j / k : aller vers le bas/haut
  • TAB : lien suivant
  • q : quitter
  • Backspace ou V : historique
  • m : retour page d'accueil
  • l : liste de tous les liens dans la page courante
  • d : télécharger le lien
  • ctrl-r ou x : recharger / recharger sans le cache
  • / : rechercher
  • g ou G : ouvrir l'URL
  • a : ajouter aux marques pages
  • v : voir les marque pages
    • : créer des liens pour les images
  • \ : source du document

Page d'accueil : avec variable d'env :

$ cat ~/.profile
export WWW_HOME=https://lite.duckduckgo.com/lite

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-09-28-glyphprint.txt

2021-09-28T21:07:51Z

<![CDATA[

J'ai souvent besoin d'utiliser des lettres grecques dans mes documents, et j'apprécie coller quelques emojis de temps en temps.

Sauf que voilà, c'est galère de les retrouver s'il faut faire une recherche en ligne à chaque fois.

Voilà donc un petit truc qui affiche dans le terminal tous les glyphes souhaités (voir config.h). Plus qu'à copier/coller.

=> /code/glyphprint.tgz

Il me manque la description des différents emojis pour bien faire. Ceci dit, c'est déjà pas mal.

$ glyphprint

---
Greek:
Α  Β  Γ  Δ  Ε  Ζ  Η  Θ  Ι  Κ  Λ  Μ  Ν  Ξ  Ο  Π  Ρ  ΢  Σ  Τ  Υ  Φ  Χ  Ψ  Ω  Ϊ  Ϋ  ά  έ  ή  ί  ΰ  α  β  γ  δ  ε  ζ  η  θ  ι  κ  λ  μ  ν  ξ  ο  π  ρ  ς  σ  τ  υ  φ  χ  ψ  
---

---
Arrows:
←  ↑  →  ↓  ↔  ↕  ↖  ↗  ↘  
---

---
Math:
∀  ∁  ∂  ∃  ∄  ∅  ∆  ∇  ∈  ∉  ∊  ∋  ∌  ∍  ∎  ∏  ∐  ∑  −  ∓  ∔  ∕  ∖  ∗  ∘  ∙  √  ∛  ∜  ∝  ∞  ∟  ∠  ∡  ∢  ∣  ∤  ∥  ∦  ∧  ∨  ∩  ∪  ∫  ∬  ∭  ∮  ∯  ∰  ∱  ∲  ∳  ∴  ∵  ∶  ∷  ∸  ∹  ∺  ∻  ∼  ∽  ∾  ∿  ≀  ≁  ≂  ≃  ≄  ≅  ≆  ≇  ≈  ≉  ≊  ≋  ≌  ≍  ≎  ≏  ≐  ≑  ≒  ≓  ≔  ≕  ≖  ≗  ≘  ≙  ≚  ≛  ≜  ≝  ≞  ≟  ≠  ≡  ≢  ≣  ≤  ≥  ≦  ≧  ≨  ≩  ≪  ≫  ≬  ≭  ≮  ≯  ≰  ≱  ≲  ≳  ≴  ≵  ≶  ≷  ≸  ≹  ≺  ≻  ≼  ≽  ≾  ≿  ⊀  ⊁  ⊂  ⊃  ⊄  ⊅  ⊆  ⊇  ⊈  ⊉  ⊊  ⊋  ⊌  ⊍  ⊎  ⊏  ⊐  ⊑  ⊒  ⊓  ⊔  ⊕  ⊖  ⊗  ⊘  ⊙  ⊚  ⊛  ⊜  ⊝  ⊞  ⊟  ⊠  ⊡  ⊢  ⊣  ⊤  ⊥  ⊦  ⊧  ⊨  ⊩  ⊪  ⊫  ⊬  ⊭  ⊮  ⊯  ⊰  ⊱  ⊲  ⊳  ⊴  ⊵  ⊶  ⊷  ⊸  ⊹  ⊺  ⊻  ⊼  ⊽  ⊾  ⊿  ⋀  ⋁  ⋂  ⋃  ⋄  ⋅  ⋆  ⋇  ⋈  ⋉  ⋊  ⋋  ⋌  ⋍  ⋎  ⋏  ⋐  ⋑  ⋒  ⋓  ⋔  ⋕  ⋖  ⋗  ⋘  ⋙  ⋚  ⋛  ⋜  ⋝  ⋞  ⋟  ⋠  ⋡  ⋢  ⋣  ⋤  ⋥  ⋦  ⋧  ⋨  ⋩  ⋪  ⋫  ⋬  ⋭  ⋮  ⋯  ⋰  ⋱  ⋲  ⋳  ⋴  ⋵  ⋶  ⋷  ⋸  ⋹  ⋺  ⋻  ⋼  ⋽  ⋾  
---

---
Tech:
⌀  ⌁  ⌂  ⌃  ⌄  ⌅  ⌆  ⌇  ⌈  ⌉  ⌊  ⌋  ⌌  ⌍  ⌎  ⌏  ⌐  ⌑  ⌒  ⌓  ⌔  ⌕  ⌖  ⌗  ⌘  ⌙  ⌚  ⌛  ⌜  ⌝  ⌞  ⌟  ⌠  ⌡  ⌢  ⌣  ⌤  ⌥  ⌦  ⌧  ⌨  〈  〉  ⌫  ⌬  ⌭  ⌮  ⌯  ⌰  ⌱  ⌲  ⌳  ⌴  ⌵  ⌶  ⌷  ⌸  ⌹  ⌺  ⌻  ⌼  ⌽  ⌾  ⌿  ⍀  ⍁  ⍂  ⍃  ⍄  ⍅  ⍆  ⍇  ⍈  ⍉  ⍊  ⍋  ⍌  ⍍  ⍎  ⍏  ⍐  ⍑  ⍒  ⍓  ⍔  ⍕  ⍖  ⍗  ⍘  ⍙  ⍚  ⍛  ⍜  ⍝  ⍞  ⍟  ⍠  ⍡  ⍢  ⍣  ⍤  ⍥  ⍦  ⍧  ⍨  ⍩  ⍪  ⍫  ⍬  ⍭  ⍮  ⍯  ⍰  ⍱  ⍲  ⍳  ⍴  ⍵  ⍶  ⍷  ⍸  ⍹  ⍺  ⍻  ⍼  ⍽  ⍾  ⍿  ⎀  ⎁  ⎂  ⎃  ⎄  ⎅  ⎆  ⎇  ⎈  ⎉  ⎊  ⎋  ⎌  ⎍  ⎎  ⎏  ⎐  ⎑  ⎒  ⎓  ⎔  ⎕  ⎖  ⎗  ⎘  ⎙  ⎚  ⎛  ⎜  ⎝  ⎞  ⎟  ⎠  ⎡  ⎢  ⎣  ⎤  ⎥  ⎦  ⎧  ⎨  ⎩  ⎪  ⎫  ⎬  ⎭  ⎮  ⎯  ⎰  ⎱  ⎲  ⎳  ⎴  ⎵  ⎶  ⎷  ⎸  ⎹  ⎺  ⎻  ⎼  ⎽  ⎾  ⎿  ⏀  ⏁  ⏂  ⏃  ⏄  ⏅  ⏆  ⏇  ⏈  ⏉  ⏊  ⏋  ⏌  ⏍  ⏎  ⏏  ⏐  ⏑  ⏒  ⏓  ⏔  ⏕  ⏖  ⏗  ⏘  ⏙  ⏚  ⏛  ⏜  ⏝  ⏞  ⏟  ⏠  ⏡  ⏢  ⏣  ⏤  ⏥  ⏦  ⏧  ⏨  ⏩  ⏪  ⏫  ⏬  ⏭  ⏮  ⏯  ⏰  ⏱  ⏲  ⏳  ⏴  ⏵  ⏶  ⏷  ⏸  ⏹  ⏺  ⏻  ⏼  ⏽  ⏾  
---

---
Shapes:
■  □  ▢  ▣  ▤  ▥  ▦  ▧  ▨  ▩  ▪  ▫  ▬  ▭  ▮  ▯  ▰  ▱  ▲  △  ▴  ▵  ▶  ▷  ▸  ▹  ►  ▻  ▼  ▽  ▾  ▿  ◀  ◁  ◂  ◃  ◄  ◅  ◆  ◇  ◈  ◉  ◊  ○  ◌  ◍  ◎  ●  ◐  ◑  ◒  ◓  ◔  ◕  ◖  ◗  ◘  ◙  ◚  ◛  ◜  ◝  ◞  ◟  ◠  ◡  ◢  ◣  ◤  ◥  ◦  ◧  ◨  ◩  ◪  ◫  ◬  ◭  ◮  ◯  ◰  ◱  ◲  ◳  ◴  ◵  ◶  ◷  ◸  ◹  ◺  ◻  ◼  ◽  ◾  
---

---
Misc:
☀  ☁  ☂  ☃  ☄  ★  ☆  ☇  ☈  ☉  ☊  ☋  ☌  ☍  ☎  ☏  ☐  ☑  ☒  ☓  ☔  ☕  ☖  ☗  ☘  ☙  ☚  ☛  ☜  ☝  ☞  ☟  ☠  ☡  ☢  ☣  ☤  ☥  ☦  ☧  ☨  ☩  ☪  ☫  ☬  ☭  ☮  ☯  ☰  ☱  ☲  ☳  ☴  ☵  ☶  ☷  ☸  ☹  ☺  ☻  ☼  ☽  ☾  ☿  ♀  ♁  ♂  ♃  ♄  ♅  ♆  ♇  ♈  ♉  ♊  ♋  ♌  ♍  ♎  ♏  ♐  ♑  ♒  ♓  ♔  ♕  ♖  ♗  ♘  ♙  ♚  ♛  ♜  ♝  ♞  ♟  ♠  ♡  ♢  ♣  ♤  ♥  ♦  ♧  ♨  ♩  ♪  ♫  ♬  ♭  ♮  ♯  ♰  ♱  ♲  ♳  ♴  ♵  ♶  ♷  ♸  ♹  ♺  ♻  ♼  ♽  ♾  ♿  ⚀  ⚁  ⚂  ⚃  ⚄  ⚅  ⚆  ⚇  ⚈  ⚉  ⚊  ⚋  ⚌  ⚍  ⚎  ⚏  ⚐  ⚑  ⚒  ⚓  ⚔  ⚕  ⚖  ⚗  ⚘  ⚙  ⚚  ⚛  ⚜  ⚝  ⚞  ⚟  ⚠  ⚡  ⚢  ⚣  ⚤  ⚥  ⚦  ⚧  ⚨  ⚩  ⚪  ⚫  ⚬  ⚭  ⚮  ⚯  ⚰  ⚱  ⚲  ⚳  ⚴  ⚵  ⚶  ⚷  ⚸  ⚹  ⚺  ⚻  ⚼  ⚽  ⚾  ⚿  ⛀  ⛁  ⛂  ⛃  ⛄  ⛅  ⛆  ⛇  ⛈  ⛉  ⛊  ⛋  ⛌  ⛍  ⛎  ⛏  ⛐  ⛑  ⛒  ⛓  ⛔  ⛕  ⛖  ⛗  ⛘  ⛙  ⛚  ⛛  ⛜  ⛝  ⛞  ⛟  ⛠  ⛡  ⛢  ⛣  ⛤  ⛥  ⛦  ⛧  ⛨  ⛩  ⛪  ⛫  ⛬  ⛭  ⛮  ⛯  ⛰  ⛱  ⛲  ⛳  ⛴  ⛵  ⛶  ⛷  ⛸  ⛹  ⛺  ⛻  ⛼  ⛽  ⛾  
---

---
Dingbats:
✀  ✁  ✂  ✃  ✄  ✅  ✆  ✇  ✈  ✉  ✊  ✋  ✌  ✍  ✎  ✏  ✐  ✑  ✒  ✓  ✔  ✕  ✖  ✗  ✘  ✙  ✚  ✛  ✜  ✝  ✞  ✟  ✠  ✡  ✢  ✣  ✤  ✥  ✦  ✧  ✨  ✩  ✪  ✫  ✬  ✭  ✮  ✯  ✰  ✱  ✲  ✳  ✴  ✵  ✶  ✷  ✸  ✹  ✺  ✻  ✼  ✽  ✾  ✿  ❀  ❁  ❂  ❃  ❄  ❅  ❆  ❇  ❈  ❉  ❊  ❋  ❌  ❍  ❎  ❏  ❐  ❑  ❒  ❓  ❔  ❕  ❖  ❗  ❘  ❙  ❚  ❛  ❜  ❝  ❞  ❟  ❠  ❡  ❢  ❣  ❤  ❥  ❦  ❧  ❨  ❩  ❪  ❫  ❬  ❭  ❮  ❯  ❰  ❱  ❲  ❳  ❴  ❵  ❶  ❷  ❸  ❹  ❺  ❻  ❼  ❽  ❾  ❿  ➀  ➁  ➂  ➃  ➄  ➅  ➆  ➇  ➈  ➉  ➊  ➋  ➌  ➍  ➎  ➏  ➐  ➑  ➒  ➓  ➔  ➕  ➖  ➗  ➘  ➙  ➚  ➛  ➜  ➝  ➞  ➟  ➠  ➡  ➢  ➣  ➤  ➥  ➦  ➧  ➨  ➩  ➪  ➫  ➬  ➭  ➮  ➯  ➰  ➱  ➲  ➳  ➴  ➵  ➶  ➷  ➸  ➹  ➺  ➻  ➼  ➽  ➾  
---

---
Emojis:
😀  😁  😂  😃  😄  😅  😆  😇  😈  😉  😊  😋  😌  😍  😎  😏  😐  😑  😒  😓  😔  😕  😖  😗  😘  😙  😚  😛  😜  😝  😞  😟  😠  😡  😢  😣  😤  😥  😦  😧  😨  😩  😪  😫  😬  😭  😮  😯  😰  😱  😲  😳  😴  😵  😶  😷  😸  😹  😺  😻  😼  😽  😾  😿  🙀  🙁  🙂  🙃  🙄  🙅  🙆  🙇  🙈  🙉  🙊  🙋  🙌  🙍  🙎  
---

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-09-27-10km.txt

2021-09-27T21:07:51Z

<![CDATA[Il fait nuit.

Petite Neige s'est endormie.

Petit Photon et Petit Flocon aussi.

Me voilà sorti, éclairé par la lampe accrochée à mon torse. Elle crée devant moi un tunnel de lumière dans lequel je m'engouffre en courant.

Pas d'empressement, j'ai tout mon temps.

Tranquillement j'avance, traverse la ligne de chemin de fer, longe le chateau d'eau et retrouve la Loire. Le long du fleuve, tout est calme. Une pluie fine commence à tomber, elle me rafraîchit et crée un nuage pailleté dans l'éclairage des lampadaires. Rapidement, je quitte la ville et profite des étoiles qui peinent à percer le nuages. La lueur des maisons au loin est apaisante. Le bruit du vent dans les feuilles d'arbres me pousse à poursuivre ma course et sans trop y penser, me voilà de retour au village.

Tout fier d'y être arrivé sans trop forcer, voilà bien longtemps que je n'avais pas couru 10 km.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-09-19-prosody.txt

2021-09-19T21:07:51Z

<![CDATA[

J'ai réinstallé prosody. C'est un jeu d'enfant, tout est bien expliqué dans la doc officielle. Voici donc quelques petites notes qui ajoutent des détails pour OpenBSD ou qui m'ont parus un peu plus complexes.

Ajout de champs DNS

Champ A:

xmpp.example.com

Ce champ doit correspondre à celui définit ensuite dans les champs SRV suivants.

Champs SRV:

_xmpp-client._tcp.example.com. 18000 IN SRV 0 5 5222 xmpp.example.com.
_xmpp-server._tcp.example.com. 18000 IN SRV 0 5 5269 xmpp.example.com.

Il faudra en ajouter pour les services proposés par le serveur xmpp s'il y en a, comme les MUC :

_xmpp-server._tcp.conference.example.com. 18000 IN SRV 0 5 5269 xmpp.example.com.

prosody

# pkg_add prosody

Editer "/etc/prosody/prosody.cfg.lua"

Il n'y a rien à faire si ce n'est préciser l'adresse de l'admin et ajouter d'un virtualhost et préciser l'emplacement du certificat:

VirtualHost "si3t.ch"
	ssl = {
		certificate = "/etc/prosody/certs/si3t.ch.crt";
        key = "/etc/prosody/certs/si3t.ch.key";
	}

Le certificat doit être lisible par l'user _prosody.

Puisque j'obtiens les certs avec acme-client, je les installe ainsi après avoir lancé acme :

install -g _prosody -o _prosody -m 400 /etc/ssl/private/si3t.ch.key /etc/prosody/certs/
install -g _prosody -o _prosody -m 400 /etc/ssl/si3t.ch.crt /etc/prosody/certs/

Ajout de l'admin :

# prosodyctl adduser me@example.com

On vérifie que la config est correcte:

prosodyctl check config

Ouverture des ports

Ouvrir 5222 (xmpp-client) et 5269 (xmpp-server)

Archivage des logs

Éditer /etc/newsyslog.conf :

/var/prosody/prosody.log                644  5     300  *     Z
/var/prosody/prosody.err                644  5     300  *     Z

Vérifier la configuration du serveur

Remplacez "si3t.ch" par le domaine de votre serveur :

https://xmpp.net/result.php?domain=si3t.ch&type=server

Ressources

=> https://prosody.im/doc

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-09-17-wiby.txt

2021-09-17T21:07:51Z

<![CDATA[Aujourd'hui, je voudrais partager une découverte totalement fortuite alors que je flânais devant la liste des référents vers mon site.

Il s'agit là d'un de mes petits passe-temps : consulter quel autre site renvoie vers le mien. J'y découvre parfois d'autres sites super sympas. C'est aussi parfois l'occasion de lire l'avis de personnes en désaccord avec moi, ou qui prolongent certaines idées. Bref, c'est enrichissant. C'est aussi flatteur, il faut l'avouer.

Dans la liste des "refferer", je peux trouver google ou encore duckduckgo, des crawlers divers et de rares liens directs. C'est l'un de ces derniers qui m'a intrigué : wiby.

En suivant la source, je découvre un moteur de recherche.

=> wiby

Un champ pour entrer sa recherche, un bouton "surprise me" pour aller sur une page au hasard, et un bel ascii art :)

               .n.                     |
              /___\          _.---.  \ _ /
              [|||]         (_._ ) )--;_) =-
             [_____]          '---'.__,' \
              }-=-{                    |
              |-" |
              |.-"|                p
       ~^=~^~-|_.-|~^-~^~ ~^~ -^~^~|\ ~^-~^~-
       ^   .=.| _.|__  ^       ~  /| \
        ~ /:. \" _|_/\    ~      /_|__\  ^
       .-/::.  |   |""|-._    ^   ~~~~
         `===-'-----'""`  '-.              ~
      jgs               __.-'      ^

Alors déjà, le bouton "surprise me" est génial : il permet de découvrir de nouvelles choses et sortir de sa zone de confort.

On y retrouve donc un esprit pre-web 2.0 que j'apprécie fortement.

En fouillant un peu, on découvre des bonus, comme une page de chat (wiby.me/chat), une API pour y faire des recherches (https://wiby.me/json/).

Il s'agit là d'un moteur de recherche qui indexe les pages simples, non commerciales et sans surcharges de CSS et JS. De plus, lorsqu'on lit la page d'ajout (https://www.wiby.me/submit/), on se rend compte que seules les pages soumises sont indexées : il n'y a donc pas de bot qui scanne tout le web en permanence.

Merci donc à la personne qui a demandé l'indexation de mon site, le voir sur wiby me fait chaud au coeur.

Je vous invite à tester ce moteur et à prendre le temps de découvrir les perles qui s'y trouvent, à l'ancienne. ^^

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-08-04-callery-galerie-statique.txt

2021-08-04T21:07:51Z

<![CDATA[

Vous connaissez probablement Minigal Nano ou Bizou (j'adore le nom :D) qui servent à générer à la volée des galeries d'image présentes dans un dossier.

=> Minigal_nano | Bizou | sfpg (bonus! :))

Ça marche très bien, et j'apprécie énormément l'intégration des vidéos par la même occasion. Il y en a même des aperçus (sauf pour les webm :/).

Je m'en sers depuis 2 ans pour partager des images des enfants pour toute la famille de la façon suivante :

  • Ma chérie fait du tri et place les photos organisées dans un dossier sur son ordi. Par la même occasion, on renomme les fichiers pour avoir un "commentaire" ou un "titre" de photo.
  • Elle optimise les images via un script (action personnalisée dans Thunar) : "gm convert "$i" -strip -quality 75 -interlace line -auto-orient"
  • Elle optimise les vidéos de la même façon :
for i in $@; do
  j="${i%.*}"
  ffmpeg -i ${i} -c:v libvpx-vp9 -b:v 0 -crf 33 -pass 1 -an -row-mt 1 -f webm /dev/null -y && \
  ffmpeg -i ${i} -c:v libvpx-vp9 -b:v 0 -crf 33 -pass 2 -c:a libopus -row-mt 1 \
      -max_muxing_queue_size 1024 ${j}.webm
done
  • Via sftp, protocole géré par son gestionnaire de fichiers (Thunar/xfce) qui ne nécessite rien d'autre que d'avoir configuré SSH sur mon serveur, elle uploade les photos par copier/coller.
  • Toutes les nuits (ou à la main), un script est lancé qui appelle rsync pour synchroniser les photos sur la partie serveur web.

Depuis peu, j'ai décidé de me passer autant que possible de PHP : bien que mon petit serveur tienne la charge, le CPU montait parfois très haut pour la génération des images. Alors, désormais, j'utilise le petit outil "callery".

  • L'accès est protégé avec un htpw.

=> callery

C'est une bidouille en C, rien de bien folichon, qui génère du code html pour avoir une galerie. L'avantage, c'est que c'est une galerie statique, qui ne demande aucun effort au serveur.

Il intègre les images et les vidéos et génère des aperçus pour un chargement plus rapide.

J'y vois quelques intérêts :

  • Charge CPU du serveur nettement moins grande
  • Meilleure sécurité ? Pas trop d'inquiétude concernant bizou ou minigal_nano, mais je suis presque entièrement débarassé de PHP :)
  • Allègement de la bande passante : j'utilise le lazyload pour les images, et la balise vidéo contient "preload=metadata" pour ne pas charger la vidéo mais seulement permettre d'en avoir un aperçu.
  • Possibilité de cacher des fichiers (ceux commençant par un ".").

J'aurais aimé directement intégrer la génération des thumbnail en C plutôt que de faire un appel avec system()... Mais c'est bien trop compliqué pour moi et je n'ai pour l'instant pas le temps de m'y pencher.

Quoi qu'il en soit, je constate que c'est vraiment pratique de savoir coder un peu. Sans être expert, loin de là, on peut se bricoler des petits outils qui répondent exactement à ses besoins. J'invite quiconque à se dégager du temps pour apprendre le C (ou le python, ou...) : comme apprendre à cuisiner ou bricoler un peu, c'est toujours utile!

À bientôt!

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-07-27-vaccin-et-ecologie.txt

2021-07-27T21:07:51Z

<![CDATA[

Aujourd'hui, discussion de la vaccination anti-COVID avec belle maman, qui est sceptique sur la vaccination en général et sceptique sur le pass sanitaire. Notez que j'emploie le mot "sceptique" au sens noble : quelqu'un qui se pose des questions et les confronte avec ses croyances, avec toute la difficulté que cela comporte. C'est d'autant plus difficile actuellement car elle se méfie de la médecine comme de la peste. Elle m'a fait remarqué la chose suivante, que je trouve brillante tellement c'est évident :

Ce qu'on essaie de faire avec le vaccin, c'est la même chose qu'avec l'écologie.

Tilt!

Une petite bulle éclate au-dessus de ma tête : "Ah mais oui mais carrément"!

Cela me donne matière à réfléchir, en voici quelques bribes.

(pssst. avant d'aller plus loin, je m'excuse du caractère potentiellement incohérent de certaines remarques : le sommeil manque mais le bonheur est là, je viens d'être papa :))

Déjà, à la base, l'écologie, c'est une discipline scientifique, pas un parti politique.

Or, on a des élus "écologistes" capables d'affirmer qu'on peut diminuer le réchauffement climatique ET fermer des centrales nucléaires. Ces derniers ignorent visiblement qu'une centrale nucléaire n'émet pas de dioxyde de carbone (pour ne citer que lui) et doit être remplacée par d'autres infrastructures, souvent grandes émettrices de CO_2 qui ne peut pas être stocké une fois relaché dans l'atmosphère contrairement aux déchets radioactifs. À moins de changer radicalement nos infrastructures et habitudes de vie, nous ne sommes pas prêts à vivre sans tout le confort que nous apporte l'électricité s'ils n'y a pas de vent ni de soleil. Bref, c'est un sujet à part entière.

Pour cette crise sanitaire, on fait tous l'expérience de l'incompétence des politiques en terme d'explications scientifiques, du port du masque imposé d'une façon ou d'une autre sans parler de campagne vaccinale décidée avec quelques personnes de différents avis tirés au sort, et encore moins le chef d'état qui décide délibérément de ne pas tenir compte des recommandations du conseil scientifique.

À aucun moment on explique que "au fur et à mesure, on comprend mieux le virus, on modifie donc notre stratégie en apprenant de nos éventuelles erreurs ou sur-précautions passées". Non, on expose des décisions qui paraissent incohérentes.

Il vaut mieux être idiot qu'incompétent : ça fait moins de mort, et en plus, c'est rigolo (j'ai oublié l'auteur, si vous le retrouvez merci de m'en faire part ^^)

Les parallèles avec l'écologie sont nombreux et génèrent méfiance, troubles, incompréhension et colère, autant de freins à l'apprentissage.

  • Écologie et vaccination ont en commun un objectif de préservation de la santé et du bien être de tous. Protéger l'environnement permettra à nos enfants de respirer et ne pas cramer à 50°C l'été à Londres, se faire vacciner leur évitera des dégénérescences cérébrales, séquelles respiratoire, si ce n'est la mort de leurs proches plus fragiles. (sans parler de tous les autre vaccins déjà obligatoires qui sauvent des milliers de vies et évite des souffrances horribles).
  • Puisque ce sont des motifs altruistes, s'y opposer accuse d'une forme d'égoisme voire de volonté de nuire. S'ensuit culpabilité en cas d'erreur innocente, sinon repli sur soi et colère d'auto-défense lorsqu'on est montré du doigt.
  • Ces deux sujets sont universels : tout le monde est concerné, impossible d'y échapper, quand bien même on voudrait fermer les yeux et continuer de vivre heureux dans l'insouciance. Hé oui, c'est dur de grandir...
  • Puisqu'ils sont universels, ils touchent tous, ou presque, les aspects de nos vies.
  • Des intérêts financiers émergent lorsqu'il est question de ces sujets : tel produit est polluant, faut-il qu'il soit plus cher? T'as acheté un SUV, bouh, tu pollues t'es méchant! Les labos se font plein de fric sur les vaccins tfaçon! Et le prix du masque maintenant qu'il est obligatoire? (souvenir...)
  • Pire, pour pouvoir continuer à vendre un produit, on est prêt à nier le réchauffement climatique en n'utlisant qu'une partie du travail des scientifiques : "non mais la Terre a déjà connu des réchauffements avant, et ça va finalement hein" : on occulte toute la dimension temporelle pour mieux manipuler.
  • Puisque c'est financier, il est question de pouvoir, donc de politique : qu'est-ce que je peux promettre pour faire plaisir à mes électeurs? Trop souvent, ces promesses sont des conneries au regard de la science (disons-le carrément), et crée une défiance quasi systématique.
  • On utilise un discours scientifique (souvent modifié ou partiellement cité) pour arriver à ses fins. Y a des mots techniques, alors ça doit être vrai. Souvent s'ensuit désillusion et perte de confiance, non pas envers le commercial, mais envers la science.

Qui, parmi les personnes qui doutent de l'intérêt de se faire vacciner, est allé se documenter soigneusement sur le sujet? J'ai moi même fustigé ce manque de curiosité qui me paraît si naturelle. Et pourtant, n'est-ce qu'un manque de curiosité? Pour faire la démarche de se renseigner correctement, il faut :

  • Avoir le temps
  • Être dans un état d'esprit qui le permet. Or, l'incohérence politique n'y est pas propice.
  • Pouvoir faire confiance à ce qu'on lit. Or, la plupart des sources d'information sont sur internet, dans le pire des cas les réseaux sociaux, dans le meilleur un journaliste qui, comme la plupart, n'a pas la formation scientifique pour comprendre la publication qu'il expose dans son article. Sans parler des journaux qui cherchent le buzz, pour faire du fric (encore!).
  • Puisqu'il est si compliqué de savoir "qui croire?", il faut être en mesure de savoir faire une recherche : multiplier les sources, savoir reconnaitre les sources fiables, croiser l'information. Pour en être capable, il faut avoir écouté les cours au collège, soit jusqu'en 3e, fin de la scolarité obligatoire (ce n'est pas vrai, maintenant c'est jusqu'à 18 ans), et en avoir des souvenirs. À propos des sources, je reste sidéré de voir qu'on préfère écouter Bigard (comique de profession) qu'un expert scientifique. Sans doute parce que le premier est connu, son aura est plus importante? (on croit facilement ce que dit son papa quand on est petit, mais on va se méfier de ce que dit un étranger). De plus, c'est confortable de lire que Claire pense comme moi, même si c'est une grosse connerie : on est au moins 2, ça rassure, on se sent moins seul dans cette tempête d'idées.
  • La dissonnance cognitive est désagréable : qui a envie de se faire du mal? C'est beaucoup plus confortable de chercher des prétextes pour se rassurer.
I would rather have questions that can't be answered than answers that can't be questioned. -- Feynman Richard

Eh oui, la science : ce n'est jamais sûr à 100%! Ou alors, si quelqu'un vous affirme que quelques chose est absolument certain, ce n'est pas un scientifique. "Jusqu'à preuve du contraire", voilà le bout de phrase important. Bon, il faut rester raisonnable : à force de cumuler des preuves qui vont dans le même sens, on arrive à un consensus et on peut dire "on a de bonnes raison de penser que la Terre n'est pas plate". "On a de bonnes raisons de penser...", voilà le 2e morceau de phrase magique.

Notez que c'est très différent de "j'ai de bonnes raisons de penser que le vaccin va me tuer dans 10 ans" : seul le sujet de la phrase change. 1 seul individu, 1 seule expérience ne permet pas de tirer des conclusions. Une hypothèse à la limite, qui devra être vérifiée ensuite pas un protocole testé de nombreuses fois avant de conclure.

En gros, si on pense quelque chose qui ne peut être remis en cause, alors on est dans le domaine de la foi, pas de la connaissance.

Se demander si le vaccin contre la COVID-19 peut faire du mal, c'est bien, c'est sain, c'est intelligent. On est nombreux à s'être demandé un jour si le père Noël existe vraiment, si la soupe fait vraiment grandir, si un arbre pousse dans son ventre si on avale un noyau, s'il faut bien manger 5 fruits et légumes par jour, si la pleine Lune fait naître les enfants... Remettre en question, c'est l'ingrédient nécessaire à l'apprentissage. "Remettre en question", pas "refuter en bloc parce que c'est encore un mec en blouse blanche à la solde des multinationales qui l'a dit".

On ne laisse pas les questions des enfants sans réponse, parce qu'on les aime.

Alors, lors du prochain repas en famille, essayez de distinguer le beau-frère qui affirme que le vaccin fait pousser un 3e testicule du cousin qui demande pourquoi le vaccin donne parfois de la fièvre. (affirmation vs question). Dans les 2 cas : amour! :)

Je regrette profondément que l'on (les médias? Un peu tout le monde?) ait élevé des polémistes au rang d'experts en leur donnant tant d'importance.

Je suis triste que tant de personnes se méfient à ce point de chercheurs et médecins qui, chaque jour, sauvent des vies. La médecine, la chimie, la science, permet aux femmes d'accoucher avec nettement moins de souffrance grâce à la péridurale, de ne pas se vider de son sang en étant recousu avec des mains expertes soigneusement désinfectées et évite de mourir ensuite à cause d'une infection, de soulager les cancers, de compenser les troubles tyrrhoidiens grâce à un traitement à vie, de pouvoir manger quelque chose de sucré sans mourir même si on souffre de diabète...

Je suis en colère car nos dirigeants n'ont pas fait le moindre effort pour expliquer pourquoi un vaccin c'est génial, trop occupés à ajuster leur image publique et chercher une stratégie pour inciter à la vaccination par un chantage voilé rendant encore plus méfiant ceux qui ont besoin d'être rassurés.

Les pubs pour "mettre sa ceinture de sécurité" me reviennent en tête. Les spots pour protéger ses proches "je l'aime, je ne l'embrasse pas à Noël" aussi : à chaque fois on cherche à faire peur, jamais on n'explique comment ça marche, jamais on ne rassure.

Non, il faut des citoyens et humanistes intelligents pour faire du bon boulot :

=> Piqûre (lol) de rappel sur comment fonctionne un vaccin. | Statistiques concernant la COVID-19, gratuit, sans pub, au cas où on ait peur que les chiffres soient des faux. | Prendre un rendez-vous facilement

Puisque la (les) politiques semblent faire partie intégrante des crises actuelles, écologique et sanitaire, et y contribuent largement, je pose la question : ne faudrait-il pas s'assurer que pour être élu député, un bagage scientifique, des cours de sciences soient absolument indispensables?

Ne faudrait-il pas renforcer les cours de sciences et de documentation? Ça suppose de mettre des sous dans l'éducation nationale plutôt que dans le ministère de l'intérieur en effet...

Trop de questions rhétoriques.

Allez, bonne nuit!

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-07-20-effet-long-terme.txt

2021-07-20T21:07:51Z

<![CDATA[

En réponse à quelques commentaires :

  • Je bois parfois des boissons "light" alors que des risques sur le long terme qu'il provoque un cancer font encore débat.
  • J'ai pendant un temps fumé du tabac, alors que je savais les risques sur le long terme sur ma santé.
  • Je bois parfois de l'alcool, alors que je sais les risques sur le long terme de cancer du foie (et autres).
  • Je mange parfois dans des fast foot alors que je sais les effets néfastes sur le long terme.
  • Je sors lorsqu'il fait jour, sans crème solaire, alors que je sais que s'exposer au Soleil présente des risques sur le long terme de brulures et de cancer de la peau.
  • Je ne dors pas suffisamment (pas toujours volontairement) alors que les effets du manque de sommeil à long terme sont prouvés.
  • Je me suis fait vacciné contre le COVID alors qu'on ne sait pas les effets sur le très long terme.

Par contre, on sait les effets à court terme de la COVID et les séquelles qu'elle peut laisser.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-07-19-vaccinated.txt

2021-07-19T21:07:51Z

<![CDATA[

J'ai enfin reçu mes 2 doses. Me voilà vacciné, comme les 43% autres français à ce jour.

À chaque fois, je n'ai absolument rien senti pendant la piqûre. Je ne dis pas ça pour faire le kéké, mais j'avoue ne pas trop aimer les piqûres (qui aime ça à part les fakir?). Si vous donnez votre sang, alors dîtes vous bien que ça n'a rien à voir : on ne sent vraiment rien. Mais j'imagine que ça dépend de la personne qui pique.

Je me sens vraiment bien. J'ai entendu parler de personnes fiévreuses le lendemain. Normal, c'est que le système immunitaire fonctionne. Pour ma part, j'ai juste le bras engourdi, et envie de faire la sieste. Mais pas de fièvre ni de douleur. En fait, je me sens mieux qu'après une soirée bien arrosée.

Je suis dans la tranche d'âge "relativement jeune" : 32 ans. Je suis donc passé après les prioritaires, et c'est bien normal. J'aurais aimé être vacciné plus tôt si ça avait été possible.

Désormais, j'envisage les rencontres beaucoup plus sereinement.

Je peux revoir mes proches sans craindre de les rendre malade. Oui, le risque zero n'existe pas. Mais être vacciné me permet de réduire considérablement le risque sans l'inconfort du masque (largement insuffisant).

Je me questionne moins sur la quantité de gel désinfectant que j'ai mis avant de rentrer (ou en sortant) d'un magasin.

J'envisage d'aller au ciné.

Je vais pouvoir faire des calins à ceux que j'aime même après une longue journée de travail.

J'avais peu de risque de mourir de la COVID.

Bien que ça ne soit pas tellement mon tempérament, je peux dire que je suis fier d'être vacciné : j'ai eu le courage de prendre ce risque (très mesuré :)) pour protéger l'ensemble de l'humanité. Ce sentiment d'avoir accompli quelque chose de bien dépasse largement les avantages cités précédemment.

Je n'ai rien d'un super héro, le "risque" est insignifiant au regard des séquelles qu'aurait pu me laisser le COVID, quoi qu'en disent les rageux.

Bref, j'ai fait ma part.

=> /img/think/vaccine_umbrella.jpg | Source de l'image

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-07-16-vaccin-doute-reponses.txt

2021-07-16T21:07:51Z

<![CDATA[

En cette période de doutes, d'inquiétude, d'agacement voire de colère, de découragement certain et de tristesse, j'ai besoin de prendre le temps de poser à plat certains éléments de réflexion concernant la vaccination et la pandémie de covid.

À vrai dire, j'ai surtout besoin de pouvoir exprimer certaines idées dans un cadre serein et de chercher à comprendre les réactions pleines de défiance et de colère. Mon site perso est l'endroit idéal pour ça.

Vacciner, c'est quoi ?

La vaccination, ça existe depuis trèèès longtemps. On refilait une maladie à quelqu'un, on en prenait grand soin jusqu'à sa guérison, et on savait ensuite qu'il ne pouvait plus tomber malade de la même infection. Ça se faisait en Chine au dix septième siècle avec la variole. Le risque de mourir quand même à cause du vaccin était de 1%.

C'était il y a longtemps. Je n'ai jamais entendu parler de personnes mortes suite à un vaccin de nos jours, pourtant avec les multiples réseaux de commmunication, ça devrait se savoir.

Ça a en effet évolué. Pasteur vaccine un humain pour la première fois en 1885, c'est à dire il y a 136 ans.

Tout ça pour dire que vacciner, ça n'a vraiment rien de nouveau.

Les techniques ont évolué, et l'arrivée du COVID-19 aura permis la mise en oeuvre de la vaccination à base d'ARN messager.

Là dessus, on lit tout et n'importe quoi. Cependant, si on prend la peine de réfléchir quelques minutes, c'est tout simple (voir "Comment fonctionne un vaccin du Hollandais Volant (Timo VN)). Ce que j'en retiens :

  • Les vaccins classiques : on te refile le virus un peu affaibli, et ton corps se démerde avec pour trouver une parade au cas où un jour il tombe sur le vrai virus.
  • Les vaccins à base d'ARN messager : on indique au système immunitaire comment fabriquer la protéine qui se trouve sur le virus afin de pouvoir la reconnaître si besoin plus tard.

À noter que :

  • Notre corps fabrique en permanence de l'ARN messager. C'est même comme ça qu'il fonctionne. C'est donc une substance NATURELLE.
  • L'ARN messager est une molécule à courte durée de vie. Elle se dégrade au bout de quelques heures.

Vaccination obligatoire

Suite aux dernières annonces de notre cher président de la République, je remarque de nombreux articles parlant d'obligation vaccinale en France ou Allemagne. De nombreux messages sur les réseaux évoquent ce sujet, avec notamment le "#VaccinObligatoire" sur twitter. Clairement, les personnes utilisant ce hashtag n'ont pas tout compris.

En effet, actuellement en France, la vaccination N'EST PAS obligatoire :

  • On a le droit de circuler librement sans être vacciné.
  • On a le droit de s'alimenter sans être vacciné.
  • On a le droit d'être soigné sans être vacciné.
  • On a le droit d'avoir un emploi sans être vacciné.

Pour le dernier point, ce n'est pas vrai pour tous les métiers. Cela n'a rien de nouveau, plusieurs métiers nécessitent déjà d'être vacciné. C'est aussi vrai pour voyager à l'étranger. Et c'est sans parler des 11 vaccins obligatoires contre d'horibles maladies.

Libre de ne pas être vacciné ?

Beaucoup s'insurgent de ne plus pouvoir aller s'amuser en concert ou au resto sans être vacciné et invoque une "dictature sanitaire".

C'est n'importe quoi.

=> /img/think/dictature-complots-covid.png

On peut alors lire beaucoup de colère qui semble empêcher tout discernement. Il est question de soi disant atteinte à la liberté, d'appels à la révolte et j'en passe.

Florence Porcel met le doigt sur un point à mon avis essentiel : si on vit seul, alors on est lire de (ne pas) faire comme bon nous semble. Or, nous vivons en société. Cela restreint donc nos libertés : on ne conduit pas à gauche en France, on n'achète pas une arme sans autorisation, on ne jette pas ses déchets dans la rue. Ces contraintes sont le prix à payer pour que tout le monde vive sereinement, et le gouvernement n'a rien à voir là dedans.

Rassurez-moi, vous avez entendu ça quand vous étiez petits?

La liberté de chacun s'arrête là où commence celle des autres.

Compilation des raisons pour ne pas se faire vacciner.

Voici une petite sélection de ce que j'ai pu lire ou entendre. Vous remarquerez qu'un schéma se répète : méfiance, crainte et désinformation. Lorsque je dis ça, ce n'est en rien une critique.

Je connais des gens qui ont eu la COVID, et ils vont très bien.

Remplacez "COVID" par "cancer", et ça marche aussi. Qu'une proportion de personnes s'en sorte bien ne diminue pas la dangerosité de la maladie. Perso, je n'ai pas envie de prendre le risque.

Ouvre les yeux, on nous manipule.

C'est vrai : on peut même voir que ça marche : des millions de prises de rendez-vous dès l'instant où on n'a plus le droit de peut-être propager un virus mortel en allant au resto ou au spectacle. Cette réaction très égoiste en dit long. C'est triste qu'il faille en arriver là. Ça serait tellement mieux si chacun prenait ses responsabilités pour le bien être de tous.

Si on nous manipule, c'est dans l'intérêt de qui?

De l'État

Je vous laisse méditer sur ce que c'est, "L'État".

Je vois surtout que c'est gratuit et que ça évite des morts.

Je refuse que l'on m'injecte un truc qui me fera peut-être mourir dans 10 ans.

La molécule injectée a une durée de vie très courte. C'est même pour ça qu'il faut la congeler à -70°C. Elle reste donc très peu de temps dans l'organisme. Si effets secondaires néfaste il y aurait, on s'en serait aperçu avec les premières personnes testées lors de la recherche.

Le développement du vaccin est allée trop vite.

C'est allé très vite, parce que :

  • Face à l'urgence, les gouvernements ont investit de l'argent dans la recherche (ce qui n'est pas le cas habituellement)
  • Les techniques existaient déjà (ARNm...)

Cela ne signifie pas que le protocole expérimental a été baclé. Des tests ont été effectués, et des vérifications rigoureuses aussi. Les publications nombreuses par des experts se corrèlent.

Pour le vérifier, il faut aller les lire (voir le tout dernier lien à la fin). J'imagine que l'efforts que cela demande est plus important que de scroller sur son smartphone en faisant caca. Il faut effectivement faire confiance.

Je fais davantage confiance à des experts dans leurs domaines qu'à Gwladys qui se fait des cataplasmes au miel.

Je me dis que si on envoyait aujourd'hui pour la première fois des gens sur la Lune, personne n'y croirait.

Etre vacciné n'empêche pas de propager le virus ou de tomber malade

Ça réduit énormément le risque de propager le virus.

Ça réduit énormément le risque de tomber GRAVEMENT malade, et donc de subir des séquelles

La grippe fait des morts, et le vaccin contre la grippe ne sert à rien

Faux, le vaccin contre la grippe sauve des vies tous les ans.

Le virus de la grippe n'est pas de la même nature que le COVID-19. Il mute régulièrement, donc le vaccin doit anticiper la forme qu'il aura. Vous savez, les mutations, commes celles que l'on craint. Ce n'est pas fiable à 100%, mais ça ne veut pas dire qu'il est inefficace.

C'est une histoire de gros sous

Il y a un marché, c'est vrai.

Mais un vaccin, on le fait une fois dans toute sa vie. Ça veut dire qu'on vend les doses pour un patient une fois, et après il n'y a plus de revenu.

Si j'étais à la tête d'un labo, et que je voulais juste me faire du fric, je miserai plutôt sur des médicaments administrés très souvent tout au long d'une vie (paracétamol, insuline, pilule contraceptive, homéopathie (lol)...).

On te manipule avec de faux chiffres

Autrement dit, tous les états, souvent en conflit entre eux, se sont mis d'accord pour publier de faux chiffres allant tous dans le même sens pour... Pourquoi en fait? Qu'est-ce qu'il y aurait à y gagner?

J'ai pas le temps de lire tout ça (en référence aux publications et articles explicatifs)

Alors arrête de dire des conneries?

Sincèrement on nous ment on nous injecte un danger dont on est les cobayes

=> /img/Fun/vaccin_magnet_prepuce.png

Je m'arrête là :)

Pourquoi tant de méfiance ?

Il est certain que les annonces gouvernementales incohérentes voire contradictoires n'aident en rien. C'est aussi triste que comique.

De plus, la france souffre d'une très mauvaise culture scientifique.

Demandez à quelqu'un de dessiner un scientifique, il vous représentera un type mal coiffé à l'air un peu fou.

Il y a donc aussi un problème culturel de représentation des sciences. Ça se sent dans les décisions politiques (carrément à l'ouest) et dans les explications des journalistes (sans formation scientifique) souvent maladroites.

Je souhaite donc rappeler que la science :

  • c'est accepter de se tromper.
  • c'est chercher des heures, échouer encore et encore pour comprendre.
  • c'est apprendre de ses erreurs avec humilité.

=> /img/kaamelott/humilite.gif

Les sciences sauvent des vies. Elles nous permettre de vivre dignement dans le confort et le luxe. Il suffit de comparer notre mode de vie avec celui des années 1600 pour s'en rendre un peu compte.

Chance d'être vacciné

En France, le vaccin est gratuit et pour tout le monde.

On est vraiment privilégiés.

Course contre la montre ?

Juste comme ça : tant que le virus circule, il mute.

Il est donc tout à fait envisageable qu'une mutation beaucoup plus contagieuse voire mortelle que celles existantes voit le jour.

Cela laisse la place à une forme résistante, comme pour la grippe.

Perso, j'ai pas envie. J'aimais bien pouvoir serrer la main des gens et ne pas avoir à prendre toutes ces précautions.

Mots de la fin

Patience, Instruction, Amour... ou sélection naturelle ?

Sources

On ne le rappellera jamais assez : vérifiez ce que vous lisez en croisant les sources et en vous demandant si la source est de confiance.

Ne prenez jamais une affirmation péremptoire comme vérité.

=> /img/kaamelott/Peremptoire.png

Voici une partie des sources qui m'ont permis d'écrire cette page :

=> Histoire de la vaccination. | Louis Pasteur | Comment fonctionne un vaccin. | Vaccins obligatoires pour les soignants. | Vaccins à réaliser pour visiter certains pays. | Liste des vaccins obligatoires. | Réflexions de L. Porcel sur la liberté en société | Dix doutes légitimes sur la vaccination | Incohérences des annonces gouvernementales | Complots faciles | Données publiques sur la vaccination | Comparaison avec/sans vaccination du nombre de cas graves | Publication sur le vaccin Pfizer (le plus administré en France) (Safety and Efficacy of the BNT162b2 mRNA Covid-19 Vaccine)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-07-13-frenfants.txt

2021-07-13T21:07:51Z

<![CDATA[

A: Bon les gars, on a un souci, le virus continue de se propager.

B: On leur avait pourtant dit de se faire vacciner!

C: Bah, le vaccin sert à rien puisque il y a de plus en plus de malades.

B: Seuls 40% des français ont reçu une première injection, c'est pas une franche réussite... Ça veut dire que 60% ne sont pas protégés et ne protègent pas les autres.

C: Mouais, mais on peut quand même tomber malade en étant vacciné

B: Oui, mais il y a nettement moins de risques d'en mourir ou de développer des séquelles.

A: Ça ne me dit pas comment inciter les gens à se faire vacciner. Vous avez d'autres solutions ?

B: On interdit à tout le monde d'aller travailler s'il n'est pas vacciné!

C: Espèce de Nazi! C'est une atteinte à mes libertés.

A: On a beau expliquer, il faut quand même protéger le plus de monde. Je vous rappelle que ça fait des morts.

C: Ben comme traverser la route! Moi je dis, laissons la nature faire, on développera une immunité na-tu-relle.

B: Comme avec le Sida et le Cancer?

C: Rhoooo, ben c'est pas pareil du tout! C'est mon prolème si je ne me fais pas vacciner.

B: Pas du tout. C'est ton problème si tu traverses la route les yeux bandés. C'est mettre les autres en danger d'être séropositif et ne pas mettre de capote.

C: Rien à voir, si ça se trouve je ne porte pas la COVID, et je ne la porterai peut-être jamais.

B: Mais tu ne fais rien pour l'en empêcher.

A: Ahem... Non mais vraiment, il faut trouver une solution. Si c'est pas le vaccin, on fait comment?

C: Euuuh...

A: On laisse les gens mourir?

C: Terroriste! Alors on vaccine les plus riches et on laisse les autres! Sale bourge!

B: Non mais il est gratuit le vaccin...

A: On a pourtant tout expliqué. C'est quoi qu'ils ne comprennent pas?

B: Bah ça n'intéresse personne!

C: Ouaiiis, c'est l'euro et les vacances et les terrasses et les boîtes de nuit! Rien à foutre de tomber malade! YOLO!

A: Ah ouais quand même...

B: Il faudrait trouver un moyen pour qu'il se concentre un peu.

A: Bon c'est décidé, je vire tous ses jouets : plus de ciné, plus de restau, plus de loisirs tant qu'il n'est pas vacciné.

C: Révolte! C'est une atteinte à ma liberté de ne pas être vacciné.

A: C'est pour préserver la liberté de chacun à ne pas mourir.

B: Non mais du calme, t'es pas obligé de te faire vacciner hein, on ne t'attache pas sur une chaise pour t'injecter le vaccin de force. Par contre, pas de discothèque sans vaccin, histoire de ne prendre aucun risque pour personne. C'est cool non? T'es pas vacciné, et tu risques pas de tomber malade ni de te sentir responsable d'avoir diffusé un truc.

C: Non mais le vaccin s'il faut le faire je veux bien hein, pour les boîtes de nuit, les concerts, histoire de pas être emmerdé. J'ai pas le choix de toute façon bande d'#%$! Je vais prendre mon rdv. (C part).

A: Il a même pas demandé comment ça marchait le vaccin.

B: Il faudrait trouver un moyen pour que les gens posent des questions en fait.

A: Tu voudrais les instruire?

B: Ouais non laisse tomber, j'ai dit une connerie.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-07-10-vinishor.txt

2021-07-10T21:07:51Z

<![CDATA[

Pluie torrentielle.

Un parapluie orange

Mon premier Starbucks

Congé paternité,

Salt, OpenBSD, Solène, python

7wonders, bridge, IRC, XMPP

Une petite promenade

Un pont.

The Dark Knight Returns

2 heures trop courtes

Des liens...

=> https://fr.boardgamearena.com/ | https://dataswamp.org/~solene/2021-07-10-old-computer-challenge-day1.html | gemini://unbon.cafe/vinishor/

Merci ! <3

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-06-26-random-holidays.txt

2021-06-26T21:07:51Z

<![CDATA[

C'est fini ! Ça y est, j'ai dit au revoir à mes élèves.

Ce fut difficile pour certains (moins pour d'autres ^^). 4 ans passés ensemble, à les accompagner dans leurs apprentissages ,leurs progrès, leurs chagrins, leurs drames familiaux, leur affirmation de soi. Je suis fier d'eux! Difficile de les laisser partir, mais le meilleur les attends.

C'est donc nostalgique que le week-end commence calmement. Bah oui, plus d'élèves, ça veut dire moins de cours à préparer. Je redécouvre ce que c'est d'avoir un peu de temps.

Ce matin, c'était jardinage. On a arraché des mauvaises herbes.

Ma chérie ne supportait plus de voir toute la bourrache envahir les tomates, elle a tout viré (ou presque, elle sait que j'aime les abeilles <3).

La menthe prenait trop de place. Hop, j'ai enlevé une partie et l'ai mise en terre à côté de fossé laissé à l'abandon par la commune. Si ça se trouve, elle va pousser ici à la place des ronces que je coupe trop souvent, ça sentira bon quand on se promènera.

Reste à tendre entre deux poteaux un fil de fer pour y faire pousser le kiwi (j'avais écrit wiki...). Mais il pleut, alors puisque tout le monde fait la sieste et qu'il fait gris, je vais lire.

Je continue les archives de Roshar de B. Sanderson, j'adore!

J'ai aussi installé le dernier rss2email (python3) pour tester, car j'ai l'impression que ça m'irait pas mal finalement. Le seul reproche que j'ai à lui faire, c'est qu'il est en python, ce qui n'est honnêtement pas très malin si c'est un bon soft.

Bientôt on sera 4.

Les pièces sont de plus en plus rangées, on est presque prêts :) (presque).

Ça serait bien de faire un peu de sport aussi. Voilà des semaines que je n'ai pas couru.

J'avais repris la traduction du guide pour s'auto-héberger. Petit à petit, ça avance. J'aurais peut-être bientôt fini la première partie.

Mais pour l'instant, je me sens fainéant, j'ai envie de profiter des heures qui passent :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-06-13-solene-blacklist.txt

2021-06-13T21:07:51Z

<![CDATA[

Thank you Solène for sharing bad IP found using iblock on your server <3

# cat /etc/pf.conf
table  persist file "/etc/solene.txt"
[...]
block log quick from  label "SOLENE <3"
# cat /etc/daily.local
next_part "solene's badhosts"
ftp -o /etc/solene.txt https://perso.pw/blocklist.txt
pfctl -t solene -T replace -f /etc/solene.txt

=> https://tildegit.org/solene/iblock

  • ?

=> prx's blacklist | Even more blacklists

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-06-12-favfonts.txt

2021-06-12T21:07:51Z

<![CDATA[

90% du contenu affiché à l'écran est du texte, sinon plus dans mon cas.

Je choisis donc les polices de caractères avec soin, et m'y tiens dans toutes les applications.

Monospace

Je passe beaucoup de temps devant un terminal. Et puis, j'apprécie les polices "mono", que je trouve moins fatiguantes à lire puisque chaque caractère occupe la même largeur.

Ma préférée a longtemps été Hack

=> hack

Elle ressemble à DejaVu Sans Mono certainement déjà présente sur votre système.

Je lui préfère toutefois Fira Code

=> Fira Code

Cette dernière ajoute des ligatures (petits empattements). Cela améliore le rendu et la reconnaissance des caractères, et c'est aussi un peu plus classe :)

Sans

Le reste du texte affiché l'est avec une police plus classique. Je trouve Droid Sans et Roboto très bien faîtes. La police Ubuntu est aussi très intéressante.

Cependant, je me tien sà la police B612, très lisible :

=> B612

Dans la même veine, vous pourrez apprécier B612 :

=> luciole

Tout d'abord pensée pour les problèmes de vue, je la trouve tout aussi profitable sans souffrir de troubles particuliers.

Screenshot

=> screenshot

$HOME/.fonts.conf




	
		
			true
		
		
			true
		
		
			false
		
		
			hintnone
		
		
			rgb
		
		
			lcddefault
		
	

	
		sans-serif
		B612 Regular
	
	
		serif
		DejaVU Serif Book
	
	
		monospace
		Fira Code
	

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-06-11-sfeed.txt

2021-06-11T21:07:51Z

<![CDATA[

État des lieux

Comme beaucoup, j'apprécie la simplicité des flux ATOM et RSS. Que c'est pratique de pouvoir facilement récupérer les nouveautés d'un site que l'on apprécie.

Des lecteurs de flux, j'en ai utilisé un paquet, et à chaque fois un petit détail n'allait pas:

  • Les lecteurs de flux dans un navigateur. Je pense à Kriss feed, tiny tiny RSS, FreshRSS... Mis à part Kriss, il faut disposer d'un serveur, configurer une application, la tenir à jour. Mais surtout, le gros défaut, c'est qu'il faut ouvrir un navigateur web pour en profiter. La plupart des lecteurs ne proposent pas non plus une vue sous forme de "river", comme on peut l'avoir avec l'outil Lagrange : liste par date des différentes entrées, en commençant par le splus récentes.
  • Les lecteurs de flux installés sur ordinateur. Je fais ici référence à Liferea (très lourd), Thunderbird ou encore le plus léger newsboat qui est très bien fait. Deux défauts majeurs sont à noter : c'est difficile de garder un historique des entrées déjà lues si on utilise plusieurs machines, et il faut avoir un accès à son ordinateur pour lire.
  • Lecteurs de flux par email : rss2email envoie les entrées par mail. C'est top, car les mails, on peut les lire depuis un navigateur (webmail), un smartphone, un client mail. De plus, c'est forcément synchronisé entre les appareils. Bref, c'est parfait, mais en python ^^. Le risque, c'est aussi de se retrouver avec des centaines de mails non lus car chaque entrée correspond à un email. Ça reste une excellente solution :)

Si je résume, voilà de quoi j'ai besoin pour lire mes flux :

  • Accessible de partout : via smartphone, un ordinateur public, un ordinateur au travail, une machine perso, peu importe l'OS et l'environnement.
  • Léger et rapide : c'est du texte avant tout à lire. Pas besoin d'effets spéciaux qui viendraient entraver la lecture.
  • Historique synchronisé entre les machines
  • Affichage des flux dont l'URL a changé. En effet, newsboat ne l'indique pas, et je me suis aperçu récemment que de nombreux flux suivis avaient disparu ou bien changé d'URL.

Après plusieurs essais de divers clients, j'en suis arrivé à une méthode qui me va bien : l'utilisation de sfeed.

sfeed

=> sfeed

Cet outils présente à mon avis des avantages importants, comme :

  • Écrit en C, rapide comme l'éclair et utilisable sans dépendances.
  • On peut exporter les nouvelles sous divers formats : html, texte plein, boîte mail. Et ça, c'est un vrai plus pour moi.

À l'heure actuelle, j'exporte quotidiennement les nouvelles entrées (des dernières 24h) au format texte que je laisse accessible via http, gemini, et que je m'envoie par email. Ainsi, cela répond à tous mes besoins.

Configuration

Voici ce que j'ai indiqué dans le fichier de configuration pour privilégier une commande déjà présente sur OpenBSD au lieu de curl :

fetch() {
  ftp -o - -r 15 -V -M -T "$2" 2>/dev/null
}

Utilisation de sfeed

Chaque jour, une tâche cron appelle le script suivant :

#!/bin/sh
out=/var/www/htdocs/si3t.ch/pub/newfeeds.txt
sfeed_update

sfeed_plain $HOME/.sfeed/feeds/* | grep "^N" | cut -d" " -f2- > $out

cat $out | mail -s "$(date +%F) - sfeed" prx@si3t.ch

Les nouvelles sont accessibles sur mon serveur et envoyées par mail.

La partie "grep ^N" me permet de ne récupérer que les nouveautés.

Dans le mail, toutes les nouvelles sont accessibles directement.

Je peux donc ouvrir un navigateur là :

=> /pub/newfeeds.txt

Ou bien récupérer ce fichier via ssh et le faire passer dans dmenu :

scp ledzep:/var/www/htdocs/si3t.ch/pub/newfeeds.txt /dev/stdout |\
	dmenu |\
	 awk '{print $(NF)}')

test -n "${url}" && $BROWSER "${url}"

Si j'ai choisi une entrée, l'article s'ouvre dans un navigateur

Je pourrais ajouter un export en html, mais je n'en ai pas besoin finalement grâce au mail.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-06-07-copy-tmux.txt

2021-06-07T21:07:51Z

<![CDATA[

J'utilise de plus en plus tmux. Alors que j'utilise dwm, qui me permet d'ouvrir et de gérer tout un tas de terminaux sans prise de tête, j'apprécie d'utiliser tmux car je peux le scripter et lancer tout un tas de trucs en arrière plan, fermer et ouvrir un terminal sans perdre ma session.

Mais il y a une fonctionnalité dont je n'avais pas pris la mesure : tmux permet de copier/coller du texte!

Ok, dit comme ça, ça ne semble pas révolutionnaire.

Cependant, c'est un véritable confort de ne pas avoir à aller chercher la souris pour copier/coller du texte.

C'est d'autant plus pratique que cela peut fonctionner sans session graphique!

En bref :

  • On appuie sur "Ctrl-b ["
  • On déplace le curseur puis on appuie sur espace pour débuter la sélection
  • Une fois fini, on appuie sur "y" pour copier
  • Pour coller, on appuie sur "Ctrl-]"

On peut copier une ligne sans avoir à la sélectionner, du curseur jusqu'à la fin avec "D".

Dans mon tmux.conf:

set -g mode-keys vi

Ça me donne bien envie de me faire une semaine 100% dans un tty. Il faut que j'essaie.

=> Code source de tmux

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-26-calendar.txt

2021-05-26T21:07:51Z

<![CDATA[

C'est notoire, je suis un étourdi. Il m'arrive d'avoir une chaussette à l'endroit, une autre à l'envers, ce qui horripile mon entourage (mais moi pas du tout bizarrement) :P.

En ce qui concerne les dates importantes, je prends comme exploit personnel les jours où je me souviens d'un anniversaire.

Du coup, je note tout. TOUT! J'ai des pense-bête toujours sur moi : un petit carnet dans la poche, c'est bien pratique.

Sauf que... Il faut que je pense à regarder le carnet ET que je sache quel jour on est. :D

Euh, faut t'inquiéter là prx, c'est Alzheimer précoce.

Alors d'abord, j'ai écrit "Alzheimer" de mémoire sans faute. Mais mon cerveau, c'est de la RAM. Ensuite, je retiens pleins de trucs vraiment utiles :

  • La couleur des yeux de ma chérie
  • Les histoires préférées de mon fils
  • Comment je m'appelle
  • La recette des crêpes
  • Les premières périodes du tableau périodique
  • Les 6 premières décimales de π
  • Un grand nombre de répliques de l'épisode "blink" de Dr Who
  • 6 premières décimales de π
  • Comment utiliser vi
gné gné gné, avec mon caldav Nextcloud et un client droid, j'ai des notifs pour tous les trucs importants, t'es trop naze".

Certes.

Mais j'aime les choses simples, que voulez-vous.

Et devoir installer tout un tas de trucs juste pour me souvenir de dates, ça ne me plaît pas. Aussi, j'étais ravi de découvrir la commande "calendar".

Ha ha, mais ça fait un bail que ça existe!

En effet, et c'est le genre d'outils que j'aurais bien aimé connaître plus tôt.

Cette commande regarde les évènements listés dans un fichier "$HOME/.calendar/calendar" puis affiche ceux à venir les prochains jours. C'est en plus très symple à sauvegarder et synchroniser sur plusieurs machines.

Du coup, une fois ce fichier rempli, il suffit de lancer la commande "calendar" chaque jour. Plusieurs possibilités s'offrent à nous :

  • Lancer "calendar -a" dans un crontab root, qui envoie le résultat par email
  • Ajouter une tâche cron "@daily" avec "calendar | mail -s prx@si3t.ch" sur mon serveur.
  • Ajouter la commande "calendar" à la fin de mon fichier .kshrc.
  • Lancer en début de session "notify-send "$(calendar)". C'est cette dernière solution que j'ai choisie pour l'instant.

Je trouve génial la façon dont le fichier contenant les dates peut être compris. On peut écrire les dates de différentes façons, et on peut même inclure des fichiers déjà présents sur le système. La syntaxe est la suivante :

 \t	

le "\t" est là pour indiqué qu'il faut utiliser une tabulation.

Le format du mois et des jours estr très souple. Je préfère garder un format chiffré pour m'y retrouver.

Des commentaires avec "/* ... */" et des "#include" peuvent être utilisés, comme si c'était du C. Pas besoin de réinventer des trucs qui marchent :)

Au final, ça me donne ça :

LANG=fr
#include 
#include 
#include 

/* MM dd\t description */
11 30   Anniv' arpi
04 18   Anniv Péhä
05 17   Anniv Starsheep
05 05   Anniv Vinishor
09 02   Anniv JB
08 *    Contrôle technique twingo

Voilà, je n'aurais plus d'excuses pour oublier l'anniversaire de Starsheep (coucou à tous les autres :))

Autant dire que cet outil va vite m'être indispensable.

Le manuel de "calendar" contient des exemples très utiles, comme d'hab :).

Edit

En fait, je n'utilise pas notify-send, mais un terminal. AVec "read", je peux fermer le terminal avec Entrée. J'ajoute l'option "-A 7" pour voir à l'avance d'une semaine.

xterm -e "echo 'à venir...\n---'; calendar -A 7; read a" &

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-21-lepen-vs-gandalf.txt

2021-05-21T21:07:51Z

<![CDATA[

Que vois-je au bout de ma rue sur le panneau d'affichage ? Des affiches pour le rassemblement national (ou front national, ou dynastie Le Pen). Le racisme ne fait donc plus honte à mon voisinage?

C'est indécent, des enfants passent à côté tous les jours!

Quelques minutes plus tard, il semble que quelqu'un, sans doute très beau et intelligent et crêpovore, a collé par dessus une petite image de Gandalf avec sa célèbre réplique "Vous ne passerez pas".

Ben quoi? C'est un panneau "affichage libre".

Ça change des petites moustache Hitlériennes que dessinaient les jeunes de ma commune d'enfance.

Quelques heures plus tard, je constate que des gens énervés ont carrément déchiré toutes les affiches. Toutes?

Non.

Une résiste encore :

=> Les affiches déchirées | Zoom sur le milieu

😃

Là, forcément, je me demande ce qui s'est passé dans la tête de ceux qui ont vu le Gandalf. Et ça me donne envie de sourire.

Bien à vous, frères et soeurs.

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-19-terraria-1-4-2-OpenBSD.txt

2021-05-19T21:07:51Z

<![CDATA[

Terraria est sorti en version finale il y a peu. J'ai voulu tester les nouveautés et me replonger dans cet univers d'exploration/construction/combat/pixelart que je trouve magique et reposant.

Ce jeu fonctionne très bien sous OpenBSD : il suffit d'installer le port "fnaify", un script qui se charge d'adapter les bibliothèques mono (et bien d'autres choses) pour fonctionner.

J'ai donc téléchargé la mise à jour à partir de mon compte sur GOG.com.

Cela me donne un fichier "terraria_v1_4_2_2_46510.sh".

D'après la documentation, il faut le décompresser avec unzip, puis lancer la commande "fnaify" dans le dossier contenant "FNA.dll" :

$ unzip terraria*.sh
[...]

$ find . -name FNA.dll
./data/noarch/game/FNA.dll

$ cd ./data/noarch/game
$ fnaifiy

Sauf que zut, j'ai un message d'erreur :

Performing setup (mode: n) ...

Could not find the following libraries:

            libnfd.so libnfd_gtk.so libnfd_zenity.so

Après avoir demandé sur #openbsd-gaming, brynet me conseille de simplement supprimer ces fichiers. C'est vrai que le message d'erreur n'est pas limpide à ce sujet...

En fait, ils se trouvent dans les dossiers "data/noarch/game/lib" et "data/noarch/game/lib64" et font doublon avec ceux déjà présents sur le système. On les supprime donc :

$ find data/noarch/game -name libnfd*.so -delete

Et on recommence.

Sauf que là encore, ça ne va pas : l'interface ne ressemble à rien. On devine un menu derrière des carrés...

=> /img/log/terraria144-bug.png

Quelle bonne surprise en voyant ce fil sur reddit que j'avais ouvert avant que Solène ne me fasse penser à IRC :

=> https://www.reddit.com/r/openbsd_gaming/comments/nf7z62/terraria_libnfdso_not_found/

ouais, je suis un boulet avec IRC. Je ne veux pas être tout le temps connecté dessus car c'est trop de distraction, mais du coup je manque des messages importants... Je ferais mieux de ne pas m'en servir.

Bref, thfrw a la solution :

$ fnaify /glprofile:es3

Cette fois, tout fonctionne comme prévu :)

=> /img/log/terraria144-ok.png

Merci ! :)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-11-unison.txt

2021-05-11T21:07:51Z

<![CDATA[

J'utilise principalement 2 ordinateurs :

  • Un PC fixe installée dans mon mini bureau à la maison. Il me sert à travailler et préparer mes cours au calme avec un casque anti bruits.
  • Un PC portable que je trimballe au boulot et sur lequel je travaille aussi le soir à la maison pour éviter de déranger ceux qui dorment.

J'ai besoin que le contenu de mes documents sur ces 2 ordinateurs soit identique.

Pour cela, j'ai jusqu'à présent utilisé 2 solutions qui marchaient très bien : syncthing et l'implémentation de rsync "openrsync". À chaque fois, mon serveur sert d'intermédiaire pour stocker les fichiers. En effet, ces 2 machines sont rarement allumées en même temps.

Toutefois, ils avaient chacun des défauts un peu gênants.

  • syncthing est un peu lourd. Il tourne toujours en arrière-plan. Je devais absolument penser à lancer la synchronisation avant d'éteindre mon ordinateur ou avant de commencer à travailler dessus pour être sûr d'être bien synchrone.
  • openrsync apporte l'avantage d'être installé de base sous OpenBSD. Je lançait la synchronisation avec une tâche cron au démarrage et via le script "/etc/rc.shutdown" à l'extinction. Il était toutefois un peu lent. Des soucis apparaissaient en cas de coupure de connexion au milieu d'un transfert. Le problème venait uniquement de mon script qui laissait un indice sur le serveur pour savoir quelle machine avait la dernière version des documents.

=> Solène a récemment publié un article sur les outils de synchronisation.

C'est elle qui m'a rappelé l'existence d'unison. Après relecture de sa description, il semblait tout à fait approprié pour répondre à mes besoins. Son seul défaut était de ne pas être présent de base sous OpenBSD. Toutefois, les avantages sont nombreux :

  • Il repose sur des technologies peu récentes et donc éprouvées. On évoquera ssh et l'algorithme rsync.
  • Il assure l'intégrité des données, laissant le soin de choisir si il y a un doute concernnat le fichier à supprimer
  • Il est très rapide pour repérer les changements. VRAIMENT rapide, rien à voir avec les 2 outils précédents.
  • Définir une liste de dossiers ou fichiers à synchroniser est très simple et contrairement à d'autres peut se faire de 2 façons différentes : syncrhoniser tout sauf des exceptions, ou bien synchroniser au cas par cas.

Je l'utilise pour synchroniser tous mes documents avec le profil suivant :

# Unison preferences
root = /home/prx
root = ssh://batman@ledzep/bckp/prx
sshargs = -C

# dirs
path=docs
path=bin
path=work
path=Maildir

# dots
path=.bookmarks
path=.config
path=.fceux
path=.fonts
path=.newsboat
path=.templates
path=.unison/prx_bckp.prf
path=.xsession

# ignores
ignore=Name .*~
ignore=Name *.tmp
ignore=Name *cache.db.lock

La liste est assez longue, et sera peut-être complétée petit à petit. Il y a des trucs pas vraiment utiles, car ils changent peu. Le tout pèse tout de même 44G.

Afin de m'assurer de récupérer les derniers changements lorsque j'allume ma machine, j'édite mon crontab avec la commande "crontab -e" pour y ajouter :

@reboot /home/prx/bin/xunison >/dev/null 2>&1

De même, lorsque j'éteins, je veux envoyer tous mes documents donc j'ai ajouté dans "/etc/rc.shutdown" ceci :

su prx /home/prx/bin/xunison

Cela lance le script "xunison" en tant qu'utilisateur "prx". On pourrait faire avec "doas" aussi.

Le contenu du script "xunison" lance la synchronisation. Cependant, elle le fait dans une session tmux de façon à l'afficher dans un terminal. Ça me permet d'avoir un oeil sur ce qu'il se passe, et résoudre les conflits s'il en apparaît un jour (je retirerai l'option "-batch" dans ce cas) :

#!/bin/sh
# display unison in a terminal
s="xunison"
export DISPLAY=:0

tmux has-session -t "$s" && exit

MAX=10
i=0

/usr/X11R6/bin/xwininfo -root > /dev/null
while [ $i -lt $MAX ]; do
        /usr/X11R6/bin/xwininfo -root > /dev/null && break
        sleep 1
        i=$(($i+1))
done
tmux new -s "$s" -d /usr/local/bin/unison -auto -batch prx_bckp
/usr/X11R6/bin/xterm -e tmux attach-session -t "$s"

En quelques secondes, la synchronisatoin est réalisée. C'est peu intrusif et économe en ressources.

Je vous invite à tester cet outil. Il y a même une version "no_x11" sous OpenBSD qui s'affranchit de l'interface graphique et pèse environ 6,3M.

=> syncthing | openrsync | unison

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-07-merci-jean-mi.txt

2021-05-07T21:07:51Z

<![CDATA[

Il y a un peu plus d'une semaine, le 23 avril plus exactement, le ministre de l'éducation nationale promettait des auto tests pour tous les enseignants du primaire.

Par ailleurs, tous les adultes, tous sans exception, chaque adulte travaillant à l'école primaire, aura dès la semaine prochaine deux autotests à sa disposition

=> Source

Dans son message aux personnels de l'éducation nationale, il promettait

Le protocole sanitaire établi dans les collèges et les lycées demeure. [...] Comme leurs collègues du premier degré, tous les personnels exerçant dans le second degré recevront deux autotests par semaine jusqu’à la fin de l’année scolaire.

=> Copie du mail sur l'archive gouv.fr | Copie du mail 2

À ce jour, vendredi 7 mai, en tant qu'enseignant dans le secondaire, je n'ai vu aucun autotest. Quand bien même cela pouvait me protéger.

Chaque jour, je fais classe à un total de 200 à 300 élèves. Je suis donc à proximité d'autant de foyers.

Je suis apparemment trop jeune pour accéder à un vaccin, mettant ainsi en péril ma santé ainsi que celle de mon entourage, nettement plus fragile.

Promesses non tenues? Mise en danger ?

Merci qui ?

Merci Jean-Mi !

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-06-emoji-slip.txt

2021-05-06T21:07:51Z

<![CDATA[

L'être humain est merveilleux.

Il naît dans la douleur.

Lutte pour se faire une place parmi les siens.

Fait face à des tempêtes, aux maladies.

Se fatigue pour subvenir à ses besoins qu'il se crée lui-même.

Retourne terre et ciel pour trouver l'âme soeur.

Repousse les limites de la connaissance et des possibles, toujours dans la crainte de sa mort inévitable.

Développe son intellect, de l'invention de la roue aux fusées, IRM, internet, chimie et vaccins.

Et pourtant, malgré tout, à un moment donné, quelqu'un s'est dit :

Hé, mais un émoji slip, c'est trop une bonne idée !

Autant je déteste la bêtise que j'adore la dérision.

Alors, voici un hommage à l'intelligence humaine : 🩲

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-01-recherche-gemini.txt

2021-05-01T21:07:51Z

<![CDATA[

J'ai éjouté un petit formulaire de recherche pour mon site.

Il ne dépend d'aucun service extérieur et permet de retrouver dans quel fichier se trouve le contenu souhaité.

=> Moteur de recherche sur mon site

C'est surtout une preuve que c'est faisable.

Il n'y a pas d'optimisation, et surtout pas de cache.

Vous l'aurez compris, j'ai pour objectif de faire la même chose en C (plus rapide et sécurisé).

En attendant, je vous pose le code là quand même, car c'est basé sur "grep" donc doit permettre (si on enlève l'option "-F") de faire des recherches par regex:

#!/bin/sh
# search engine in capsule
# prx 
# Licence MIT
# TODO : add cache

set -e

# CHANGEME
capsule_dir="../"
ext=".gmi"
msg="Search on si3t.ch:"
found="trouvé dans :"

if [ -z "${QUERY_STRING}" ]; then
	printf "10 $msg\r\n"
    exit
else
	s="$(printf "%s" "${QUERY_STRING}" | tr -cd '[:alnum:][:space:]_-')"
	printf "20 text/gemini\r\n"
    printf "# ${s} ${found}\n"
fi

# tr delete multiple spaces
# sed remove ":" after filename
# sed add "=> " for gemini link and replace leading "."

cd "${capsule_dir}"
find "." -type f  -name \*${ext} -exec grep -FiIsH "${s}" {} \; |\
    tr -s '[:space:]' |\
    sed -e 's/:/ /' -e 's/^\./=> /'

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-05-01-capsule-search-engine-c.txt

2021-05-01T21:07:51Z

<![CDATA[

EN

Need a search engine for you capsule?

I just wrote one in C.

=> See it in action | Source code

Edit config.h to suit your needs (yes, path are hardcoded to enjoy OpenBSD's unveil safety).

Run "make".

Copy to your capsule.

CGI support is required.

FR

J'en parlais juste avant, j'avais fait un moteur de recherche pour ma capsule gemini en utilisant grep :

=> /log/2021-05-01-recherche-gemini.gmi

J'évoquais l'envie de l'écrire en C. C'est chose faîte.

C'est fou ce qu'on code vite quand tout le monde dort à la maison.

Sieste <3.

Bref.

C'est nettement plus rapide qu'avec grep dans un script shell, comme vous vous en doutez.

Mais plus important, il profite du support de "pledge" et "unveil", ce qui me rassure en ce qui concerne un CGI.

Pour faire vite

=> Essayez le moteur de recherche | Code source

Des détails

La mise en oeuvre est la suivante :

  • Le dossier à scanner est modifié à la compilation. J'y tiens, je ne veux pas passer en argument un chemin vers un fichier ou dossier : trop de risque de donner accès au contenu de mon serveur.
  • Dès le début, on appelle "pledge" et "unveil" sur le dossier à scanner : on ne doit pas pouvoir en sortir.
  • On récupère la recherche dans la variable d'environnement "QUERY_STRING". Pas d'inquiétude à propos de son contenu comme avec un script shell qui pourrait lancer d'autres commandes sur mon système. Si la variable est vide, alors on envoie le code "10" pour que l'utilisateur entre sa recherche.
  • On scanne le dossier à la recherche de fichiers "gmi".
  • Si on trouve des sous-dossiers, on les scanne aussi.
  • On lit les fichiers "gmi" ligne par ligne et on appelle "strcasestr" pour faire des recherches insensible sà la casse.
  • On affiche un lien vers le fichier contenant la ligne avec le résultat de recherche.
Et si on a une recherche qui correspond à plusieurs lignes?

Impossible avec gemini : un paragraphe = 1 ligne de texte. Encore une raison d'apprécier ce protocole, c'est vraiment simple de développer pour ce dernier.

Imaginer en html tout ce qu'on auraît du faire : virer les tags "", dé-échapper les entités html "&", et j'en passe.

On pourrait imaginer appeler une fonction différente de "strcasestr" pour notre recherche.

Par exemple "fnmatch" pour profiter du globbing.

Ou encore "regexec" pour implémenter une recherche en regexp.

Je n'en ai pas besoin, mais si ça vous intéresse, vous pourrez facilement modifier le code ;)

Et maintenant ?

J'imagine qu'il serait pas mal d'implémenter un cache.

Créer dans un dossier "cache" des fichiers portant le même nom que la requête et contenant le résultat.

Avant de lancer une recherche, on regarde si ce fichier existe et si oui, on en retourne le contenu.

Ça suppose de vider le cache régulièrement. Dans un cron :

find /path/to/capsule/cgi-bin/cache/ -type f -mtime +2 -delete

Par ailleurs, ça veut dire ECRIRE dans un fichier sur le serveur, donc modifier les permissions pour "unveil" et "pledge", autrement dit réduire les conditions de sécurité. Pas envie ^^

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-04-30-gemini-man.txt

2021-04-30T21:07:51Z

<![CDATA[

FR

Besoin de lire une page man ? Facile avec le protocole gemini :

=> /cgi-bin/man

Pas de client gemini sous la main ? Utilisez netcat :

printf "gemini://si3t.ch/cgi-bin/man?afterboot\r\n" | nc -c si3t.ch 1965

Remplacez "afterboot" par la page souhaitée.

Besoin de lire une section précise?

=> apm(4) | apm(8)

EN

Need to read a manpage? Easy with gemini protocol:

=> /cgi-bin/man

No gemini client available? Use netcat:

printf "gemini://si3t.ch/cgi-bin/man?afterboot\r\n" | nc -c si3t.ch 1965

Replace "afterboot" with your query.

Need a specific section?

=> apm(4) | apm(8)

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-04-29-wormhole-experiment.txt

2021-04-29T21:07:51Z

<![CDATA[

Une équipe scientifique a découvert une nouvelle singularité reliant l'espace et le temps.

Wibbly wobbly, timey wimey.

Qui sait où cela mène?

Avez-vous le courage de passer à travers?

=> Traverser le trou de ver

Bonne route mes amis, puissions nous nous revoir sur l'un de ces mondes.

Explications

Cette expérience a pour but de relier des capsules gemini entre elles.

Je pourrais utiliser une liste des domaines existants.

Pour l'instant, je me contente de quelques sites triés sur le volet.

L'objectif est de pouvoir passer d'un site à l'autre, chacun contenant un lien vers un accès au wormhole.

Chacun peut héberger son propre wormhole : il s'agit d'un petit peu de C, ou d'un script shell pour ceux qui veulent.

Envie de participer ?

  • Ajoutez un lien vers un trou de ver sur votre capsule. Vous pouvez en héberger un, ou bien utiliser "gemini://si3t.ch/cgi-bin/wormhole".
  • Envoyez-moi un message, j'ajouterai votre capsule à ma liste.

Comment l'héberger?

Comme je le disais, c'est du C tout bête. Vraiment tout bête.

Il se contente d'extraire une ligne au hasard d'un fichier contenant des uri vers des capsules gemini.

Cet outil est censé s'exécuter comme cgi : il faut une redirection.

Après l'avoir compilé (pas de dépendances), il suffit de faire pointer un lien vers le script cgi. Il faut que votre serveur gemini supporte les cgi.

Il est tout à fait possible de remplacer le code C par un script shell :

sort -R ./stargates.txt | awk 'NR==1{print "30 " $1}'

Toutefois, j'ai imposé des restrictions avec pledge() et unveil() dans le code C si vous utilisez OpenBSD. Cela permet de s'assurer que seul le fichier contenant les uri peut-être lu, rien d'autre sur votre serveur.

Voici le lien vers le code source :

=> /code/wormhole.tgz

Une réaction?

=> Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-04-28-nethack-7.txt

2021-04-28T21:07:51Z

<![CDATA[

Hello prx, welcome to NetHack!  You are a neutral female gnomish Wizard.

Cool, me voilà incarnée en femme gnome. Vous allez voir mes poulets!

C'est chouette d'être une magicienne, je commence avec un parchemin d'identification bien pratique.

Je retrouve le sort "force bolt" très puissant, ainsi qu'une livre nommé "create monster". Reste à savoir si le monstre en question sera gentil.

Oh, j'ai aussi des anneaux que je vais m'empresser de porter :

  • anneau de régénération
  • anneau pour voir l'invisible.

Bon, je me promène, je vois un corps par terre : ça sent le piège. Je reste à côté plusieurs tous pour essayer de le détecter : rien. Je fouille donc le corps du malheureux et trouve une bougie... Mais en fait il y avait quand même un piège. Pas de rocher sur la tête cette fois, seulement le pied dans un piège à loup. Je me dégage rapidement.

Je trouve plus loin un sabre. Je me demande si c'est pas mieux de garder le bâton de mage quand même : j'aimerais bien savoir quels stats apportent un objet. En attendant, je vais équiper le sabre, ça doit faire un peu plus mal quand même.

Le niveau 1 se termine sans encombres sinon, je file au niveau 2 où je trouve un marchand : j'espère y trouver à manger, je commence à avoir faim moi. Ceci dit, avec 37 pièces d'or, je ne vais pas aller loin...

J'ai faim, je suis faible, et la nourriture chez le marchand est hors de prix : 360 pièces les 2 rations. Je me décide alors à manger la ration qui est dans mon inventaire :

Blecch!  Rotten food!  The world spins and goes dark.  You are conscious again.

Kouuuaaah? Ça peut être périmé en plus??? :s

Bon tant pis, je m'en vais, en espérant trouver une proie à manger...

Cependant...

You faint from lack of food.  You regain consciousness.

Ok, donc à priori là, je vais mourir... J'ai sans doute trop abusé du sort "force bolt".

Pas le choix, il faut faire appel à la superstition :

#pray
You begin praying to Thoth.  You are surrounded by a shimmering light.--More--
You finish your prayer.  You feel that Thoth is satisfied.  Your stomach feels content.

Woaaah, trop cool!

Par contre, j'ai maintenant le modifieur "Deaf". J'ai le ventre plein, mais je suis sourde :D

Heureusement, c'est temporaire.

Je continue d'explorer le niveau, et bien évidemment, dans la chambre suivante, je trouve 2 repas! Ironie du sort ^^

Plus loin, une armure de plates est sur le sol. C'est bien trop encombrant pour une magicienne comme moi : je file la vendre au marchand pour gagner 300 pièces. Ça me donne l'occasion d'acheter un des parchemins... Qui se révèle être un parchemin de téléportation maudit. Tant pis, j'aurais essayé.

Allez, assez du niveau 2, je file au 3e avec 301 pièces d'or, 24 points de vie et 3 XP.

Cependant, un oeil flottant me bloque alors que je termine d'explorer ce niveau.

Je m'en sors, mais trop de temps a passé. Mon ventre gronde, et la nourriture reste rare... Après 3 évanouissements, les forces me manquent, et la prière ne m'est plus utile. Adieu monde cruel!

Leçon numéro 7 : ne pas abuser des sorts quand on est mage et qu'on n'a pas de nourriture.

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      314 Au      |
                  |     died of      |
                  |    starvation    |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Wizard...

You starved in The Dungeons of Doom on dungeon level 3 with 735 points,
and 314 pieces of gold, after 2333 moves.
You were level 4 with a maximum of 33 hit points when you starved.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-04-28-archives-commentaires-reduites.txt

2021-04-28T21:07:51Z

<![CDATA[

Jusqu'à présent, je publiais les archives des commentaires à propos des articles avec l'aide d'hypermail.

Non content de ne publier qu'en html, qui plus est avec de jolis bugs pour les lettres accentuées, j'ai retroussé mes manches et commencé à écrire un "mailtotxt". L'idée était d'extraire le contenu pertinent d'un message pour l'écrire dans un fichier text/plain.

Au départ, j'ai pensé utiliser scribo, tout à fait adapté pour ça. Cependant, j'ai systématiquement des erreurs de segmentation.

=> scribo

N'ayant pas le niveau pour corriger ce souci, j'ai donc avancé petit à petit et codé ce dont j'avais besoin.

J'en étais arrivé à récupérer les entêtes et le corps du message et lisais les rfc2045 pour décoder les "quoted-printable" et "base64". Bien que ce soit nouveau, ça prenait forme.

Toutefois, Solène m'a alerté : elle trouvait son nom indexé en ligne, et ça l'embêtait un peu.

=> Solène

Je la comprends, en publiant un message sur la mailing-list, elle n'imaginait sans doute pas voir des données personnelles exposées ainsi.

J'ai choisi une liste de diffusion pour les commentaires car 3 points me paraissaient intéressants :

  • Le mail, tout le monde en a un.
  • Écrire un mail, ça demande plus de soin que de poster un message à la va-vite. Ça évite le contenu mal placé parfois désagréable.
  • La modération est aisée, et je peux profiter de l'antispam intégré à mon serveur plutôt que d'utiliser un put*%# de captcha ou autre dépendance.

Tous ces avantages ne devraient pas retenir quiconque de prendre la parole et de s'exprimer.

=> Safe & positive space

Cela a remis en question mon développement de "mailtotxt".

Je pourrais bien évidemment supprimer le nom de l'auteur pour ne conserver que l'adresse mail afin d'identifier l'auteur.

Sauf que...

Il est tout à fait possible que dans une réponse, quelqu'un cite le nom de la personne à laquelle il répond. Et ça, je ne peux pas le détecter.

J'aurais pu aussi ajouter des règles dans un fichier "robots.txt". Cependant, comment être certain que tous les crawlers le respecteront?

J'ai alors choisi de supprimer les archives mises en ligne.

Ces dernières restent accessibles à ceux qui sont inscrits à la liste en utilisant l'adresse mail "bla+get-N@bla.si3t.ch".

Pour restreindre cet accès aux inscrits avec mlmmj, il suffit d'ajouter un fichier "control/subonlyget".

Enfin, j'utilise toujours mlmmj pour supprimer les entêtes potentiellement compromettants en les listant dans un fichier "control/delheaders". Son contenu est actuellement:

Reply-To:
Received:
Message-ID:
User-Agent:
From:
Return-Path:

=> mlmmj TUNABLES

À ce propos, n'hésitez pas à me signaler des oublis que j'aurais pu faire.

Finalement, ces modifications seront peut-être un avantage.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | Mode d'emploi de la liste de diffusion pour recevoir les réponses.

]]>

https://si3t.ch/log/2021-04-26-pourquoi-dwm.txt

2021-04-26T21:07:51Z

<![CDATA[

J'ai récemment retravaillé ma documentation concernant dwm. J'y propose une configuration par défaut que j'espère être encore plus pratique.

=> visite guidée de dwm | dwm : le guide à la prx

(Oui, je pose des liens vers les fichiers gmi pour les utilisateurs de gemini. Les autres peuvent remplacer "gmi" par "html" ou bien lire le texte directement, c'est tout à fait lisible ;))

dwm est mon gestionnaire de fenêtres préféré depuis des années. Et pourtant, j'en ai essayé (fluxbox <3, i3, spectrwm, wmii, evilwm, openbox, pekwm, fvwm, twm, cwm, ...). À chaque fois, je reviens vers dwm car il répond davantage à mes besoins, et surtout, ne RAJOUTE PAS des problèmes.

Voici la liste non exhaustive des raisons pour lesquelles je préfère dwm :

  • Il est rapide. Vraiment très rapide! Niveau ressource, difficile de faire moins gourmand.
  • Il fonctionne bien. C'est simple, je n'ai jamais eu de bug en l'utilisant (oui, je te regarde cwm).
  • J'apprécie son style épuré qui évite trop de distraction. Malgré tout, les éléments visuels sont clairs et pratiques (carrés pleins ▪ ou ▫ pour indiquer la présence d'une fenêtre avec un tag, bordure de fenêtre qui va avec le titre affiché pour montrer la fenêtre active, tags actifs surlignés, tag avec fenêtre urgente en surbrillance).
  • Le système de tag justement : c'est brillant. Les espaces de travail, c'était cool, mais alors les tags, c'est encore mieux. Pouvoir coller des étiquettes aux fenêtres pour ensuite choisir d'afficher plusieurs étiquettes à la fois. cwm tente de reproduire ce schéma avec les groupes (mais cwm a des bugs gênants, surtout sur les raccourcis clavier). Les tags me permettent de passer d'une activité à l'autre sans avoir à chaque fois à réorganiser les fenêtres.
  • dwm est un outil, pas une contrainte : je n'ai jamais à redimensionner une fenêtre pour en voir le contenu ni à en déplacer une autre qui cacherait légèrement l'information importante de celle en-dessous.
  • Il n'y a pas d'espace inutilisé à l'écran : je n'ai pas un moniteur géant, ni plusieurs moniteurs. Chaque pixel a son importance.
  • Par défaut, l'utilisation du clavier est privilégiée. Je trouve ça pratique et rapide. Cependant, ce n'est pas du tout une limitation, on peut très bien utiliser la souris pour gérer les fenêtres. Les seuls ajout à faire c'est : clic-droit sur le titre pour fermer une fenêtre, scroll sur le titre pour changer la fenêtre active, clic-droit sur le status pour lancer un menu (jgmenu ou ddesktop ou xfce4-appfinder ou ...).

Si vous n'en avez pas encore eu l'occasion, je vous invite à tester de gestionnaire de fenêtres ;)

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-04-24-reponse-a-jmb.txt

2021-04-24T21:07:51Z

<![CDATA[

J'ai reçu un mail :

From: JEAN-MICHEL BLANQUER 
Date: Thu, 22 Apr 2021 21:37:33 +0200
Subject: [liste.epp] [Information] Rentrée du 26 avril

J'aimerais y répondre.

En cette fin des vacances scolaires communes à toute la France,

Vacances scolaire imposées, rappelons-le, puisque mes voisins s'inquiètent d'avoir eux aussi des vacances imposées par leur employeur. Comme quoi, c'est possible.

Je souhaite tout d’abord remercier chacune et chacun d’entre vous, qui avez montré un complet engagement pour offrir le meilleur enseignement possible à vos élèves dans les circonstances particulières que nous connaissons depuis plus d’un an.

Circonstances qui sont en majeure partie les conséquences de consignes gouvernementales.

Nous prenons cette décision en conscience : de nouvelles études scientifiques ont confirmé une moindre contagiosité des enfants et un risque faible qu’ils développent de formes graves.

Puisque j'apprends à mes élèves de citer leurs sources, j'aurais beaucoup apprécié pouvoir lire ces nouvelles études. C'est mon côté scientifique je suppose. On ne peut pas coller l'étiquette "scientifique" sans citer l'étude associée. C'est un "appel à l'autorité.

Voici un lien pour en savoir plus :

=> https://yourlogicalfallacyis.com/fr/appel-a-l-autorite

Et un exemple tiré du site ci-dessus :

Exemple : Incapable de défendre sa position selon laquelle l’évolution
n’est pas « vraie », Bob dit qu’il connaît un scientifique qui remet
également l’évolution en question (et qui ne se considère donc pas comme
un primate).
Je tiens d’ailleurs à signaler le travail important qui a été mené ces dernières semaines en lien avec les collectivités territoriales : il permettra notamment de déployer des capteurs de CO2 et des purificateurs d’air dans un grand nombre d’écoles et d’établissements scolaires.

C'est pratique maintenant qu'on peut ouvrir les fenêtres sans avoir des engelures. Ces équipements sont financés par les mairies (pour les écoles), qui n'ont pas toutes les mêmes moyens. Dommage.

Vous pourrez notamment conduire davantage d’activités ou faire cours en extérieur. Les classes en plein air sont bénéfiques sur le plan sanitaire, et elles le sont aussi sur le plan éducatif. À cet effet, des ressources seront mises à votre disposition.

Si je comprends bien, afin d'éviter de tomber malade (car je ne suis pas un enfant) ainsi que pour protéger nos élèves, vous me proposer de faire cours dehors?

Alors ça, il fallait y penser. Ça ne rigole plus dis donc, ça doit être vraiment très grave 300 à 400 morts par jour pour mettre de telles mesures en place.

Des autotests seront distribués à tous les personnels des écoles ainsi qu’aux ATSEM à compter du lundi 26 avril et jusqu’à la fin de l’année scolaire : ils pourront ainsi se tester deux fois par semaine.

C'est bien noté. Merci. Ça ne nous empêchera pas de tomber malade mais au moins de répandre ce virus.

Je fais le voeu que cette annonce soit effective et durable.

En effet, je ne peux m'empêcher de penser aux quelques masques fournis après les vacances d'hiver : après 1 lavage ils sont trop petits et entrent dans la bouche quand on parle. Ils sont censés me tenir jusqu'à la fin d'année scolaire. Aussi, je reste dubitatif.

Le recours aux tests salivaires montera progressivement en charge : de 400 000 tests dès la semaine prochaine, nous atteindrons les 600 000 tests réalisés,

Je ne suis pas sûr d'avoir bien compris. Les tests, c'est pour les élèves ou les personnels?

En fait, peu importe, 600 000 tests, c'est très largement insuffisant : nous sommes plus de 1 millions de personnels dans les établissements.

Cela permet à tester 2 fois comme promis 60% des personnels.

Donc on laisse passer entre les mailles du filets 4 personnes sur 10.

Et s'il s'agissait des écoliers (environ 6 700 000), c'est à peine 9% (je ne parle pas des collégiens, lycééens, aprentis...).

Notez que je cite mes sources :

=> https://www.education.gouv.fr/l-education-nationale-en-chiffres-2020-305457

Je sais quelles difficultés ont été rencontrées sur le plan de l’enseignement à distance par nombre d’entre vous lors de la semaine qui a précédé les vacances de printemps.

Il doit s'agit d'une référence à la désinformation concernant la mise en cause d'OVH qui n'y pouvait absolument rien ?

Nous avons travaillé avec les collectivités locales en charge des ENT pour qu’elles demandent à leurs opérateurs des garanties de robustesse de leurs systèmes informatiques.

Si vous avez demandé qu'ils demandent, alors ça doit être bon.

Pour l’outil "Ma classe à la maison", proposé par le CNED, le niveau de protection a été considérablement augmenté afin de garantir sa sécurité face aux attaques de déni de service ; ses capacités ont été développées et ses fonctionnalités, améliorées.

C'est rigolo, on dirait une pub pour un nouvel iphone.

Cette démarche, engagée depuis le week-end dernier, a ainsi permis que 15 000 personnels de plus de 55 ans soient déjà vaccinés.

Wouhou \o/

Nous sommes sauvés. 15000 personnels, c'est énorme, ça doit aller chercher au moins dans les 1,7% ! (Il y a 866500 enseignants d'après le lien sus-cité).

... 😒

Je vous réitère toute ma confiance.

C'est trop gentil.

Les élèves ont aussi confiance en leur professeur pour ne pas avoir à dire un jour :

Réveille toi Papa, le ministre a dit que ça pouvait pas être ma faute.

=> 20 parents d'élèves du lycée de Drancy décédés | https://web.archive.org/web/20210424204523/https://www.rtl.fr/actu/bien-etre/les-infos-de-5h-covid-20-parents-d-eleves-du-lycee-de-drancy-decedes-22-classes-ferment-7900013571 | https://archive.is/pGzij

[...] Facebook https://www.facebook.com/Education.Gouv/ [...]

Non merci.

Ressources

Voici des liens permettant de retrouver le mail d'origine en entier :

=> ./22042021-jmb.txt | https://ldif.education.gouv.fr/sympa/arcsearch_id/liste.information/2021-04/5359dc51-6292-549a-81ee-b6dfcc50a238%40education.gouv.fr

]]>

https://si3t.ch/log/2021-04-18-entetes-floc.txt

2021-04-18T21:07:51Z

<![CDATA[

Après avoir lu ceci :

=> Misinformation about Permissions Policy and FLoC

Je m'interroge sur la nécessité de gérer les entêtes, et je pense arrêter, pour au moins ces raisons :

  • Ça ajoute de la complexité à mon installation pour une finalité très limitée.
  • C'est mettre une rustine sur un problème puant dont je ne suis pas responsable : c'est Google qui a inventé ce truc nauséabond pour la vie privée.
  • Même si je configure mon serveur pour diffuser des entêtes censées améliorer la sécurité, rien n'oblige ne définitive les clients (navigateurs) de les respecter. J'ai de gros doute en la matière, surtout venant de chrome pour qui floc a déjà été inventé.
  • Mon serveur est là pour délivrer du contenu. La sécurité, c'est le boulot des devs dans ce cas, qui sont à priori à jour sur ces nouvelles, ce qui n'est pas forcément mon cas.
  • Mon site web est démuni de javascript. Il ne peut donc causer le moindre mal.

C'est d'ailleurs un conseil qui me paraît important de rappeler :

  • Désactivez le javascript par défaut! Pour ça, l'extension Noscript permet de mettre sur liste blanche les sites qui en auraient forcément besoin pour fonctionner. Ça prend 2 secondes. La navigation n'en est que plus rapide. J'ai découvert que Paypal fonctionne même mieux sans javascript : le captcha est plus facile à remplir.
  • Installez μblock origin qui bloquera des ressources extérieures.

Ou alors, vous utilisez lynx, un navigateur en mode texte.

Ou mieux, vous privilégiez gemini ou gopher quand c'est possible :)

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-04-15-ybad-to-si3t.txt

2021-04-15T21:07:51Z

<![CDATA[

J'avais réservé le domaine "si3t.ch" il y a quelques temps.

Puis, à deux reprises, mon adresse mail avec le domaine "ybad.name" m'a été refusée : sans doute parce que l'extension a 4 caractères.

J'ai toujours eu un souci avec le domaine ybad.name : à chaque fois, ça gratouillait quelque part. Ça ne me correspondait plus, sans trop savoir pourquoi. Alors, puisque c'est mon domaine, je fais ce que je veux, je décide de migrer mon site vers si3t.ch.

Qu'est-ce que ça change me direz-vous ? Pas grand chose :

  • Le flux ATOM est maintenant à https://si3t.ch/log/atom.xml
  • Mon adresse mail est prx@si3t.ch
  • La liste de diffusion est maintenant prx@si3t.ch.
  • L'ancien domaine reste actif jusqu'en 2023, ça laisse le temps de voir venir et permettra à tout le monde (moi compris) de ne rien oublier.

Concernant mon infrastructure, rien ne change :

  • ledzep : la machine à la maison qui héberge à peu près tout.
  • acdc : la machine chez openbsd.amsterdam qui me sert de backup mail et DNS ainsi que d'hébergement public pour gemini (gemini://gmi.si3t.ch).

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-04-12-si-je-disparais.txt

2021-04-12T21:07:51Z

<![CDATA[

Voici la question qui m'a traversé l'esprit en pleine nuit. Mais si, vous savez, juste après avoir rendormi mon fils, lorsque le sommeil ne veut plus de vous, ça cogite fort, et pas toujours de façon rassurante.

Je ne pense pas qu'il vaille la peine de former quelqu'un pour prendre la relève : mon serveur n'a rien d'ambitieux ni d'important.

Cependant, il contient des données que certains voudraient vouloir récupérer : des photos de famille et des sauvegardes.

En y réfléchissant, au lieu de donner le code root ou créer un compte spécial pour une personne de confiance, il y a encore plus simple : débrancher le disque et l'ouvrir sur une autre machine. Ainsi, seul la passphrase pour déchiffrer le disque est nécessaire.

Ce n'est pas à la porté de tous me direz-vous. En effet, mais pour l'instant, aucun de mes proches n'a les compétences de bidouiller le serveur. Je préfère donc rendre public les informations nécessaires pour contacter mes proches : ceux qui font cette démarche sont à priori des personnes rencontrées sur le web bien intentionnées dont j'ai déjà parlé à ma famille (arpinux, Starsheep, Trefix, Péhä, vinishor, Solène pour ne citer qu'elleux).

Voici donc ce qui va se passer désormais : si je ne me connecte pas sur mon serveur pendant un délai assez long (2 mois), un fichier apparaîtra ici :

=> canari.txt

Ce dernier contiendra tout le nécessaire pour contacter qui sera en mesure de donner la passphrase pour déchiffrer le disque du serveur. En voici un extrait :

Bonjour,

si vous lisez ce fichier, c'est probablement que je suis mort.
Ou bien pas très en forme.
On m'a sans doute forcé à prendre une surdose d'homéopathie.
Pire, on m'a privé de crêpes et mon corps n'a pas tenu le coup.

Plus sérieusement, ce message s'affiche automatiquement lorsque je n'ai pas accédé à mon serveur pendant 2 mois.

Si vous voulez prendre des nouvelles, vous pouvez contacter ma chérie au xxxxxxxx
(sauf si elle m'a accompagné sur Dune, ça capte mal là bas).
...

Le tout reste de savoir comment détecter si je ne me suis pas connecté récemment.

Mais tout est prévu d'avance : la commande "last" est faîte pour ça.

La suite, c'est un script qui compare des nombres (j'aime bien les dates à partir de l'Epoch pour ça :P) et qui copie le fichier contenant les informations au bon endroit.

#!/bin/sh
# check if user $1 has logged in since $2 seconds
# if not, a file $3 is copied to $4
# Add an entry in a cron task

set -e

usage()
{
	printf "%s    \n" "$0"
	printf "Example for a month\n"
	printf "%s batman 2592000 /var/canari /var/www/htdocs/canari.txt\n" "$0"
	exit 1
}

test $# -ne 4 && usage

u="$1"
delay="$2"
content="$3"
canari="$4"

now=$(date +%s)
lastlogin=$(last -s $u | awk 'NR==1 {print $4}')

if [ $(( $now - $lastlogin )) -gt $delay ]; then
	printf "$u not logged for a while, copying canari\n"
	install -m 555 $content $canari
fi

exit 0

Ce script est appelé quotidiennement via une tâche cron :

@daily /home/pi/bin/canari.sh utilisateur 5184000 /home/utilisateur/canari.txt /var/www/htdocs/si3t.ch/pub/canari.txt

Si jamais je devais me faire enlever par des aliens rouxphiles, vous aurez quand même de mes nouvelles :)

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-04-10-printemps.txt

2021-04-10T21:07:51Z

<![CDATA[

Bah alors, on ne te voit plus en ligne?

C'est le printemps les amis!

Quoi de mieux qu'un nouveau confinement pour profiter du Soleil et se consacrer à des projets laissés en plan?

Pour ma part, qui dit confinement dit 2 heures de route en moins chaque jour. Quelle joie de ne plus avoir à utiliser cet engin à roulette qui pue et fait du bruit.

Après un temps de préparation conséquent, j'ai pu mettre mes cours en ligne et programmer la publication des corrections. Ça a pris quelques soirées, mais finalement pour un prof, le télétravail c'est habituel.

Je tenais à publier en avance les cours et éviter d'imposer des visos : où est l'égalité des chances lorsqu'on demande à une famille où les parents télétravaillent avec plusieurs enfants téléscolarisés de mobiliser un ordinateur et une connexion internet pour l'un d'entre eux? Je préfère laisser chacun s'organiser comme il peux et tant pis pour les demandes de flicage de la hiérarchie.

Chaque soirée était donc consacrée à la réponse de mails et l'aide à donner aux élèves.

J'ai par la même occasion terminé le concours "Ma Petite Planète" avec mes élèves, et c'était vraiment chouette. Je recommencerai.

=> https://mapetiteplanete.org/

La journée était consacrée à l'entretient de la maison.

J'ai découvert comment monter une charpente avec mon père. Cela permettra d'avoir un abri pour stocker les outils de jardin et libérer une pièce-bordel dans la maison (je n'ai pas de garage). Couper du bois, taper avec le marteau, faire le singe sur la charpente : que du bonheur! Je suis tout de même content que ce chantier soit terminé : des douleurs dans le bras refusent de partir même quand je dors. Sans doute une tendinite, il faut faire avec.

Maintenant, c'est jardinage!

Après avoir laissé le jardin tranquille tout l'hiver sous un tas de feuille mortes et de "rouche" (des roseaux séchés qu'un paysan du coin a bien voulu me donner), la terre est nettement plus légères qu'avant. Ça reste dur et tassé : il s'agit de l'argile qui était sous la maison avant la construction. Encore quelques années de patience seront nécessaires pour avoir un beau jardin de papy.

En attendant, j'ai aéré un peu la terre : j'ai commecé avec une fourche, mais le mal de bras m'a convaincu d'aller acheter une "grelinette" ou "biofourche". Clairement, c'est les meilleurs 55€ dépensés depuis longtemps : j'ai fini en 30 minutes ce qui m'aurait pris des heurs, sans forcer! Je me dis que cet argent, c'est celui que j'aurais dépensé dans un plein d'essence si j'étais allé au travail pendant 2 semaines. (même plus, le gasoil, c'est cher).

Reste à étaler le compost et planter. Pas aujourd'hui, il pleut à plein temps.

À la place, ça sera assemblage de meubles : il faut aménager la chambre du grand pour pouvoir accueillir la petite :)

Et le code dans tout ça ?

C'est vrai que j'ai moins geeké ces temps-ci. Je n'ai pas trop envie, ni trop l'inspiration. À part un peu de CSS ci et là... Je vais bienôt recommencer à bricoler isotop. J'ai envie aussi de faire ce logiciel de messagerie instantanée en C basé sur le mail, mais l'absence de lib pour faire de l'IMAP de façon pratique me freine.

À la place, je préfère lire.

J'ai entre les mains "Carbone et Silicium", et c'est un régal. J'avais adoré Shangri-La. Le dernier tome de Mathieu Bablet est encore plus gros, avec une note grpahique proconcée et des idées qui secouent l'intérieur.

=> /img/mathieu-bablet-carbone-silicium.png

Je m'endors en relisant du David Gemmel : des idéaux simples et sains, ça fait du bien.

Parfois, il me reste de l'énergie pour regarder une série. Pas beaucoup. Du coup, les épisodes de 20 minutes de "Breeders" sont parfaits pour le jeune papa que je suis : aussi émouvants que drôles.

=> Fiche Breeders sur allociné

Désolé pour toutes les personnes qui souffrent du confinement dans un petit appartement. Je vous souhaite beaucoup de courage. Pour ma part, j'ai la chance d'avoir chez moi tout ce qui fait de moi un homme heureux : un fils qui grandit bien, une chérie aussi intelligente que déterminée, des livres, du bois, un carré de terre, un pc sous OpenBSD et de quoi faire des crèpes (et de la bière aussi :P).

Que le Soleil brille fort chez vous!

À bientôt!

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-04-07-nethack-6.txt

2021-04-07T21:07:51Z

<![CDATA[

Aloha prx, welcome to NetHack! You are a neutral female human Tourist.

Ce coup-ci, j'attrappe mon appareil photo d'athée, et c'est parti pour l'aventure accompagnée de mon fidèe petit minou et mon t-shirt hawaïen :)

Mon inventaire contient

Coins
$ - 836 gold pieces
Weapons
a - 38 +2 darts (at the ready)
Armor
k - an uncursed +0 Hawaiian shirt (being worn)
Comestibles
b - 2 uncursed apples
c - 5 uncursed food rations
d - an uncursed pancake
e - an uncursed slime mold
f - an uncursed lembas wafer
g - an uncursed tin of lichen
Scrolls
i - a blessed scroll of magic mapping
j - 3 uncursed scrolls of magic mapping
Potions
h - 2 uncursed potions of extra healing
Tools
l - an expensive camera (0:95)
m - an uncursed credit card
n - an uncursed towel

Je suis blindée aux as... Mais dis donc... Que vois-je ?

c - an uncursed pancake

Donc, logiquement, dans nethack, on peut trouver... des CRÊPES MAUDITES??? XD

J'ai aussi une serviette, il faut toujours en avoir une sur soi (à quoi ça va bien pouvoir me servir...? N'allez pas lire le wiki, la serviette mouillée en tant qu'arme m'a trop fait marrer :)).

Il y a un gobelin à côté, l'occasion de tester mon appareil photo:

The goblin is blinded by the flash!

             ------------
             |....o..@..|
             |.......+..|
             --------f---

Je me disais bien que ça pourrait faire un truc de ce genre. Et maintenant, je m'enfuis? Mais il pourra toujours me rattrapper plus tard... Je crois que je vais taper dessus un petit peu pour voir.

Enfin pas taper, délicatement lui jeter des fléchettes à la figure pour soigner ses yeux.

You kill the goblin!

Qu'on se le dise, 'faut pas faire chier les touristes! Une femme a le droit de marcher dans un donjon tranquille!

Bon le premier niveau se passe bien. Je trouve un peu d'équippement, dont une hache et un sac.

Au niveau 2, tout semble indiquer qu'il y a un magasin quelque part :

You hear the chime of a cash register.

Après pas mal de recherche, je le trouve caché dans un coin :

       ---
       |(%
       |%).      -----                                               ------
       |!@.|    #....|                                              #.<...|
       |?(.@f   #|....#                    ----------------         #|....|
       -----#   #|...|####                 |..............|         #|....|
            #   #-----#  #                #-...............##########|....|
            #   ####  #  #              ###|..............|          ------
          ###      #  #  ##             #  ------|---------
          #--------#  #   #             #        #
          #-......|#  ##  #####         #      ###
           |.......#   #      #####   ###      #
           |......|    #          #####        #
           |......|    #-------   #  #       ###        --------
           |......|    #|.....|   #  #-------|- ########........##     -------
           --------    #-.....-####  #|..`.....##       |......| #     |.....|
                        |.....|      #......>.|#########.......| #     |.....|
                        |.....|       |........#        -------- ######.....{|
                        -------       ---------#                       -------

Prx the Rambler                St:14 Dx:9 Co:18 In:13 Wi:8 Ch:13 Neutral
Dlvl:2 $:858 HP:10(10) Pw:2(2) AC:9 Xp:1

Je découvre en faisant mes achats qu'acheter un parchemin ne permet pas de l'identifier.. Zut!

Je teste quand même mes nouveaux parchemins : j'ai nettoyé le niveau, il ne devrait rien m'arriver de trop grave. Je tombe sur un parchemin d'identification, et je découvre que ça identifie TOUT ce que je porte (pas comme dans DCSS).

J'ai un parchemin de génocide du coup.. Ça semble assez violent oO.

Pour le coup, j'ai une lampe magique bénie! Ça semble bien cool ce truc! Apparemment, il faut utiliser la commande "#rub" pour en profiter.

You now wield a blessed magic lamp.  In a cloud of smoke, a djinni emerges!
The djinni speaks.  "I am in your debt.  I will grant one wish!"  You may wish for an object.
For what do you wish?

Ok, donc là, il ne faut pas me planter. Qu'est-ce que je peux bien demander? Il faut écrire le nom de l'object exact, ou bien juste "weapon" pour une arme? Du coup je lis un peu le wiki (non c'est pas bien...) et obtient une armure en écailles de dragon.

Allez, zou, niveau suivant!

Devant une porte, on me dit :

Something is written here in the dust.  You read: "Closed for inventory".

Ça semble une mauvaise idée de défoncer la porte.

...

WHAMMM!!!

"Minx!  You did 400 zorkmids worth of damage!"  Pay? [yn] (n)

Je me disais bien aussi, mais je n'ai pas résisté.

Et évidemment, je me fais tuer par le marchand ultra bien équippé...

Pas très malin je suis.

Leçon n°6 : ne pas déranger les marchands, ou au moins accepter de les payer.

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |       0 Au       |
                  | killed by a wand |
                  |                  |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Aloha prx the Tourist...

You died in The Dungeons of Doom on dungeon level 3 with 188 points,
and 0 pieces of gold, after 1274 moves.
You were level 1 with a maximum of 10 hit points when you died.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-30-nethack-5.txt

2021-03-30T21:07:51Z

<![CDATA[

Hello prx, welcome to NetHack!  You are a neutral gnomish Cavewoman.

Mon portrait tout craché :)

J'ai une fronde et une massue, ça va être rigolo.

Be careful!  New moon tonight.

Oh, ça veut dire quoi exactement? J'ai comme l'impression que le jeu me menace :s

Ceci dit, le premier niveau se passe bien. J'ai la bonne surprise de voir que la frond est très rapide, je peux envoyer 2 pierres d'un coup. Mon chien est un allié particulièrement fort.

J'ai trouvé une lampe à ce niveau, ça permet d'y voir plus loin (et certainement d'être plus visible aussi, donc je reste prudent).

Un boulet me barre le chemin, et un couloir semble être un cul de sac (j'ai beau chercher un passage, rien).

Le niveau 1 se termine ainsi :

                   -------
 -----------      #-.....|
 |.........|      #|......####
 |.........|  #####|...%.|                  -----
 ---.-------  #    |.....|                  |d.@|
    ##        #    |......##########`       |...|
     #        #    --.----          ##### ##....|
     ##       #      #                  ### |...|
    --|-------#      #                   ## |...|
    |.........#     ##                    # -----
    |........|      ######               ##
    |........|     -.----#############################
    ----------     |.<...########-----         ------.-           -----
                   |....|     ###....|      ###-......|   ########....|
                   |....|   ###  |...| ######  |.......####       |...|
                   |....|  ##    |...-##       |......|           |...|
                   |.....###     -----         --------           -----
                   ------


Prx the Troglodyte             St:16 Dx:15 Co:17 In:9 Wi:11 Ch:7 Neutral
Dlvl:1 $:7 HP:15(15) Pw:3(3) AC:8 Xp:1

On descend!

Au 2eme niveau, je trouve une pièce avec un boulet au milieu, et un peu plus loin une lance. Je file chercher la lance, mais je jure aussitôt après ma stupidité : c'était un piège!

Je me prends le boulet sur la tête et tombe à 4/15 HP. Par contre, mon chien n'y survit pas, et ça me rend très triste :/.

Bon, je file prendre la lance quand même, ça sera plus stylé que le gourdin.

The spear welds itself to your hand!

Oups, c'était une lance maudite...

Je continue d'explorer, et trouve un parchemin. J'espère très fort que ça soit un sort pour enlever les malédictions :

As you read the scroll, it disappears.  Your armor turns to dust and falls to the floor!

Ah ben non... De quoi faire un strip tease stylé!

Bon, je me console, il vaut mieux le savoir maintenant que de perdre une armure enchantée plus tard.

Sauf que ça ne durera pas longtemps, car je me trouve acculé de tritons qui me grignottent. Je suis venu à bout de tous les autres avant en quelques tours. Malgré tout, le dernier a ma peau, mes HP tombent brutalement.

Leçon n°5 : les tritons, ça craint sans armure.

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      22 Au       |
                  | killed by a newt |
                  |                  |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Cavewoman...

You died in The Dungeons of Doom on dungeon level 2 with 140 points,
and 22 pieces of gold, after 1326 moves.
You were level 1 with a maximum of 15 hit points when you died.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-24-nethack-4.txt

2021-03-24T21:07:51Z

<![CDATA[

Hello prx, welcome to NetHack!  You are a chaotic female elven Wizard.

Hum, ça promet d'être intéressant, être une mage chaotique :)

Je connais 2 sorts, un pour attaquer, un pour retirer les malédictions des objets.

De plus, j'ai déjà plusieurs parchemins identifiés et 3 potions. J'ai d'ailleurs une potion pour devenir aveugle : la boire parait stupide : il faut l'envoyer sur un ennemi ?

J'ai même un... cor d'harmonie??? XD

Tiens, je vais tenter d'en jouer :

You start playing your tooled horn.  You produce a frightful, grave sound.
The kitten turns to flee.

Ha ha, mon petit chaton est effrayé!

Sérieux, si en jouant de la musique je peux faire fuir les autres créatures, ça serait très drôle!

Bon, en attendant, les portes fermés, je ne peux pas les défoncer à coups de pied, mais mon sortilège "force bolt" fait l'affaire :)

Je peux même casser les gros boulets pour passer :)

Bon par contre, il vient de se passer un truc au niveau 2, je n'ai pas compris : d'un coup, j'ai gagné un niveau, sans tuer personne ??

You swap places with your kitten.
You feel wise!  You must have been very observant.  You feel tough!
You must have been leading a healthy life-style.

Après, je ne dis pas non :)

Ah non, j'ai juste gagné des stats, mais pas de niveau, puisqu'après :

The spell hits the goblin!  You kill the goblin!  Welcome to experience level 2.

Je suppose donc que c'était le moment de choisir quelle capacité améliorer avec #enhance (en fait non).

La promenade continue, mon sort "force bolt" est très puissant. Voici le second étage :

 -----------
 |..........########                                   ^
 |.........|       ######---------------           ----.----------
 |...>.....|            #|.............|           |.............|
 |..........#           #|.............|           |..........f..@#
 |.........|#           #............%.|           |.............|#
 -----------#           #|.............|           ----.----------
            #           #----|-.--------               ##
            #           ##%##################           #
            #            #        #         ###############
            #            #        ##           ----------.-
            #            ##        ######   ###-..........|
            ##            #          ---.--    |..........|
             ##           #          |...<+####-..........|
              ###         #          |....|    ------------
                #---------#          |....|
                #|.......|#          ------
                #.........#
                 ---------

Prx the Evoker                 St:11 Dx:15 Co:13 In:18 Wi:9 Ch:11 Chaotic
Dlvl:2 $:12 HP:15(15) Pw:20(23) AC:8 Xp:2

Cependant, je commence à avoir faim... Très faim...

Pas le choix, je dois manger. Il y a quelques cadavres à un endroit...

Forcément qu'il y a des cadavres à ici, c'est en fait un piège : je me prends un gros rocher sur la tronche. Heureusement, j'avais enfilé un casque...

Je tente de manger un cadavre, je n'ai rien d'autre...

Beurk, c'est avarié. Ça me rend malade du coup, et je ne suis pas rassasié.

2 tours plus tard, je suis toujours malade, et je m'évanouis à cause de la faim...

Et devinez quoi? Je meurs XD

Leçon n°4 : un tas de cadavres, c'est sûrement un piège.

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      12 Au       |
                  |  poisoned by a   |
                  |  rotted jackal   |
                  |      corpse      |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Wizard...

You were poisoned in The Dungeons of Doom on dungeon level 2 with 201 points,
and 12 pieces of gold, after 1152 moves.
You were level 2 with a maximum of 15 hit points when you were poisoned.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-22-cadeau-de-temps.txt

2021-03-22T21:07:51Z

<![CDATA[

Ce soir, je n'ai pas dit "au-revoir" à mes collègues.

Ce soir, après avoir enchaîné 4h de cours sans pause à cause des récrés en décalé pour cause de protocole sanitaire, mangé en 20 minutes un plat froid, puis de nouveau 3h de cours, je ne suis pas resté dire quelques mots aux enfants.

Ce soir, j'ai rapidement rassemblé mes affaires dans le brouhaha de l'établissement scolaire et suis parti comme un voleur.

Ce soir, j'ai savouré le calme relatif de l'habitacle de ma voiture pendant à peine une heure, me laissant bercer par le ronronnement du diesel.

Ce soir, je n'ai pas foncé faire les courses, ni cherché à optimiser les minutes pour faire un peu de sport avant d'aller récupérer mon fils.

Ce soir, j'ai ouvert la porte et me suis caché à la maison, me suis empressé de mettre un café à chauffer.

Ce soir, je me suis assis 15 minutes à la table à manger, et j'ai ouvert un livre.

Ce soir, pendant 15 minutes, j'ai lu dans un silence complet, souligné par le tic tac de l'horloge et l'appétit vorace de mon chat qui fouille dans sa gamelle.

15 minutes plongé dans un autre univers.

15 minutes sans stress ni pression hiérarchique.

15 minutes sans obligations.

15 minutes à l'arôme caféiné, assis.

15 minutes pendant lesquelles, je me suis offert le luxe du temps.

15 minutes hors du temps.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-18.txt

2021-03-18T21:07:51Z

<![CDATA[

Allez, c'est reparti!

Konnichi wa prx, welcome to NetHack!  You are a lawful male human Samurai.

Dans ce niveau, il y a de nombreuses portes cachées. Je prends du temps à chercher avec "s", mais finalement termine d'explorer ce niveau sans trop d'encombres. Mon chien croque les ennemis et m'apporte beaucoup d'aide.

J'ai trouvé un casque d'orc, ça couvrira mieux ma tête que rien du tout.

Un piège a déclenché une pluie de rochers sur ma tête. J'ai bien fait de porter un casque. Je survis ^^. En cadeau, il y avait un sifflet.

Oh, j'ai vu une bouche d'égouts aussi, je ne sais pas trop quoi en faire alors je passe.

Voici à quoi ressemble le premier niveau :

                                                                    ----------
                                                                    |........|
                                                                    |........|
 ------                                        --------           ##.........|
 |..`..########################################.......|           # ----.-----
 |....|                                      # |......|           #     #
 |....|                                      # |.......#         ##     #
 |.....#                ----------------     # |......|#         #      #
 |....|#                |..............|    ## ----.---#         #      #
 |....|###           ###-.*............-#   #      #   #         #      #
 ------  ##         ##  |..............|#          #   ##  ------#      #
          #        ##   |..............|#          #    ###|..#.|#      ###
          ##       #    ----------.-----#######    #      #|..>.|#     ---.--
           # ------#              ########   -|----|----  #|..@.|#     |....|
           # |....|#                     ####|.........|  #|.....#     |....|
           # |.....#                        #..........|  #-....|      |....|
           # |....|                          |.........|   |....|      |^.<.|
           ##-....-#####                     -----------   ------      |....|
             ------                                                    ------

Prx the Hatamoto               St:14 Dx:18 Co:18 In:9 Wi:8 Ch:8 Lawful
Dlvl:1 $:8 HP:15(15) Pw:2(2) AC:3 Xp:1

C'est parti pour le niveau 2.

Il semble que mon chien ne m'ait pas suivi. Et j'ai beau remonter à l'étage au-dessus, je ne le trouve pas. J'ai même tenté d'utiliser le sifflet trouvé un peu plus tôt, mais la pauvre bête semble perdue :/

Au cours de l'exploration, je commence à avoir faim. Je porte une portion de tripes, alors j'en mange un bout : apparemment c'est très mauvais.

C'est tellement mauvais que pendant plusieurs tours, je suis confus et délire un peu : les tripes, ça rend malade. Heuresement, ça finit pas passer, personne n'est venu m'attaquer pendant ma crise de vomi.

Un renard m'attaque, mais je ne me laisse pas faire : tiens, prends ça espèce de sale roux! (j'ai une barbe rousse dans la vraie vie, alors je suis bien placé pour savoir que les roux ça peut être tenace. N'y voyez aucun roucisme :D).

Et là, oh joie :

You kill the fox!  Welcome to experience level 2.

L'ancien moi qui perdait dans la 1ere salle du donjon se sent tout fier :)

Plus loin, je me retrouve coincé dans un piège à ours :s

#untrap
You cannot deal with the bear trap while trapped in it!

Euh, ok, je fais comment alors ?

Je tente de me déplacer encore et encore, et finalement :

You are caught in a bear trap.  You finally wriggle free.

Ouf!

Niveau 2 fini!


  -----       ------------      -----------
  |....#######|..........|      |.........-#
  |...|      #|..........|      |<........|#       ---------
  |...|      #............#     |..........#       |.......|
  -|---       ---------.--#     |.........|#       |.......|
   ##              #####  #     |.........-####    |.......|
    #             ##      #     -----.-----#  #####........|
    #             #       #         ##     ##`     |.......|     -----------
    #             #       #         #      ###     --.------     |.........|
    #            ##       #         #       ####     ##         #-.....@...|
    #       ######        #      ####        # #      #       ###|......>..|
   -.-------.-----        #      #           #####    #       #  -----------
   |.............|        ########             # #    ###     #
   |.............|        #----------------    ###  ----.-    #
   |..............#########|..............|      ###-.....#####
   |.............|        #|..............|      ###|^...|
   |.............|        #...............|        #|....|
   ---------------         |..............|         ------
                           ----------------

Prx the Hatamoto               St:14 Dx:18 Co:18 In:9 Wi:8 Ch:8 Lawful
Dlvl:2 $:17 HP:22(22) Pw:6(6) AC:3 Xp:2

Je peux aller au niveau 3.

Cependant, quelque chose me titille : j'ai récupéré une potion et une baguette magique... Je tente ou pas? La dernière fois, je suis mort en testant un parchemin, je vais éviter pour l'instant...

Au niveau 3, je découvre mon premier petit commerce

 ------
 |....|     ------------
 |....|     |.?()]?!=?*|
 |.<..-###  |.[=?(?%!!)|
 ------  #  |.?)!%!%!%)|
         ###|@/%%(%%!%[|
           #-@!!!)(![%?|
            ------------

J'ai 17 pièces d'or, je me demande quoi acheter...

Déjà, je désactive l'autopickup (@) pour éviter d'avoir des dettes impayables et ne pas pouvoir partir.

je me déplace dans le magasin, les prix apparaissent quand je suis sur un objet. Quand soudain, un mimic m'attaque et frappe aussitôt :

Wait!  That's a giant mimic!  The giant mimic hits!  The giant mimic hits!


                                                 ------
                                                 |....|     ------------
                                                 |....|     |.?(@m?!=?*|
                                                 |.<..-###  |.[=?(?%!!)|
                                                 ------  #  |.?)!%!%!%)|
                                                         ###|./%%(%%!%[|
                                                           #-@!!!)(![%?|
                                                            ------------











Prx the Hatamoto               St:14 Dx:18 Co:18 In:9 Wi:8 Ch:8 Lawful
Dlvl:3 $:17 HP:1(22) Pw:6(6) AC:3 Xp:2

Il ne me reste plus qu'1HP... Que faire? Boire une potion non identifiée? C'est très risqué.

Tenter d'écrire "Elbereth" sur le sol? Si j'en ai le temps...

Avant, je vais bêtement tenter de m'échapper...

You cannot escape from the giant mimic!

Bon, c'est clair au moins... Reste donc "Elbereth".

C'est sans effet... Ça a marché au moins? Je tente de réécrire avec le doigt (j'avais écrit avec une gemme).

What do you want to write in the dust here? Elbereth
The giant mimic hits!
You die...  Adjama gratefully inherits all your possessions.

Et m*%#

Leçon n°3 : faire gaffe aux mimics "]" dans les magasins et ne pas s'en approcher.

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      17 Au       |
                  |   killed by a    |
                  |   giant mimic    |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Sayonara prx the Samurai...

You died in The Dungeons of Doom on dungeon level 3 with 224 points,
and 17 pieces of gold, after 1142 moves.
You were level 2 with a maximum of 22 hit points when you died.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-13.txt

2021-03-13T21:07:51Z

<![CDATA[

Pour information, j'ai supprimé pas mal de compte mail hier. Sont concernés tous les comptes qui ne se sont pas connectés depuis mai 2020, soit presque 1 an.

Résultat des courses : il reste 76 comptes actifs.

J'en profite pour annoncer le renouvellement pour 2 ans des domaines "3hg.fr" et "ouaf.xyz" :)

]]>

https://si3t.ch/log/2021-03-12.txt

2021-03-12T21:07:51Z

<![CDATA[Solène a encore eu une idée de génie : blacklister tous les petits malins qui tenteraient un accès sur des ports de toute façon inutilisés. Ces derniers sont certainement des bots à la recherche de failles. Ça s'appelle iblock, le code est très court ce qui assure son bon fonctionnement et sa sécurité. C'est le démon inetd qui se charge de gérer les connexions. Ainsi, aucune inquiétude d'avoir écrit un daemon foireux : inetd est éprouvé.

=> iblock.

Je me suis amusé à participer un peu au code pour y ajouter le support de l'ipv6 notamment, et doas pour l'instant sur ma version locale.

Ça donne quoi ?

Je bloque toutes les tentatives sur les ports 21 (ftp) et 23 (telnet), deux services inutilisés sur mon serveur, ainsi que quelques autres :

"{ ftp telnet gopher finger sunrpc epmap netbios-ns netbios-dgm netbios-ssn microsoft-ds ipp ldaps ldp ms-sql-s ms-sql-m pptp mysql postgresql rfb rdp 27019 }"

Ou l'équivalent avec les nombres :

"{ 21 23 70 79 111 135 137:139 445 631 636 646 1433:1434 1723 3306 5432 5900 5432 3389 27019 }"

Ces dernières 24h, 2511 IP ont été blacklistées. oO

Bien que mon serveur soit accessible en ipv6, seules des ipv4 ont été repérées, comme si les vilains préféraient.

C'est dire si c'est efficace, je ne m'attendais pas à tant :)

Nettoyage régulier

L'installation est très simple. J'y ai ajouté un petit détail.

Pour éviter que la table ne soit trop remplie, et puisqu'après tout une IP peut redevenir gentille un jour, pensez à retirer les IP vieilles de plus de 24h (ou plus). J'ai ajouté ceci dans "/etc/daily.local":

/sbin/pfctl -t evils -T expire 86400

Server-vous :)

Histoire d'en faire profiter un maximum de monde, je mets à votre disposition les IP malveillantes. La liste est mise à jour quotidiennement, n'hésitez pas à vous servir (prx.brutes):

=> /evils/

Essayez!

Je vous invite à mettre en place un tel service sur votre serveur, ç ane peut qu'en alléger la charge puisqu'une fois sur liste noire, les IP ne peuvent plus rien tenter chez vous.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-11.txt

2021-03-11T21:07:51Z

<![CDATA[

La dernière fois, je suis mort dans la première pièce, du premier niveau, sans jamais me battre.

Je ne dois pas pouvoir faire pire pendant une nouvelle partie :)

Comme avant, je laisse le jeu choisir une race, un rôle, un genre et un alignement pour moi.

Hello prx, welcome to NetHack!  You are a chaotic male orcish Rogue.
       -------
       ..dd..|       ...
       |.@$...
       |.....|
       -------



Prx the Footpad                St:16 Dx:18 Co:10 In:11 Wi:12 Ch:6 Chaotic
Dlvl:1 $:0 HP:11(11) Pw:2(2) AC:7 Xp:1

Hum, un orc Rogue... Si je comprends bien, je suis un gros bourrin censé être discret? Au moins, j'ai des connaissances sur les pièges et poisons et doit savoir forcer une serrure.

J'ai à mes côtés un petit chien apprivoisé, un renard et de l'or.

You kill the fox!  The little dog eats a fox corpse.

Ça, c'est fait.

Une araignée est apparue à droite. Allons voir dans ce couloir.

Mon chien a tué la bestiole.

Dans la nouvelle pièce, je découvre un autel chaotique et une fontaine. Je vais tenter de voir ce qu'on peut faire avec ces objets.

Après m'être placé sur la fontaine et avoir appuyé sur "q" pour boire :

The water is contaminated!  Perhaps it is runoff from the nearby slime mold farm.

Bravo mon gars, t'as perdu 3 points de vie...

Bon, je tente d'aller prier sur l'autel, après tout, je suis un orc chaotique

You begin praying to Kos.  You finish your prayer.  You feel that Kos is displeased

Quelle bonne idée j'ai eu...

Bon tant pis, continuons d'explorer.

Après avoir tué quelques monstres, bien aidé par mon chien, il semble que j'aie terminé d'explorer ce niveau. J'ai trouvé un escalier pour descendre ">". Cependant, certains couloirs sont des culs de sac. Normal?

                   -------                   ------------
                   |......#                  |..........|
                   |.....|##                 |..........-#
                  #-.^...| #                 |..........|#            --------
                  #|......####   ############-..........|#            @d.....|
                  #--.-|-- ##                -------.----#            |......|
                ###  #####  ##                    ###    #            |......|
                #    #  #### #                    #      #            |...>..|
                #    #   ######                   #      #           #.......|
               ##    ##       #               #####      #           #--------
               #      #   #                   #          ###         ###
               #     -.---|----         ############       ##          #
       ------- #     |....._..|    ----------.-----#        ##         #
       ......|#######.........|   #|..............|##############      #
       |.<....##     |.........####...............|      #####--.------#
       |.....|       |{.......|    |..............|         ##-........#
       -------       |........|    ----------------         # |.......|
                     ----------                             ##|.......|
                                                              ----|----
                                                                  #
Prx the Footpad                St:16 Dx:18 Co:10 In:11 Wi:12 Ch:6 Chaotic
Dlvl:1 $:11 HP:11(11) Pw:11(11) AC:7 Xp:1

Au niveau 2, je découvre un coffre.

Cool, je vais prendre ce qu'il y a dedans : de l'or, un parchemin, de la nourriture, et un bouquin.

Lisons maintenant ce parchemin : c'est ainsi que dans crawl dungeon stone soup on peut en identifier facilement en début de partie :

As you read the scroll, it disappears.  A lit field surrounds you!
You feel a wrenching sensation.  The jackal bites!  The jackal bites!  The jackal bites!

Mince, on dirait un sort de téléportation.

The jackal bites!  The jackal bites!  The jackal bites!

AÏe Aïe Aïe...

You die...

Vous l'aviez senti venir n'est-ce pas?

Me voilà mort sans avoir pu faire quoi que ce soit, pas même riposter.

Leçon n°2 : ne pas lire un parchemin non identifié : ils peuvent être méchants, même en début de partie.

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |      54 Au       |
                  |   killed by a    |
                  |      jackal      |
                  |                  |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Goodbye prx the Rogue...

You died in The Dungeons of Doom on dungeon level 2 with 167 points,
and 54 pieces of gold, after 578 moves.
You were level 1 with a maximum of 11 hit points when you died.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-10.txt

2021-03-10T21:07:51Z

<![CDATA[

Voici une nouvelle aventure : réussir une partie de nethack.

Les rogueligues ne sont pas tout à fait nouveaux pour moi : j'ai passé du temps à jouer à dungeon crawl, mais je souhaite relever le défi de l'original.

Pour ceux qui ne connaissent pas, il s'agit d'un style de jeu où l'objectif est de récupérer un trésor en passant de niveaux en niveaux. On gagne de l'équipement et de l'expérience. Un charme particulier s'apprécie au fil des parties : on peut croiser les fantômes des anciens personnages joués. Enfin, c'est le plus souvent en mode texte, laissant une place très importante à l'imagination.

Votre personnage est représenté par "@", et les monstres ou autres personnages par des lettres, les objets par des symboles...

Chaque partie est différente : le nombre de classes et de races à choisir comme personnage, et le fait que chaque niveau soit généré aléatoirement rend la durée de vie considérable.

Malgré son grand âge, nethack continue d'être développé. On en est à la version 3.6.

=> Site officiel | Nethack Wiki | Dungeon Crawl Stone Soup

Autant dire que l'aventure promet d'être longue. Voici l'épisode 1.

Installation

$ doas pkg_add nethack

Je choisis la dernière version : nethack-3.6.6p0-no_x11.

Lecture du guidebook

En entrant "pkg_info -L nethack", je m'aperçois qu'il y a un fichier "Guidebook.txt" (/usr/local/share/doc/nethack-3.6.6/Guidebook.txt). Ça sera sans doute bien de le lire un jour. À première vue, il fait plus de 60 pages, donc bon...

Il est disponible en ligne en mode html ou bien même en pdf :

=> https://nethack.org/v366/Guidebook.html | http://www.nethack.org/download/3.6.6/nethack-366-Guidebook.pdf

Allez, je m'y mets, et noterai ci-dessous les trucs qui me paraissent important à retenir afin de m'y référer pour la suite, sachant qu'il y a toujours l'aide du jeu (?). Après tout, il y a pas mal de trucs qui ne me seront pas utiles : jouer si on est aveugle ou la liste de toutes les variables de configuration.

  • Ctrl-X détaille le status du perso (statistiques, objets équipes...)
  • / permet de détailler ce qui est à l'écran
  • ? : menu aide
  • q : boire une potion
  • #enhance : choisir quelle compétence améliorer lorsque le message "You fell more confident" apparaît.
  • s : chercher un passage secret ou détecter un piège.
  • 10s : chercher pendant 10 tours
  • m - action : se déplacer ou faire une action sans automatismes (ex : se déplacer sans prendre un objet, ou manger mais pas ce qui est à ses pieds)
  • e : manger
  • E : Écrire sur le sol. Écrire "Elbereth" repousse les monstres (pas les attaques à distance)
  • #sit : pour être assis. À quoi ça sert?
  • a : utiliser un objet
  • g - direction : mouvement automatique dans une direction
  • _ : voyage rapide à un endroit de la carte. On valide avec "."
  • < ou > : prendre un escalier
  • A : retirer un objet (armure...) ou T, ou R.
  • o ou c : ouvrir ou fermer une porte
  • S : sauver et quitter
  • #quit, Alt-q ou ctrl-c : quitter
  • d : lâcher un objet
  • t : lancer une pierre, une flèche... Q pour choisir quel objet sera lancé.
  • f : tirer avec l'arme de jet ce qui est dans le carquoi.
  • Ctrl-D : défoncer une porte
  • p : payer la liste de courses (les objets pris chez un machand). Pour vendre, il faut poser les objets chez le marchand.
  • W : porter une armure
  • w : porter une arme
  • X : combat à 2 mains
  • x : échanger d'arme si on en a 2
  • z : utiliser une baguette magique
  • Z : invoquer un sort
  • #adjust : changer les lettres utilisées dans l'inventaire (ou Alt-a)
  • #annotate : mettre une note sur un niveau du donjon (ou Alt-A). Par exemple : monstre hyper dangereux, fuir!
  • #chat: parler à quelqu'un
  • #force : forcer une serrure
  • #pray : demander l'aide d'un dieu. Ne pas le faire trop souvent!
  • #ride : monter une créature
  • #wipe : s'essuyer la figure. Pourquoi???
  • #loot : pour piller un coffre par exemple
  • Ctrl-P : afficher l'historique des messages
  • @ : désactive la prise automatique des objets au sol (autopickup)
  • #turn : se changer en mort-vivant.

Première partie

Allez, on en a assez, il faut se lancer. Je lance une première partie.

Je laisse le jeu choisir un personnage pour moi.

       name: prx                                    Is this ok? [ynq]
       role: Knight
       race: human                                  prx, lawful female human Knight
     gender: female
  alignment: lawful                                 y + Yes; start game
                                                    n - No; choose role again
                                                    q - Quit
                                                    (end)

Une chevalière humaine loyale ? C'est tout moi :). Let's go !

Me voici devant une mini carte, avec mon cheval "u", un chacal "d" et une cotte de mailles "[". J'ai utilisé "/" pour savoir ça

Salutations prx, welcome to NetHack!  You are a lawful female human Knight.












                                      -----
                                      .@u.|
                                      |..d|
                                       ..[.
                                       ----




Prx the Gallant                St:14 Dx:9 Co:10 In:8 Wi:16 Ch:18 Lawful
Dlvl:1 $:0 HP:16(16) Pw:3(3) AC:3 Xp:1

Tiens, je vais attendre un peu avec "s", voir ce que font les autres.

The saddled pony hits the jackal. The jackal is killed!

Bravo petit poney :)

Je me déplace vers le corps du chacal, et on me dit que ça me trouble un peu de porter ce cadavre... Tu m'étonnes. En plus, me voilà surchargé :

Your movements are slowed slightly because of your load.












                                      -----
                                      .<..|
                                      |..@|
                                      ...[u
                                      -----




Prx the Gallant                St:14 Dx:9 Co:10 In:8 Wi:16 Ch:18 Lawful
Dlvl:1 $:0 HP:16(16) Pw:3(3) AC:3 Xp:1 Burdened

Je vais le reposer hein :), j'utilise pour ça "d". Pis je le mange tiens :

This jackal corpse tastes okay.

Hum, il faut aimer la viande crue :P

Je tente de porter la cotte de maille, mais elle est finalement moins bien que l'autre, la première étant enchantée avec un bonus +1. J'ai du retirer (R) l'ancienne avant (logique).

Tiens, je vais essayer de monter sur mon poney. Je tente une première fois et échoue lamentablement. Allez, un autre essai pour voir :

#ride
In what direction?
You slip while trying to get on the saddled pony.
You die...

Je glisse? Sérieux, je suis chevalière, et je ne sais pas monter à cheval ??? :D

Et en plus, j'en meurs ??? XD

Je viens de réaliser la partie la plus courte et la plus ridicule de nethack!

                       ----------
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       prx        |
                  |       0 Au       |
                  |  slipped while   |
                  |    mounting a    |
                  |   saddled pony   |
                  |                  |
                  |       2021       |
                 *|     *  *  *      | *
        _________)/\\_//(\/(/\)/\//\/|_)_______


Fare thee well prx the Knight...

You died in The Dungeons of Doom on dungeon level 1 with 0 points,
and 0 pieces of gold, after 52 moves.
You were level 1 with a maximum of 16 hit points when you died.

Leçon n°1 : NE PAS MONTER SUR LE DOS D'UN PONEY.

La prochaine partie s'annonce épique :D

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-06.txt

2021-03-06T21:07:51Z

<![CDATA[

Suite à la découverte du "512KB Club", initiative qui propose de recenser les sites proposant des pages de moins de 512KB, j'ai eu envie de m'amuser à réduire autant que possible la taille de mon site.

=> https://512kb.club/#100

À l'heure où j'écris ces lignes, la page d'accueil du site pèse 4,08 Ko tout compris (2,70 Ko transférés si le navigateur supporte gzip, ce qui est très probable).

Remarquez que cette question ne s'applique pas à gemini : une autre bonne raison d'adopter ce protocole :)

Pour quoi faire ?

Plusieurs raisons évidentes sont à considérer :

  • Rapidité d'affichage
  • Rapidité à la navigation : le site nécessite moins de ressources
  • Le site ne fait pas déborder les forfaits limités (ça existe encore)
  • C'est amusant à optimiser, et instructif de repérer les goulots d'étranglement.
  • Cela pose la question "qu'est-ce qui me paraît le plus important?". On me faisait remarquer que l'absence de typographie de type mise en gras était un manque de respect pour le lecteur. Je ne me suis jamais senti offensé en lisant un roman. Ceci dit, je pense que c'est plus respectueux de laisser le lecteur décider avec quelle police de caractère il préfère lire, et ça évite de charger des ressources en plus.

Quels outils pour mesurer?

Pour connaître le poids de votre site, plusieurs choix sont disponibles:

=> GTMetrix | Pingdom

Je préfère directement utiliser Firefox. Ouvrez la console de développement (F12) puis cliquez sur l'onglet "Réseau". Il ne vous reste plus qu'à vous rendre sur votre site et recharger la page sans le cache (Ctrl-Shift-r). Vous verrez apparaître la quantité transférée (si c'est compressé) et la taille finale:

=> /img/ffx-devtool-size.png

Que modifier pour réduire le poids d'un site?

Mon site était déjà assez maigre, je suis donc allé chercher les petits détails.

Éviter les requêtes CSS externes

Comme à peu près tout le monde, la feuille de style était contenue dans un fichier à part. Dans chaque page, on pouvait trouver :

Toutefois, mon code CSS une fois nettoyé des éléments inutiles et minifié (c'est à dire une fois tous les espaces et sauts de ligne retirés), était presque moins lourd qu'une requête HTTP. Autrement dit, quand le navigateur demandait au serveur "envoie-moi le fichier css", davantage de données étaient transmises que dans le fichier CSS.

Désormais, on peut trouver dans les pages simplement

Cela pose 2 inconvénients:

  • Le CSS n'est plus mis en cache.
  • Il faut modifier toutes les pages html si un jour je veux modifier l'apparence de mon site. C'est à priori pas quelque chose que l'on fait tous les jours. De plus, puisque j'utilise un générateur avec un Makefile, c'est trivial.

=> Maintenir un site statique avec un Makefile (http) | Maintenir un site statique avec un Makefile (gemini)

Dans mon cas, ces inconvénients sont négligeables.

Favicon

J'utilisais 3 liens pour la favicon selon le type d'image à fournir : ico, png ou svg.

Après avoir vérifié la taille de chacune :

$ ls -l favicon.*
-rw-r--r--   1 prx  prx     1150 Mar  5 22:21 favicon.ico
-rw-r--r--   1 prx  prx      429 Mar  5 22:21 favicon.png
-rw-r--r--   1 prx  prx     3835 Mar  5 22:21 favicon.svg

Il n'y a pas photo, la version png est nettement plus petite, et finalement largement suffisante pour mon site.

Virer les fonts

Les polices personnalisées, c'est chouette, ça donne une identité au site. Cependant, lorsque le fichier de police est plus lourd que le contenu de la page, il faut se poser des questions.

Aussi, au lieu de charger des polices depuis mon serveur, je propose dans le CSS le nom de la police dans laquelle j'aimerais que mon site s'affiche. Si l'utilisateur ne l'a pas, alors il voudra afficher le site avec la police qu'il a configurée dans les paramètres de son navigateur. Il faudra donc veiller à toujours terminer la définition d'une police par "serif, "sans-serif" ou "monospace". Pour l'instant, j'ai ceci :

font-family:"Hack", monospace;

Proposer du contenu compressé

C'est un peu de la triche, mais ça permet de réduire considérablement la quantité de données transférées. Si le navigateur le supporte, alors il demandera du contenu gzippé. J'utilise pour cela sbw avec le serveur httpd d'OpenBSD.

Le principe est tout bête : toutes mes pages html sont gzipppées.

Lorsqu'un visiteur demande "/all/index.hml", alors sbw va regarder si "/all/index.hml.gz" existe et enverra ce fichier si le navigateur supporte la version gzippée.

=> sbw (http) | sbw (gemini)

J'ai pu revenir sur le code de sbw à cette occasion et le rendre un peu plus simple, en corrigeant un petit bug à la lecture d'un fichier.

On va me dire "pourquoi gzip et pas brotli?" (Coucou Stéphane :)). La réponse est bête : j'aime bien gzip car j'en comprends l'algorithme.

=> Voir la version de Stéphane

D'autres serveurs sont capables de faire ça nativement (sans passer par un cgi), ça s'appelle static_gzip :)

Optimiser les images

On ne le dira jamais assez : optimisez les images.

Il existe pour cela des services en ligne, ainsi que des outils en ligne de commande. J'utilise pour ma part optipng et Graphicsmagick :

$ optipng image.png
$ gm convert image.jpg -strip -quality 75 -interlace line image.jpg

=> https://shortpixel.com/

Il existe aussi de nouveaux formats comme WEBP et AVIF, mais pas supportées par tous les navigateurs. Les vieux trucs, c'est bien aussi.

Toute ceci ne remplacera pas LA question : avez-vous vraiment besoin d'une image?

Virer le javascript

Sérieusement, avez-vous vraiment besoin de code JS pour votre site? C'est possible que oui, mais mis à part pour des éléments esthétiques, voire pour intégrer des scripts de profilage (beurk), il est probable que vous puissiez vous en passer (si vous en avez envie :)).

Je vous invite à vérifier si vous ne pouvez pas remplacer le code javascript par du CSS :

=> http://youmightnotneedjs.com/

Enfin, pensez à mettre votre code javascript tout à la fin de vos pages, juste avant ""

Voir aussi

=> Optimiser et accélérer les pages web | https://1mb.club/

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-03-04.txt

2021-03-04T21:07:51Z

<![CDATA[

Je suis actuellement dans une phase de contemplation. Ces dernières arrivent régulièrement, souvent après de nombreuses idées qui se sont bousculées. Ces dernières semaines, moins de code, plus de lecture et de temps passé en famille.

Un peu de C

J'ai donc laissé un peu de côté mon projet pour faire un client de messagerie quasi instantané basé sur du mail : une sorte de deltachat en C.

=> https://github.com/deltachat/deltachat-desktop

J'ai bien avancé, j'arrive à récupérer des mails et à les lire à leur réception. Je reste maladroit avec curl, qui est peu pratique pour faire de l'IMAP car les messages sont récupérés dans les entêtes. Ne connaissant pas d'autres lib pour faire ça, et n'était pas assez compétent pour créer moi même du code tls fiable, j'en reste là. Je m'y remettrai bientôt, je dois juste apprendre à faire des requêtes en parallèle.

Je garde une petite activité sur le C. Solène m'a contacté concernant quelques bugs pour vger (le serveur gemini que j'utilise) que j'ai pu corriger. J'en ai profité pour ajouter de percent-decoding, pas encore importé.

=> https://tildegit.org/solene/vger

En parlant de Solène, elle a créé un petit outil nommé "iblock" que je trouve très astucieux : il écoute sur certains ports de services inutilisés : les requêtes sont forcément de robots scanneurs potentiellement malveillants qu'on bloque dans le parefeu. Le code est très court si vous voulez voir. Je n'ai pas encore testé, j'attends de comprendre pourquoi la partie sur l'IPv6 est commentée.

=> https://tildegit.org/solene/iblock

isotop

J'ai continué à bricoler isotop suite aux retours que j'ai pu avoir. Ça avance doucement mais sûrement. J'ai un truc pas si mal finalement, mais sans doute un peu trop geek en l'état.

=> https://framagit.org/3hg/isotop/

Sur le net

J'ai découvert l'initiative 512kb.club qui recense des sites légers. Il y a quelques perles dedans, notamment "temp.sh", un service d'hébergement de fichiers temporaire:

=> https://512kb.club/#100 | https://temp.sh

Je compte bien fouiller dans cette mine à l'avenir.

OpenBSD

J'ai construit mes premiers ports pour OpenBSD : le premier pour vger, le second pour rover. C'était finalement beaucoup plus simple que je le craignais, il suffit de "choper le truc". Je reste toutefois en attente, car mes 2 messages soumis à ports@ sont "en attente" (delayed), comme si le serveur mail d'OpenBSD ne voulait pas de mes messages :/

=> https://github.com/lecram/rover | https://tildegit.org/solene/vger

Lecture

Je lis actuellement "La voie des rois" de Brandon Sanderson. J'avais adoré "Empire ultime", et pour l'instant, je ne suis pas déçu. Il sait créer un univers avec de nouvelles règles qui diffèrent des univers fantasy habituels. Il joue avec ces dernières pour nous les faire découvrir, un peu comme Asimov le fait avec ses 3 lois de la robotique. En arrière-plan, la question de l'environnement est souvent présente, ce qui n'est pas sans rappeler les préoccupations écologiques de Frank Herbert (Dune) que j'adore.

Pas le temps

Et comme toujours, trop peu de temps pour faire du sport correctement (et avant 18h, c'est compliqué), ni pour reprendre la musique convenablement. Bien souvent, je termine à peine d'accorder la guitare que je suis interrompu.

J'ai pourtant plusieurs projets de bricolage en tête : un meuble à chaussure à finir, aménager le dessous d'escalier, fabriquer un lit cabane pour mon petit loup... Vous en entendrez peut-être parler ici :)

Santé

Fièvre, toux, mais pas COVID. Une tasse de thé chaud, du miel, un peu de hang drum en fond sonore et mon fils qui me fait un gros câlin : je suis finalement un homme très heureux :)

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-02-10.txt

2021-02-10T21:07:51Z

<![CDATA[

Mon meilleur ami m'a offert deux tomes d'Imbattable :

Autant vous dire tout de suite que c'est génial. Si vous aimez la BD, vous serez forcément séduits.

L'idée est pourtant simple : le personnage principal, Imbattable, a le super pouvoir de la BD. Il peut, en quelques sortes, voyager entre les cases. L'auteur s'amuse avec talent à jouer avec les codes de la BD. Comme toute bonne histoire, les règles simples du pouvoir sont l'occasion de tester ses limites.

=> /img/imbattable/imbattable.jpg

Rapidement, on rencontrera des personnages possédant des pouvoirs différents : celui de maîtriser la 2D ou bien le pouvoir des mots.

=> /img/imbattable/imbattable-twodi.jpg

C'est à la fois drôle et intelligent. On se retrouve parfois avec des histoires qui se répondent entre les pages et prennent sens qu'en les relisant.

J'ai adoré ces pages. Je vous invite à le découvrir.

Bravo Pascal Jousselin !

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-01-22.txt

2021-01-22T21:07:51Z

<![CDATA[

Pour estimer la taille d'un projet, on peut compter les lignes de code. C'est un indicateur comme un autre après tout.

Jusqu'ici, j'utilisais cloc.

june propose de son côté une méthode d'autant plus simple : utiliser la commande "wc".

J'ai pris la liberté de modifier son script pour retirer les commentaires du décompte. C'est pour du code C, on veut donc retirer:

  • "//"
  • " *..."
  • "/*" Le début d'un long commentaire
  • "*/" en fin de ligne, la fin d'un commentaire

Cela peut se réaliser simplement avec sed :

sed -E '/\/\//d;
        /^[[:space:]]+\*[[:space:]]/d;
        /\/\*/d;
        /\*\/$/d' *h *c

Ensuite, on fait passer tout ça à "sort -u" pour ne pas compter 2 fois des lignes identiques. C'est pertinent pour les fins de bloc ("}"). Ensuite, on peut compter avec "wc", ce qui donne :

#!/bin/sh
# count lines of code
# https://text.causal.agency/004-uloc.txt
sed -E '/\/\//d;
        /^[[:space:]]+\*[[:space:]]/d;
        /\/\*/d;
        /\*\/$/d' *h *c |\
        sort -u |\
        wc -l

On doit pouvoir faire mieux. C'est suffisant à mon avis, et c'est de toute façon pertinent, à condition de toujours utiliser le même outil pour mesurer le nombre de lignes si on veut comparer.

Actuellement, le code de vger sur ma machine (un serveur gemini) qui contient quelques ajouts par rapport à la version sur le dépôt (CGI) a un nombre de lignes de 407. Pour comparer, dmenu en est à 875. Je trouve ça trop classe d'avoir un serveur gemini aussi petit :) Ça ajoute d'ailleurs à sa fiabilité.

=> Article de june | vger | vger security analysis | dmenu

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-01-20.txt

2021-01-20T21:07:51Z

<![CDATA[

Je code comme certains colorient un carreau sur 2, gribouillents des petits dessins rigolos ou font des arabesques pour s'occuper pendant les réunions. Je ne pense pas être bon à ça, mais j'aime beaucoup m'occuper l'esprit en écrivant du C. C'est un peu comme jouer à résoudre une énigme en s'amusant avec les règles du jeu.

J'ai appris le C il y a longtemps, en lisant le tutoriel du "site du zero" (j'ai dit, c'était il y a longtemps). Je m'y suis remis récemment, et avec du recul, sans être un expert, je m'aperçois que j'aurais bien aimé savoir certaines choses à l'époque. Voici donc tout ce que j'aurais aimé lire la première fois que j'ai appris le C.

Macros utiles

Quand on déclare une chaîne de caractères, on ne sait jamais trop quelle doit être sa longueur. Il existe en fait des limites déjà bien définies pour nous :

  • PATH_MAX : La taille maximale d'un chemin vers un fichier (#include limits.h)
  • BUFSIZ : Taille d'un buffer, souvent utiliser pour traiter du texte. (#include stdio.h)

Lecture

Aller regarder dans les fichiers /usr/include peut parfois aider à mieux comprendre. Mais par dessus tout, il faut lire les pages man. J'ignore si c'est spécifique à OpenBSD, mais les sections (3) regorgent d'explication, d'exemples, et de suggestions de fonctions associées dont on ignore peut-être l'existence. Par exemple, man strncat propose de lire des infos sur strlcpy pour la compléter/remplacer. Cette dernière nous montre carrément des exemples.

=> http://man.openbsd.org/strncat | http://man.openbsd.org/strlcpy

ternaire

Bon, c'est pas original, mais je n'avais jamais vraiment compris avant:

(condition) ? expression_si_vrai : expression_si_faux ;

Les chaînes de caractères

En C, il y a le type "char". Les chaînes de caractères ne sont pas un type. En C, il n'y a que des tableaux de "char", terminés par un NUL : '\0'. C'est idiot, mais en fait très important à garder en tête pour travailler sur du texte. La confusion est facile car on mélange les expressions avec des " ou des '. En bref :

  • 'a' : c'est le char a
  • "a" : c'est la "chaîne" constituée de 'a' puis '\0'.

On ne peut pas "additionner" ou modifier un tableau de char aussi "facilement" que dans d'autres langages. Pourtant, dans string.h, on peut trouver tout ce qu'il faut pour gérer les chaînes de caractères.

Il vaut mieux se garder une bibliothèque personnelle de fonctions gérant les chaînes, et les réemployer au besoin.

=> Voir le fichier "C" avec quelques exemples.

Si une manipulation sur des chaînes de caractères nécessite d'allouer de la mémoire avec malloc, alors il existe certainement une solution plus simple. Ce n'est pas toujours vrai ceci dit ^^.

Utiliser la fonction strdup() permet de copier une chaîne de caractères. Il faut penser à appeler "free()" ensuite avec cette fonction.

La fonction strsep() modifie la chaîne qui lui est donnée. Il faut donc parfois utiliser strdup() avant, car il faut donner une chaîne modifiable et non constante.

Autrement dit:

char *str = "coucou"; /* n'est pas modifiable */
char *str = strdup("coucou"); /* modifiable */

strchr() et strstr() sont très utiles pour récupérer l'emplacement d'un caractère ou d'une chaîne de caractères. On peut directement intervenir à partir de ce point ensuite.

Par exemple

char *pos = NULL;
char *str = "Respirer de la compote fait tousser";

pos = strstr(str, "compote");
puts(str); /* affiche "compote fait tousser /*

Toujours initialiser une chaîne avec des 0 : ainsi, on est sûr qu'elle est toujours terminée correctement (par un '\0').

char str[BUFSIZ] = {'\0'};
char *str2       = calloc(BUFSIZ, sizeof(char));

Pour "vider" (remettre à zéro) une chaine de caractère (reset) :

bzero(s, sizeof(s));

Fichiers

Il vaut mieux utilier les fonctions fread()/fwrite() plutôt que read()/write() car elles sont plus rapides (utilisation d'un cache).

size_t nread = 0;
FILE *fd = NULL;

if ((fd = fopen(fp, "r")) == NULL) { goto err; }

while ((nread = fread(buffer, 1, sizeof(buffer), fd)) != 0)
	fwrite(buffer, 1, nread, stdout);
fclose(fd);
if (ferror(fd)) {
	err(1,"closefile");
}

Pour lister le contenu répertoire: scandir()

#include 
#include 
int n = 0;
struct dirent **namelist;

if ((n = scandir(path, &namelist, NULL, alphasort)) < 0) {
	err(1, "Can't scan %s", path);
} else {
	for(int j = 0; j < n; j++) {
		if (!strcmp(namelist[j]->d_name, ".")) {
			continue;
		}
		if (namelist[j]->d_type == DT_DIR) {
			printf("%s\n", namelist[j]->d_name);
		}
		free(namelist[j]);
}
free(namelist);
}

Gestion des erreurs

#include 
#include 
  • Pour afficher une erreur et quitter : err(1, "erreur :%s", blabla);
  • Pour afficher un avertissement et quitter : warn("attention :%s", blabla);

Compiler

Dans la plupart des cours en C, on n'apprend pas à compiler.

Pour un simple fichier "main.c", il suffit d'un:

make main

Qui est en fait un raccourci pour:

cc -o main main.c

Pour compiler en utilisant une bibliothèque, il faut utiliser les options "-l" "-L", et "-I".

Le "-I" permet de dire où se trouvent les entêtes (.h), "-L" indique où se trouvent les bibliothèques et "-l" indique quelle bibilothèque utiliser.

C'est à partir de ce moment qu'un fichier Makefile devient intéressant. Voici le modèle que j'utilise. Il est assez strict au niveau de la gestion des erreurs, ça me force à écrire du code moins sensible:

NAME = thename
VERSION = 0.1

PREFIX?=/usr/local/
INCS     = -I/usr/local/include
LIBS     = -L/usr/local/lib -lCHANGEME -lOTHERLIB
LDFLAGS  = ${LIBS}
CPPFLAGS = -DVERSION=\"${VERSION}\"

CFLAGS  += -pedantic -Wall -Wextra -Wmissing-prototypes \
           -Werror -Wshadow -Wstrict-overflow -fno-strict-aliasing \
           -Wstrict-prototypes -Wwrite-strings \
		   ${CPPFLAGS} \
			${INCS} \
		   -Os 

.SUFFIXES: .c .o

SRC != find . -type f -name \*.c
H != find . -type f -name \*.h
OBJ = ${SRC:.c=.o}

.c.o:
	${CC} ${CFLAGS} -c $<

all: ${NAME}

${OBJ}: ${H}

clean:
	rm -f ${NAME} *.core *.o

${NAME}: ${OBJ}
	${CC} -o $@ ${OBJ} ${CFLAGS} ${LDFLAGS}

Bien sûr, il faudra changer "NAME", les "CHANGEME" après les "-l" et pourquoi pas lire "man make" :)

Si on veut compiler un binaire pour un chroot, il faut ajouter l'option "-static".

Listes chaînées

Les listes chaînées sont une méthode pour enregistrer des données. Un peu comme un dictionnaire en python. Et si c'est trop lent, vous pouvez regarder du côté des hashtables. Mais je trouve les premières largement suffisantes (on parle du C hein, c'est hyper rapide! :)).

J'en ai mis un exemple dans ma liste de "snippets":

=> gemini://si3t.ch/Logiciel-libre/Code/Snippets/C.gmi | https://si3t.ch/Logiciel-libre/Code/Snippets/C.html

Modestie

Parfois, on lit du code très difficile à comprendre, avec des opérations sur pointeurs pour gérer des chaînes de caractère par exemple.

Il faut rester parfois modeste, et arrêter de vouloir un code surpuissant meilleur que les autres. Il n'y a pas de code parfait.

Par exemple, c'est parfois tout aussi efficace de lire un fichier caractère après caractères plutôt que de chercher à le découper en morceaux à la recherche d'un motif particulier. Le C est très rapide :)

Lire un fichier ligne après lignes

getline(), et hop :)

Le man présente même un exemple.

Ceci dit, c'est souvent aussi rapide d'utiliser fgets() ou fgetc().

Ressources

=> Excellent site pour apprendre les bases du C | Learn C the Hard Way de Zed A. Shaw | Des remarques intéressantes pour écrire du C récent | Notions pour présenter du code propre | Idem, à la OpenBSD | Des exemples de code très instructifs | https://c-for-dummies.com/

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-01-06.txt

2021-01-06T21:07:51Z

<![CDATA[

Si vous chercher un nouveau fournisseur d'accès à internet (FAI) ou de téléphonie, je peux vous aider à faire le tri : oubliez SFR!

Je m'en vais vous conter mes mésaventures avec ce FAI...

Surveillance

Je ne m'étalerai pas sur les filtrages DNS et la surveillance de mon utilisation d'internet. En moins d'1 mois, je recevais une lettre d'hadopi (pour un film que j'ai en DVD mais avec aucun lecteur fonctionner à ce moment-là. Là n'est pas la question...).

Alerte au harcèlement

J'ai souscrit à l'offre fibre SFR il y a 1 an, puisque c'est ce dernier qui a installé la fibre par chez moi. Notons à ce propos que les câbles pendouillent mollement sur le poteau du quartier, on peut y voir les fils à moitié décrochés quand on se promène dessous. J'ignore combien de temps ça va tenir... En tout cas, les lignes ADSL ne permettent pas de se connecter ne serait-ce qu'au site de ma banque : timeout systématique, et débit de 100M descendant maximum dans les jours nuageux impairs de printemps (bissextile).

À l'approche du renouvellement d'engagement, j'ai reçu un appel de SFR, me proposant de me réengager. J'ai refusé poliment, puisque j'espérais pouvoir changer de FAI. Je ne veux pas payer pour la télé que je ne regarde pas. Je veux une IP fixe, et de l'IPV6. Je veux un réseau neutre.

On m'a rappelé la semaine suivante.

Puis le lendemain.

J'ai explicitement demandé qu'on me laisse tranquille, à chaque fois.

Le lendemain : 2 appels. Au 3e, j'ai répondu, et me suis fâché...

Passent quelques jours de silence.

Une semaine après, ça reprend. Je refuse de répondre, qu'ils aillent crever, je vais résilier mon offre de toutes façon.

Devinez quoi... Les jours suivants, je pouvais avoir jusqu'à 13 appels manqués de leur part.

13 appels! La blague!

Et pour finir, si je ne répondais pas, j'avais droit à un SMS alarmant du genre:

SFR a essayé de vous joindre à propos de votre offre. Veuillez nous recontacter au plus vite.

Comme à chaque fois, c'était pour me proposer de prolonger mon engagement.

À quel moment peut-on parler de harcèlement, voire de vente forcée?

Un prix? Lequel?

À chaque nouvel appel de leur part, où j'indiquais ne pas vouloir me réengager, j'ai eu droit à des propositions de plus en plus alléchantes : le prix de départ étant d'environ 40€/mois, ils descendaient à 30€.

Puis 25€.

Puis 20€.

Puis 18€!!!

Alors si on peut proposer la fibre à quelqu'un pour 18€ par mois, cela veut dire au moins 2 choses :

  • ils se font une énorme marge la plupart du temps
  • quelqu'un dans l'entreprise doit être très mal payé pour proposer les services.

Car je fais partie de ceux qui pensent qu'un objet ou un service a un prix. Cela demande du temps, du savoir faire, et si on veut un commerce équitable, il faut payer ceux qui travaillent.

Je m'explique : si j'achète un jean à 10€, c'est certainement que la matière première a été surexploitée, et qu'un enfant thaïlandais a été utilisé à bas salaire pour le créer. C'est d'ailleurs malheureusement le cas pour la plupart des objets qui nous entourent : les matériaux viennent d'où? Qui les a transformés? Dans quelle condition?

Esclavage moderne, tout ça tout ça...

Pour en revenir à SFR, c'est du foutage de gueule. Et surtout, à chaque fois, c'était pour se réengager, détail qu'ils se gardaient bien de me préciser si je ne le demandais pas.

Coupure d'internet inattendue

Avant la fin de mon offre, peu de temps avant la résiliation, et avant que je puisse installer l'offre d'un concurrent (Free), SFR a coupé ma ligne, sans prévenir. Était-ce pour permettre au FAI suivant de prendre sa place? J'en doute, j'ai déjà changé de FAI, et tout se passait en 24h.

Résultat, mon serveur était inaccessible, et je n'ai eu aucun avertissement ni information de leur part.

Bilan

Pour moi, SFR, plus jamais.

Je me suis tourné vers Free.

Je regrette l'offre d'OVH, FAI qui répondait exactement à mes attentes pendant au moins 7 ans (et plusieurs déménagements):

  • Pas de flicage
  • Assistance compétente
  • Service qui fonctionne ^^
  • Pas de fioritures (TV, musique, trucs qui n'ont rien à voir avec internet..) : je veux juste un accès à internet.

Je regrette d'autant plus de ne pouvoir souscrire à une offre de type FAI associatif (FAI maison, FDN...) J'ai même vu des FAI proposant d'installer une antenne relais sur sa fenêtre, je trouvais ça hyper cool. Mais je suis trop isolé pour en profiter. Peut-être que vous, non ?

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2021-01-01.txt

2021-01-01T21:07:51Z

<![CDATA[Au cours d'une discussion via IRC ou par mail, on a besoin de partager un fichier. Pour le texte, il y a les pastebin. Pour les photos ou les vidéos, il existe différents hébergeurs en ligne.

Plutôt que de confier ces données, parfois personnelles, à un tiers, pourquoi ne pas héberger sur un serveur de confiance ces fichiers? Il suffit d'un serveur SSH. Ce dernier peut être à la maison, mais pour l'exemple, j'ai choisi d'utiliser une session chez tilde.town.

En bref, ça ressemblerait à ça :

$ bitput Activite_1.pdf
Connected to tilde.
sftp> put Activite_1.pdf public_html/stuff/20acf0c6211609509262.pdf
Uploading Activite_1.pdf to /home/prx/public_html/stuff/20acf0c6211609509262.pdf
Activite_1.pdf                                                       100% 1162KB 739.1KB/s   00:01
sftp> chmod 666 public_html/stuff/20acf0c6211609509262.pdf
Changing mode on /home/prx/public_html/stuff/20acf0c6211609509262.pdf
https://tilde.town/~prx/stuff/20acf0c6211609509262.pdf

=> http://tilde.town/

Script d'upload

Voici un script qui prend en argument un fichier pour l'envoyer sur le serveur avec sftp. Oui, sftp, pas scp, car c'est censé être plus fiable. La vraie raison est que certains serveurs peuvent proposer par souci de sécurité seulement un accès sftp dans un chroot, sans aucun accès à un shell nécessaire à scp.

Voici quelques options qu'il faudra modifier selon votre cas, notamment la variable "sshcred" selon ce que vous avez configuré dans "~/.ssh/config"

sshcred="tilde"
url="https://tilde.town/~prx/stuff"
outdir="public_html/stuff"

Ensuite, on récupère l'extension du fichier:

# if file has extension
case "${1}" in
    *.*) ext=".${1##*.}" ;;
    *) ext="" ;;
esac

Et on crée un nom de fichier aléatoire en utilisant la date pour éviter la faible probabilité d'avoir 2 fichiers de même nom:

rdm="$(openssl rand 5 -hex)$(date +%s)"
out="${rdm}${ext}"

Enfin, on uploade et on s'assure que le fichier est bien lisible par le serveur http:

(
printf "put %s %s\n" "${1}" "${outdir}/${out}"
printf "chmod 666 %s\n" "${outdir}/${out}"
) | sftp "${sshcred}"

On termine par afficher l'url à partager:

printf "%s\n" "${url}/${out}"

~/.ssh/config

Pour pouvoir se connecter juste en écrivant "ssh tilde":

Host tilde
        HostName tilde.town
        User prx
        Port 22
        IdentityFile ~/.ssh/sshkey
        PasswordAuthentication no
        PubkeyAuthentication yes

Nettoyage

Pour éviter de garder les fichiers les plus anciens, on peut créer une tâche cron sur le serveur avec "crontab -e". J'ai personnellement décidé de supprimer les fichiers plus vieux que 2 jours.

@daily find /home/prx/public_html/stuff/ -type f -mtime +2 -delete

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-12-31.txt

2020-12-31T21:07:51Z

<![CDATA[

Today, I set up a secure multi-user gemini server, because I'd like to support this protocol. I wish more people can do the same, so here how I did it.

=> Multi-user gemini server on si3t.ch

Forewords

We will use an OpenBSD system, SFTP chroot and vger gemini server. ("secure", we said).

Users capsules will be available at gemini://domain.tld/user/.

I choose "/home/gemini" as chroot because "/home" is my biggest slice. Feel free to use another path.

Only Pubkey authentication will be allowed : easier and more secure.

Group "gmiusers" is used to identify who must be chrooted.

Before going any further, create this group:

# groupadd gmiusers

SFTP configuration

Create chroot. Keep in mind permissions are crucial.

# mkdir /home/gemini
# chown root:gmiusers /home/gemini
# chmod 750 /home/gemini
# mkdir /home/gemini/home

/home/gemini/home will store users directories.

chmod is 750 because :

  • "7" : owner can read, write and cd in this directory
  • "5" : group gmiusers can read in this directory. It is necessary so the gemini server can serve files :)
  • "0" : Others can't access this directory at all.

/etc/ssh/sshd_config :

Match Group gmiusers
        ChrootDirectory /home/gemini/
        ForceCommand internal-sftp
        AllowTcpForwarding no
        X11Forwarding no
        PasswordAuthentication no

Then reload ssh:

# rcctl reload sshd

vger gemini server setup

Download/compile/install vger

=> https://tildegit.org/solene/vger

Create a dedicated user for vger. It must belong to "gmiusers" group to be able to read files to serve:

useradd -G gmiusers -s /sbin/nologin _gemini_server

Edit /etc/inetd.conf:

11965 stream tcp nowait _gemini_server /usr/local/bin/vger vger -d /home/gemini/home

Edit /etc/relayd.conf:

log connection
ext_ip4 = "xx.xx.xx.xx."
ext_ip6 = "xxxx:xxxx:xxxx:xxx::xxx"


tcp protocol "gemini" {
        tls keypair domain.tld
}

relay "gemini" {
        listen on $ext_ip4 port 1965 tls
        protocol "gemini"
        forward to 127.0.0.1 port 11965
}
relay "gemini6" {
        listen on $ext_ip6 port 1965 tls
        protocol "gemini"
        forward to 127.0.0.1 port 11965
}

Notice relayd will look for tls certificates for "domain.tld" with the above configuration. This means /etc/ssl/domain.tld.crt and /etc/ssl/private/domain.tld.key.

gemini requires TLS. To get a certificate, you can use acme-client or generate a self-signed one. This is out of the scope of this page.

=> https://www.romanzolotarev.com/openbsd/acme-client.html | https://man.openbsd.org/ssl

Of course, enable and start these daemons:

# rcctl enable inetd relayd
# rcctl start inetd relayd

Add an user

You must create the user directory, set permissions, and add ssh pubkey so the user can identify. I do it with the script below. It will ask to paste user pubkey after creating it.

#!/bin/sh
# addgmiuser 

if [ $# -lt 1 ]; then
	echo "usage: $0 user"
	exit
fi
CHROOT=/home/gemini/
user="$1"
dir="${CHROOT}/home/${user}"
sshkey=""

userinfo "${user}" && (echo "user already exists" || exit 1)

mkdir -p "${CHROOT}"
useradd -G gmiusers -s /sbin/nologin -m "${user}" || exit 1
install -d -o ${user} -g gmiusers -m 750 "${dir}"

while [ -z "${sshkey}" ] ; do
    echo "enter ssh pubkey"
	read -r sshkey
done

echo "${sshkey}" >> /home/${user}/.ssh/authorized_keys

# create an index file so the user see it works
echo "# ${user}'s capsule" > "${dir}/index.gmi"
echo "write here" > "${dir}/index.gmi"
chown "${user}":"${user}" "${dir}/index.gmi"
exit

The end

Now users can start a sftp session, they are locked in the chroot and automatically in their own directory. They just have to upload gmi files and it's done :)

$ sftp -i ~/.ssh/sshkey user@domain.tld
Connected to domain.tld.
sftp> pwd
Remote working directory: /home/user

Something to say?

=> 📧 Send a comment | 📫 Subscribe to get answers | 📚 Read archives. | 💨 Unsubscribe

]]>

https://si3t.ch/log/2020-12-30.txt

2020-12-30T21:07:51Z

<![CDATA[

Nous sommes à la toute fin de 2020, et pas mal de changements sont à noter tant sur le plan personnel que numérique. Le plus flagrant sera le nettoyage de mon blog et le passage à un format plus simple.

Le fait est que je vais de moins en moins disposer de temps pour me consacrer à mes loisirs numériques. Aussi, je fait du ménage dans les outils que j'utilise. Bien que j'ai beaucoup apprécié publier mes billets par mail, je supprime le domaine qui me servait de blog (prx.si3t.ch) pour tout conserver dans si3t.ch.

Comme le titre l'indique, cela me permet de le rendre disponible via gemini.

=> gemini://gemini.circumlunar.space/ | https://gemini.circumlunar.space/

Voici les raisons qui me font aimer cette "nouvelle" alternative au web http.

Simple par design

Pas de javascript, pas de CSS, pas d'image ni de vidéo (affichées automatiquement, on peut quand même en distribuer ;)). Ça signifie moins de personnalisation. Certes.

Cela veut dire aussi:

  • Pas de popup
  • Pas de surveillance
  • Pas de page surchargée lente à afficher sur du matériel modeste pour afficher un petit bout de texte
  • Les lecteurs peuvent configurer l'apparence comme ils préfèrent lire

Sur ces derniers points, au moins, le web est fichu. Il faut passer à autre chose.

La contrainte permet d'être plus créatif :).

100% chiffré

C'est ainsi, il faut du TLS partout.

text/gemini > html

Bien que l'on puisse publier n'importe quel type de fichier via gemini, on peut écrire des pages au format text/gemini (gemtext) de la même façon que le html est privilégié avec le protocole http.

Cependant, le gemtext est une bouffée d'air frais. Les fonctionnalités proposées sont minimales et permettent à mon avis de davantage se concentrer sur le contenu publié que sur la forme. En effet, oubliez les mises en gras, les listes numérotées, l'italique ou le souligné, les liens mélangés aux paragraphes...

Si votre texte n'est pas clair sans ces fioritures typographiques, alors c'est qu'il faut mieux l'écrire. C'est en tout cas ainsi que je repense ma façon d'écrire, et j'ai l'impression d'écrire des textes plus clairs ainsi. C'est surprenant au début, notamment concernant les liens. C'est finalement plus judicieux de placer les liens de façon distincte du texte principale.

Comme vous pouvez le voir, pas besoin d'une mémoire immense pour écrire du gemtext:

 Du code:
 ``` 
 int
 main(int argc, char *argv[]) {
         printf("Hello \n");
         return 0;
 }
 ```
 Une ligne = un paragraphe. Il suffit d'écrire sans se poser de questions.
 Une ligne vide est conservée.

 * ceci 
 * est
 * une
 * liste

 => /un/lien/vers/rien Description du lien (facultatif)

  niveau 1
 # niveau 2
 ### titre niveau 3

 > Ceci est une citation

Ça ressemble au markdown, mais finalement pas tant que ça.

Désormais, je publie tout avec ce format (essayez de remplacer dans la barre d'adresse le ".html" par ".gmi" pour voir ;)). J'ai conservé pour l'instant un accès http et utilise un convertisseur gemtext->html dont je parlerai dans un autre billet.

Ça semble chouette, par où commencer?

Sur la page des clients (je vous conseille lagrange, très bien pensé), vous avez la possiblité d'utiliser votre navigateur habituel via un proxy pour explorer le "gemspace"

=> https://gemini.circumlunar.space/clients.html

Pour le reste, je vous laisse lire la FAQ (section 3), tout y est:

=> https://gemini.circumlunar.space/docs/faq.html

Techniquement, qu'est-ce qui change?

J'ai modifié le Makefile qui permet de générer ce site.

J'ai converti les fichiers markdown en gemtext.

J'utilise un convertisseur de gemtext vers html codé pour l'occasion (à suivre...)

Merci à solene pour le server gemini vger.

J'ai déplacé le flux ATOM.

=> https://tildegit.org/solene/vger | https://si3t.ch/log/atom.xml | gemini://si3t.ch/log/atom.xml

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-12-29.txt

2020-12-29T21:07:51Z

<![CDATA[

Le 12/11/20, mon ancien FAI (SFR) coupait mon accès à internet suite à un changement d'opérateur. (J'y reviendrai plus tard, SFR, c'est horrible). Cela a entraîné la coupure des accès aux services hébergés par les 3hg, à savoir les domaines 3hg.fr et ouaf.xyz. On a pu voir les défauts de notre infrastructure de CHATONS.

Je voudrais parler ici de ce que l'on a mis en place pour éviter que de tels problèmes surviennent à nouveau.

=> Incident du 12/11/20 | Inquiétude d'utilisateur du CHATONS | https://chatons.org/

Le manque de communication

Notre principal problème était l'impossibilité de communiquer avec les utilisateurs. D'habitude, cela se passe directement par mail. Cependant, puisque le serveur était injoignable, les utilisateurs ne pouvaient pas consulter leurs messages...

Pour ma part, je n'avais pas de véritable accès à internet, et un peu trop occupé à mettre en place un VPN au travers de la connexion 4G de mon smartphone pour rétablir les services en mode "dépannage".

Au minimum, il aurait fallu:

  • Indiquer la nature de la panne
  • Prévenir qu'on travaille sur une solution
  • Préciser un délai avant le rétablissement des services.

Le plus évident aurait été de le faire sur le forum des CHATONS... On n'y a pas pensé. :(

La solution choisie

On a décidé de séparer les services sur 2 serveurs :

  • Le serveur hébergé à la maison, entièrement chiffré, offre les services de messagerie.
  • Le site web est hébergé sur une machine virtuelle, ailleurs. Chaque membre du collectif a un accès SSH sur cette machine.

Il suffira de modifier le contenu du site web pour communiquer avec les utilisateurs. Pour ça, on utilise un dépôt git. De façon périodique, le serveur se synchronise avec le dépôt git. En cas d'urgence ultime, on peut intervenir directement sur la machine virtuelle.

Il aura fallu ajouter quelques champs DNS pour distinguer le site web (www) du service mail (mx).

ledzep                        IN A      82.65.187.107
ledzep                        IN AAAA   2a01:e0a:2b8:ca70::1bad
mx                            IN A      82.65.187.107
mx                            IN AAAA   2a01:e0a:2b8:ca70::1bad
inscription                   IN A      82.65.187.107
inscription                   IN AAAA   2a01:e0a:2b8:ca70::1bad

webmail                       IN A      46.23.93.119
webmail                       IN AAAA   2a03:6000:6f64:619::119
www                           IN A      46.23.93.119
www                           IN AAAA   2a03:6000:6f64:619::119

Et si la solution de secours tombe en panne ?

Puisque chaque membre du collectif dispose du code source du site, il peut l'héberger ailleurs en communiquant sur la page d'accueil. C'est d'ailleurs ce que Starsheep a commencé à configurer sur son serveur au cas où. Il suffira juste de modifier le champ DNS correspondant.

La leçon?

Ne pas mettre tous ses oeufs dans le même panier?

Ne pas croire qu'on a anticipé toutes les pannes possibles? (ici, tous les backups ne pouvaient rien).

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-11-22.txt

2020-11-22T21:07:51Z

<![CDATA[

Il n'y a rien de pire qu'une page web qui disparaît.

Pour en garder mémoire, il existe archive.org ou encore archive.is.

=> archive.org | archive.is

J'utilise un petit script qui me permet de sauvegarder une page sur ces 2 sites en un instant. Pour cela, j'utilise dmenu et xclip. Reste à sélectionner l'url de la page à enregistrer puis appeler ce script :

#!/bin/sh
test -s $HOME/.dmenurc && . $HOME/.dmenurc
PROMPT="waybackmachine:"

url="$(xclip -o | dmenu -sb ${sb} -sf ${sf} -nb ${nb} -nf ${nf} -fn ${fn} -p "$PROMPT")" 
test -z "${url}" && exit

$BROWSER "https://web.archive.org/save/$url"
$BROWSER "https://archive.is/?url=$url"

J'utilise la variable d'environnement BROWSER que je vous conseille d'avoir définie dans la configuration de votre shell.

Ça marche assez bien :P

=> https://web.archive.org/web/20201122141419/https://moutonlibre.org/ | https://archive.is/HnZuu

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-11-14.txt

2020-11-14T21:07:51Z

<![CDATA[

Depuis jeudi 12/11/20, je n'ai plus d'accès à internet.

En effet, mon FAI (SFR) a coupé mon accès. C'est "normal" puisque je veux changer de FAI. Cependant, j'aurais préféré que cela se passe lorsque j'aurais reçu mon nouvel équipement pour profiter du nouvel accès. J'avais pourtant fait exprès de ne rien résilier tant que ce n'était pas prêt...

Ceci a eu pour effet de couper l'accès aux domaines si3t.ch, 3hg.fr, ouaf.xyz. Le plus embêtant, c'est que je ne disposais plus d'aucun moyen pour prévenir les utilisateurs de ces domaines, d'autant plus que je ne suis plus sur aucun réseau social.

Il me faudra donc trouver une solution niveau communication à l'évenir. (pssst, j'y travaille ;))

=> http://si3t.ch

En attendant, j'ai bricolé un accès avec mon téléphone portable. J'espère que mon forfait tiendra le coup. Le plus embêtant aura été d'avoir une IP fixe, puisque celle attribuée en 4G change tout le temps : j'ai simplement configuré un VPN (wireguard) entre mon serveur et une VM chez openbsd.amsterdam.

Les DNS se propagent, ça devrait revenir bientôt...

Désolé pour le dérangement.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-11-11.txt

2020-11-11T21:07:51Z

<![CDATA[

J'ai un peu amélioré lsdesktop pour qu'il gère notamment :

  • Les traductions des noms d'applications si la variable d'environnement LANG est correctement définie.
  • Suppression des "%" dans les commandes pour éviter des erreurs.
  • Les catégories.

Les catégories restent en anglais, mais ce n'est pas un problème avec sed ou grep.

=> lsdesktop

Voici le type de sortie que va donner lsdesktop :

Office|Nouveau classeur|libreoffice7.0 --calc 
Graphics|Nouveau dessin|libreoffice7.0 --draw 
Multimedia|Audacity|env UBUNTU_MENUPROXY=0 audacity 
Graphics|Éditeur d’image GIMP|gimp-2.10 
Office|Nouvelle présentation|libreoffice7.0 --impress 
Office|Nouvelle formule|libreoffice7.0 --math 
Utility|Xfi|xfi 
Office|LibreOffice 7.0|libreoffice7.0 
Office|Nouveau document|libreoffice7.0 --writer 
Utility|Xfp|xfp 

C'est tellement rapide qu'on peut prévoir l'appel d'un script à l'ouverture d'une session pour peupler un menu, par exemple celui de fluxbox. J'ai mis à côté un script nommé fluxbox-automenu qui crée des fichiers de menu dans

$HOME/.fluxbox/automenus/

Ces fichiers sont les catégories, c'est à dire "graphics.menu", "settings.menu", "office.menu"...

Ne reste plus qu'à les inclure au menu de fluxbox, ainsi par exemple :

[submenu] (Apps)
	[submenu] (Multimedia)
		[include] (~/.fluxbox/automenus/multimedia.menu)
	[end]
	[submenu] (Bureautique)
		[include] (~/.fluxbox/automenus/office.menu)
	[end]
...
[end]

Vous me direz, il manque les icônes maintenant...

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-11-07.txt

2020-11-07T21:07:51Z

<![CDATA[

Séduit par le concept de "scratchpad" présent dans i3, j'ai voulu concevoir un truc semblable, peu importe le gestionnaire de fenêtres, et si possible avec les outils de base à OpenBSD.

C'est chose faîte, j'ai désormais accès à un terminal qui fait les 2/3 de l'écran et apparaît/disparaît avec un simple raccourci clavier. Sont utilisés

  • tmux
  • xwininfo
  • xterm avec titre, classe et nom personnalisés
  • xkill

Cela me permet par exemple d'ouvrir un terminal pour lancer une opération longue, fermer ce terminal, puis le réouvrir plus tard pour voir où ça en est.

Une démonstration sera peut-être plus claire :

=> /pub/videos/scratchterm.mp4

Voici comment ça marche.

Tout d'abord, on récupère les dimensions de l'écran après avoir définit le nom de notre outil :

name=scratchterm
# screen size
sw=$(/usr/X11R6/bin/xwininfo -root|sed '/Width/!d;s/.* //')
sh=$(/usr/X11R6/bin/xwininfo -root|sed '/Height/!d;s/.* //')

Ensuite, on calcule mes dimensions du terminal, disons les 2/3 de l'écran :

# dimension # 2/3 of screen
w=$(($sw*2/3))
h=$(($sh*2/3))

Toutefois, pour préciser les dimensions d'un terminal, il faut donner le nombre de colonnes et de lignes, pas un nombre de pixels... Là j'ai pas mal galéré pour trouver quelque chose d'à peu près correct. Il semble qu'un caractère fasse environ 7 pixels de large et 15 pixels de haut...

# a char is approx 7x15 px
columns=$(($w/7))
rows=$(($h/15))

Ensuite, on calcule la position sur l'écran de la fenêtre , au centre.

# position
x=$((($sw-$w)/2))
y=$((($sh-$h)/2))

Ça nous donne cette géométrie :

geometry="${columns}x${rows}+${x}+${y}"

Ensuite, on va créer une session tmux spécialement pour notre scratchterm sauf si elle existe déjà.

session=$name
tmux start-server
tmux has-session -t $session || \
		tmux new -d -s $session -n $name

Enfin, soit on affiche notre scratchterm, soit on le ferme. Pour savoir s'il est déjà ouvert, on peut récupérer l'id de toutes les fenêtrs ouvertes pour voir s'il y a notre scratchterm dans la liste. Si oui, on la xkill, sinon, on ouvre un terminal avec la bonne session tmux :

# show/hide scratchterm
id_=$(xwininfo -root -children | grep "$name" | awk '{print $1}')

if [ -n "$id_" ]; then
        # window exist, kill it
        xkill -id $id_
else
        xterm -T $name -name $name -class $name -geometry "${geometry}@c"\
               -e tmux a -t $session &
fi

Dans la version que j'utilise, le terminal est st avec le patch pour avoir de la transparence.

=> st

st -A .9 -c $name -n $name -T $name -g "$geometry" -e tmux a -t $session

J'ai ce script associé à un raccourci Alt-x, et je dois dire que j'ai du mal à m'en passer. :)

Le script peut se trouver ici :

=> scratchterm dans l'archive prxbins.tgz

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-11-05.txt

2020-11-05T21:07:51Z

<![CDATA[

J'ai récemment repris le développement d'isotop. C'est presque prêt, il reste surtout des traductions et de la documentation à rédiger. Mais ce n'est pas de ça dont je veux parler aujourd'hui.

=> isotop

Un élément très important dans un environnement de travail c'est la façon dont on peut ouvrir de nouvelles applications. Je suis un grand fan de dmenu, mais il faut reconnaître qu'il n'est peut-être pas le plus facile d'accès, surtout si on est attaché à l'utilisation de la souris.

=> dmenu

Un bonne alternative existe, c'est xfce4-appfinder, mais je trouve dommage de devoir installer des dépendances d'XFCE juste pour 1 application.

=> xfce4-appfinder

Une autre alternative existe : rofi avec le mode approprié. Il se charge de liste les fichiers ".desktop" présents sur un système pour en faire un menu. C'est cool, mais il y a des trucs que je ne veux pas voir dans le menu, j'aimerais donc pouvoir supprimer ces entrées.

=> rofi

J'ai donc décidé de m'y coller avec mes quelques compétences. Me voici en train de coder un bout de C pour lister les fichiers ".desktop" présents sur ma machine, que ce soit les fichiers systèmes (/usr/local/share/applications) mais aussi ceux que j'aurais pu créer pour mon bon plaisir ($HOME/.local/applications).

Ça s'appelle lsdesktop, et ça fait environ 200 lignes de code.

=> lsdesktop

Ce petit outil se contente de lister le nom des applications et la commande associée. Il ne se préoccupe pas de la catégorie ou encore de la langue (libre à vous de le rajouter :P). Il va ignore chage fichier ".desktop" précisé dans le fichier `$HOME/.config/lsdesktop.exclude", ça permet de cacher des entrées indésirables. Par exemple, j'ai ça :

$ cat ~/.config.lsdesktop.exclude
gtk3-demo.desktop
gtk3-icon-browser.desktop
gtk3-widget-factory.desktop

Pour le compiler, téléchargez le fichier lsdesktop.c puis entrez

make ldesktop

Si vous lancez lsdesktop, vous obtiendrez un truc comme ça :

$ lsdesktop 
sxiv|sxiv %F
LibreOffice 7.0 Calc|libreoffice7.0 --calc %U
Xfe|xfe
Xfi|xfi %f
Xfp|xfp %f
LibreOffice 7.0 Draw|libreoffice7.0 --draw %U
Xfw|xfw %F
LibreOffice 7.0 Impress|libreoffice7.0 --impress %U
LibreOffice 7.0 Math|libreoffice7.0 --math %U
LibreOffice 7.0|libreoffice7.0 %U
LibreOffice 7.0 Writer|libreoffice7.0 --writer %U
MuPDF|mupdf %f
mpv Media Player|mpv --player-operation-mode=pseudo-gui -- %U

Reste à mettre ça dans un menu. Pour commencer, on va envoyer la sortie à dmenu après avoir mis les choses en forme :

$ lsdesktop |column -t -s'|' |dmenu -l 10

Cela donne :

=> [IMG]

On peut en faire un petit script, et même si c'est déjà rapide, on ajoute un cache pour ne pas avoir à lancer lsdesktop s'il n'y a pas de nouveaux fichiers ".desktop"

#!/bin/sh

cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}"
cache="$cachedir/ddesktop"

if [ ! -f "${cache}" -o -n "$(find ${desktopfilespath} -newer ${cache} 2>/dev/null)" ]
then
    lsdesktop -s '::' | column -t -s '::' > ${cache}
fi

test -s $HOME/.dmenurc && . $HOME/.dmenurc
l=21
p="Run:"

cat ${cache} |\
    dmenu -nb $nb -nf $nf -sb $sb -sf $sf -fn $fn -i -l $l -p "$p" | \
    sed 's/^.*  //g' |\
    ${SHELL:-"/bin/sh"} &

Toutefois, cela ne s'utilise qu'au clavier. Qu'à cela ne tienne, on va patcher dmenu. Cependant, comme les patches ne mettre pas en évidence ce que la souris survole, je l'ai modifié un peu.

=> patcher dmenu | modifié un peu

Maintenant, ça ressemble à ça :

=> /pub/videos/ddesktop.mp4

Finalement, on peut aussi très bien l'intégrer à un autre environnement. Par exemple, on peut créer un fichier menu à inclure pour fluxbox (ça c'est pour arpi :P).

Dans le menu de fluxbox :

[submenu] (Apps)
[include] (~/.fluxbox/fluxbox.automenu)
[end]

Un fichier fluxbox-automennu appelé en début de session pour créer le menu :

IFS=':'
lsdesktop -s ":"|\
while read -r n c; do
	echo "[exec] (${n}) {${c}}"
done 

Ce dernier se lance ainsi :

sh fluxbox-automenu > ~/.fluxbox/fluxbox.automenu

On doit pouvoir faire de même avec d'autres outils :)

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-10-22.txt

2020-10-22T21:07:51Z

<![CDATA[

À l'heure où nos frontières sont si facilement fermées, où les finances des ménages sont fragiles, où l'on obéit sans remise en question devant des décisions liberticides, une petit rappel s'impose.

En 1989, il y a 31 ans, on pouvait entendre:

Plus jamais de 20% !

Depuis pourtant, la voici le pourcentage de votants en France qui ont accordé leur confiance à la haine :

  • 2002 : 17,79%
  • 2007 : 10,44%
  • 2012 : 17,90%
  • 2017 : 21,30% puis 33,90%
  • 2022 : à vous de jouer...

Ils peuvent changer de nom, s'appeler FN ou RN, Jean-Marie Marine ou Marion... :

...nous sommes noirs, nous sommes blancs, nous sommes jaunes, et ensemble, nous sommes de la dynamite.

=> https://si3t.ch/pub/audio/La_Jeunesse_Emmerde_le_Front_National-Berurier_Noir.ogg

Sources :

  • https://www.interieur.gouv.fr/Elections/Les-resultats
  • https://www.youtube.com/watch?v=CuZB9hOQ0DQ

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-10-21.txt

2020-10-21T21:07:51Z

<![CDATA[

J'ai récement laissé de côté mastodon. Toutefois, j'ai parfois envie de partager des découvertes courtes qui ne méritent cependant pas un article complet.

J'aurais pu installer un shaarli, mais j'essaie de plus en plus de me passer de PHP.

=> shaarli

Cependant, il existe un autre outil qui me convient davantage par sa conception : twtxt.

=> twtxt

  • Un simple fichier texte à remplir.
  • Format hyper simple : "date texte".
  • Hébergeable partout, il suffit de donner le lien vers ce fichier
  • 100% décentralisé : pas besoin de créer un compte ou d'héberger une application dédiée.

J'ai donc remplacé ma page de "sites du jour" par un fichier twtxt.txt. Je ne l'ai pas encore inscrit où que ce soit, mais ça va peut-être venir.

=> twtxt.txt

Un flux ATOM aurait pu tout aussi bien faire l'affaire, mais la syntaxe d'un fichier twtxt est plus pratique et a l'avantage d'être lisible même par un être humain. Je réfléchirai peut-être à en produire un si besoin.

En attendant, pour publier un nouveau message, j'utilise ce script utilisant dmenu :

=> dmenu

#!/bin/sh
# https://github.com/buckket/twtxt

test -s $HOME/.dmenurc && . $HOME/.dmenurc
outdir=$HOME/work/rdvsa
out=$outdir/si3t.ch/twtxt.txt
PROMPT="twtxt:"

msg="$(xclip -o | dmenu -sb ${sb} -sf ${sf} -nb ${nb} -nf ${nf} -fn ${fn} -p "$PROMPT")" 
test -z "${msg}" && exit
printf '%s\t%s\n' "$(date +%FT%T%:Z)" "${msg}" >> "${out}"

cd $outdir
make
make upload

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-10-07.txt

2020-10-07T21:07:51Z

<![CDATA[

Malgré la richesse du monde du logiciel libre, je trouve difficile de choisir quel gestionnaire de fichiers utiliser... Non, ce n'est pas vrai, je m'en sors très bien avec mv, ls, cp, mais je cherchais quelque chose de plus accessible pour reprendre le développement d'isotop.

=> isotop

Voici donc le résultat de mes recherches non exhaustives sur OpenBSD -current en septembre 2020.

Cahier des charges

L'idéal pour moi serait :

  • Un gestionnaire avec peu de dépendances
  • léger
  • qui affiche des aperçus si possible
  • qui supporte les actions personnalisées (redimensionnement d'images, renommage en masse...)
  • encore à peu près maintenu. Ce n'est pas indispensable, après tout un outil qui marche bien et qui n'a pas besoin de nouvelles fonctionnalité n'a pas à voir de nouvelles publications. Mais c'est rassurant de savoir qu'un(e) développeur n'est pa sloin pour corriger une éventuelle faille.

Les "gros" gestionnaires : Nautilus, Dolphin

Je vais être honnête, je n'ai pas testé ces derniers. Ils sont trop dépéndants des environnements de bureau Gnome et KDE.

Thunar

Thunar est un excellent gestionnaire de fichiers. Il est rapide, léger, supporte les onglets, les aperçus et les actions personnalisées. Ces dernières sont très facilement configurables.

=> Thunar

Toutefois, il requiert des dépendances à Xfce dont j'aimerais me passer. La preuve:

$ doas pkg_add thunar
doas (prx@shaihulud.my.domain) password:
quirks-3.439 signed on 2020-10-01T20:26:48Z
thunar-1.8.15:gvfs-1.44.1p0: ok
thunar-1.8.15:startup-notification-0.12p6: ok
thunar-1.8.15:libwnck3-3.36.0: ok
thunar-1.8.15:libxfce4util-4.14.0p0: ok
thunar-1.8.15:xfconf-4.14.3: ok
thunar-1.8.15:yelp-xsl-3.36.0: ok
thunar-1.8.15:geoclue2-2.4.13: ok
thunar-1.8.15:orc-0.4.29: ok
thunar-1.8.15:gstreamer1-1.18.0: ok
thunar-1.8.15:cdparanoia-3.a9.8p4: ok
thunar-1.8.15:gstreamer1-plugins-base-1.18.0: ok
thunar-1.8.15:enchant2-2.2.11: ok
thunar-1.8.15:hyphen-2.8.8: ok
thunar-1.8.15:woff2-1.0.2p0: ok
thunar-1.8.15:webkitgtk4-2.30.1: ok
thunar-1.8.15:yelp-3.36.0: ok
thunar-1.8.15:amtk-5.0.2: ok
thunar-1.8.15:gnome-devel-docs-3.32.1: ok
thunar-1.8.15:devhelp-3.36.2: ok
thunar-1.8.15:glade-3.36.0p0: ok
thunar-1.8.15:libxfce4ui-4.14.1p0: ok
thunar-1.8.15:garcon-0.6.4p0: ok
thunar-1.8.15:p5-URI-1.76p0: ok
thunar-1.8.15:exo-0.12.11: ok
thunar-1.8.15:xfce4-panel-4.14.4: ok
thunar-1.8.15: ok
Running tags: ok

=> Aperçu Thunar [IMG]

(La capture d'écran est prise avec le thème d'icônes Tango que j'aime beaucoup :P).

On voit par ailleurs qu'il ne sait pas gérer l'absence de certaines icônes... C'est un détail, mais ça m'énerve. Ce petit défaut esthétique ne retire pas les nombreuses qualités de ce gestionnaire.

Pcmanfm

Voici une excellent alternative à Thunar sans les dépendances à Xfce puisque supporté par l'environnement LXDE.

Il supporte lui aussi dans une certaine mesure les actions personnalisées : il faut créer un fichier ".desktop" dans ~/.local/share/file-manager/actions.

Toutefois, le site officiel semble peu à jour et je me demande où va le projet puisqu'il y a maintenant lxQT et pcmanfm-qt qui est développé (mais carrément moche actuellement).

=> officiel

Ceci dit, ça fonctionne bien. Il a tout de même deux défauts majeurs sous OpenBSD :

  • Il n'est pas traduit en français. Ça ne me gêne pas, mais c'est embêtant pour isotop.
  • Le menu "applications" reste vide : il dépend des autres environnements de bureau.

=> pcmanfm [IMG]

Rox-filer

Voilà une bête de course. Je n'ai pas trouvé plus rapide. Il est possible de définir des actions personnalisées, et même si l'apparence a un peu vieilli, une fois bien configuré il est très pratique et à la limite joli.

Seuls bémols :

  • Les raccourcis clavier par défaut sont déroutants
  • Pas d'onglets (mais osef)
  • Pas traduit
  • La progression lors d'une copie est peu précise
  • Il ne semble plus maintenu depuis des années et ça m'ennuie un peu...

=> rox-filer [IMG]

Xfe : X File Explorer

Voici mon préféré. Il est à la fois rapide, scriptable, indépendant, et toujours maintenu!!!

Au look un peu rétro de prime abord, on peut facilement obtenur une interface agréable avec des aperçus.

Il intègre des visualiseurs basiques bienvenus : visualiseur d'images xfi, un éditeur de texte xfw.

On peut avoir une vue en panneaux ou classique :

=> xfe1 [IMG]

=> xfe2 [IMG]

Il est aussi possible d'y intégrer des scripts pour le renommage/redimensionnement... en les déposant dans $HOME/.config/xfe/scripts.

C'est clairement mon favori lorsque j'ai besoin d'un client graphique.

mc, ranger, noice, nnn, rover : les clients en mode texte?

Pour gérer les fichiers, le shell c'est très bien, mais il existe aussi des gestionnaires en console qui permettent de tout faire du bout des doigts et être très efficace.

Le plus conne est sans doute Midnight Commander, donc je n'en parlerai pas ici. Je vais plutôt parler de ceux qui utilisent des raccourcis à la vi.

Vient ensuite un de mes préférés : ranger, intégré dans la nakedeb (pub subtile ;)). Je l'ai utilisé longtemps, il est top, avec un visualiseur bien fichu. Mais il est en python, et si possible je cherche des alternatives plus rapides en C (choix très personnel et pas forcément recevable).

=> ranger | nakedeb

=> ranger [IMG]

Puisque j'aime le C, je suis tombé sur noice. Pour le coup, j'ai utilisé ce dernier longtemps, il est très rapide, permet de se déplacer dans une hiérarchie avec efficacité. Il souffre toutefois de ne pas gérer la copie et déplacement des fichiers : c'est donc davantage un lanceur.

=> noice

=> noice [IMG]

Vient ensuite le successeur de noice : nnn. Très intéressant, ce dernier ajoute des "vues" qui permettent d'avoir plusieurs dossiers d'ouverts en même temps. Il est bien fichu, il faut l'admettre, et peut être énormément configuré avec un tas de plugins. Je lui trouve tout de même un gros défaut : sa dépendanc eà xdg-open pour ouvrir des fichiers : c'est peu pratique quand on veut choisir les applications par défaut selon le type de fichier : il faut se manger du xdg-mime default app.desktop image.jpeg et çe pour tous les types mime...

=> nnn

Je termine donc par mon préféré que j'aurais aimé trouver plus tôt : rover.

=> rover

Déjà, il s'installe en le compilant, mais ça prend 2 secondes :

git clone --depth=1 https://github.com/lecram/rover.git
cd rover && make && make install PREFIX=$HOME

Il est coloré par défaut :

=> rover1 [IMG]

On navigue avec "h/j/k/l". Jusque là, on n'est pas perdus.

On peut éditer un fichier avec "e" ou juste le lire avec "espace".

Pour chercher un fichier, on utiliser "/" puis on écrit sa recherche.

Pour ouvrir un shell dans le dossier courant, il suffit d'appuyer sur "Entrée.

Il dispose de plusieurs vues accessibles avec les nombres "1,2,3....".

Mais ce qui est absolument génial, c'est qu'on peut copier/déplacer des fichiers.

Tout d'abord, on les marque avec "m" :

=> rover2 [IMG]

Ensuite, on change de dossier. Ici, pous la démonstration, je vais appuyer sur "2" pour ouvrir un nouveau contexte et me déplacer dans "/tmp". Je copie les fichiers précédemment marqués avec "C", une barre de progression s'affiche :

=> rover3 [IMG]

Enfin, et ça c'est hyper fort, on peut ouvrir les fichiers avec la touche "o". Afin de pouvoir configurer quelle commande lancer selon l'extension, la FAQ donne un exemple.

=> FAQ

Il faut ajouter export ROVER_OPEN="rover-open" dans $HOME/.profile puis céer le script rover-open à placer dans votre $PATH, donc /usr/local/bin par exemple. Chez moi, c'est $HOME/bin. Ce script prendra cette forme :

#! /bin/sh
# Usage:
#     ./open.sh /path/to/file

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

case "${ext}" in
  *.htm|*.html)
    fmt="$BROWSER %s" ;;
  *.pdf|*.xps|*.cbz|*.epub)
    fmt="mupdf %s" ;;
  *.jpg|*.jpeg|*.png|*.gif|*.tiff)
    fmt="sxiv %s" ;;
  *.odt|*.odt|*.ods|*.od*|*.docx|*.doc|*.xls|*.xlsx)
    fmt="libreoffice %s" ;;
  *.mp4|*.avi|*.mpg|*.ogv|*.webm|*.mkv)
    fmt="ffplay %s" ;;
  *.ogg|*.flac|*.wav|*.mp3)
    fmt="ffplay %s" ;;
  *.[1-9])
    fmt="man -l %s" ;;
  *.c|*.h|*.sh|*.lua|*.py|*.ml|*[Mm]akefile|*.md)
    fmt="$EDITOR %s" ;;
  *)
    fmt="xdg-open %s"
esac

exec sh -c "$(printf "$fmt" "\"$1\"")"

Il me suffit d'éditer ce petit script si je veux modifier/ajouter la façon dont mes fichiers seront ouverts. Comme vous le voyez, c'est xdg-open qui est appelé, mais seulement si je n'ai rien précisé d'autre.

rover a été mis à jour le 2 juin 2020 donc semble toujours bien maintenu. Je vous invite à le tester, il est super :)

=> dernière mise à jour de rover

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-09-27.txt

2020-09-27T21:07:51Z

<![CDATA[

Ce n'est pas la première fois que j'en parle, mais j'oublie à tous les coups la commande magique pour récupérer toutes les musiques sur musicforprogramming.

=> musicforprogramming

for i in $(ftp -o- https://www.musicforprogramming.net/rss.php | grep -Eo http.*.mp3 |uniq);do ftp $i; done

Remplacez ftp par wget sous linux.

Dire que certains le font en node.js voire en python, même pas besoin en fait :).

=> musicforprogramming-dl (python)

Il me semble qu'arpi avec de la trans/goa pendant un temps, il faut que je fouille dans sa cave. :P

=> cave

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-09-23.txt

2020-09-23T21:07:51Z

<![CDATA[

Ça y est, je viens d'écrire ma première fonction personnalisée pour configurer dwm. En fait, je comparais ce que propose son dérivé spectrwm. Je me suis aperçu que ma configuration de dwm actuelle fait presque tout ce que spectrwm propose en plus, à savoir :

  • Support d'un clavier azerty,
  • Raccourci clavier pour verouiller l'écran
  • Modification de quelques raccourcis pour que ça soit plus pratique, notamment ajout/retrait du nombre de fenêtres dans la zone "master" avec Alt-i et Alt-U. Je conserve Alt-, et Alt-; pour le multi écran.
  • Zoom d'une fenêtre avec Alt-z
  • Je préfère garder Alt-Shift-C pour fermer une fenêtre. spectrwm propose Alt-x, 2 touches juste à côté que je risque d'entrer par erreur avec mes gros doigts.
  • Gestion du volume sonore par scroll sur la barre de status ou avec raccourci clavier.
  • Changement de fenêtre par scrolle sur le nom de la fenêtre. Très pratique en mode maximisé.
  • Fermeture de fenêtre par clic droit sur le titre.

Tout ceci, je l'ai juste en éditant le fichier config.h, sans appliquer le moindre patch.

On me dira qu'il manque le redimensionnement d'une fenêtre flottante ainsi que son déplacement : je n'en ai pas besoin, j'utilise justement un tiling window manager pour ne pas avoir à me préoccuper de redimensionner et bouger les fenêtres : c'est le boulot du gestionnaire de fenêtres de gérer ça.

Il me manquait la possibilité de remettre à 1 le nombre de fenêtres dans la zone master (un reset). C'est là que j'ai pu écrire une fonction pour le gérer, le tout dans le fichier config.h.

C'est tout petit, je vous le donne :

...
void resetnmaster(const Arg *arg);
...
{ MODKEY,                     XK_o,   resetnmaster,     {0} },
...
void
resetnmaster(const Arg *arg)
{
	selmon->nmaster = 1;
	arrange(selmon);
}

Et ça fait le job :)

Bon, j'avoue, je suis tellement habitué à ce gestionnaire de fenêtres que je n'ai plus grand chose à lui ajouter ou modifier. Ceci dit, je ne regrette pas une fois encore d'avoir appris le C, même pour une modification aussi ridicule.

Pour ceux que ça intéresse, ma configuration dwm est là : dwm-config.h

=> dwm-config.h | dwm

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-08-14.txt

2020-08-14T21:07:51Z

<![CDATA[

Petit mémo car j'oublie à chaque fois. Lors d'un transfert d'un image vers une clé USB par exemple, on utilise dd :

dd if=/location/install*.fs of=/dev/rsd1c bs=1m 

Ou bien encore pour préparer le chiffrement d'un disque :

dd if=/dev/urandom of=/dev/rsd0c bs=1m

Alors certes, il existe des commandes autour de dd pour connaître la progression. Mais je préfère garder les outils de base, c'est plus sûr.

L'astuce pour connaître l'avancement est toute bête, il faut appuyer simultanément sur ctrl et T pour envoyer un signal "SIGINFO".

=> https://marc.info/?l=openbsd-misc&m=159102188618367&w=2%3E

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-08-13.txt

2020-08-13T21:07:51Z

<![CDATA[

Juste un petit billet pour exprimer ma joie de lire qu'arpinux est devenu président de l'association debian facile :

=> https://arpinux.org/home/article74/poste-responsabilite | https://debian-facile.org/viewtopic.php?id=28021

Pour ce que je connais d'arpi, s'il s'engage dans cette voie, avec toutes les galères qu'impliquent de travailler à plusieurs, c'est qu'il est hyper motivé et que ça va donner du lourd ! Les débutants vont avoir droit à de jolis tutos :)

Si vous ne connaissez pas encore le phénomène, allez vite lire son blog. Il est notamment un des principaux, si ce n'est le, acteur d'Handylinux, crunchbang, kiss0s, cahiers du débutant...

Si vous ne connaissez pas encore debian, allez sur debian-facile :) (Debian est la moins pire des distributions Linux :P)

arpi, je t'envoie tout plein de courage et de respect pour cette voie dans laquelle tu t'engages !

GG!

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-08-04.txt

2020-08-04T21:07:51Z

<![CDATA[

C'est désormais très facile de "changer d'IP" via un VPN configuré sur un serveur OpenBSD. C'est même tout à fait possible de monter un tunnel automatiquement au démarrage d'une machine.

=> https://si3t.ch/ah/fr/08-vpn/wg.html

Toutefois, ce n'est pas toujours pertinent sur un ordinateur portable par exemple : on voyage ci et là, entre le boulot, le réseau public du café du coin et la maison, parfois monter le VPN au démarrage ne fonctionne pas : il faut d'abord avoir configuré l'accès au réseau public.

Voici donc deux scripts qui permettent de monter le tunnel à la demande.

Tout d'abord, on crée un fichier .vpn qui contient la configuration du tunnel (ip du serveur, clé publique du serveur...):

server="46.23.93.100"
port="443"
gateway="192.168.1.1"
servervpnip="10.0.0.1"
ip="10.0.0.3/24"
wgkey="fmOKz0nSscjxVEe+c1wl9iyVgAjJ631iWoixKqJkOuk"
wgpeer="Iw8pVI0zKjmVP1EPzhnSJlD0gVQdbOofsHEaQ4K98mw="

Enuite, on crée le script vpnup pour monter le tunnel:

#!/bin/sh -e
. ${HOME}/.vpn

doas ifconfig wg0 create wgkey ${wgkey}
doas ifconfig wg0 wgpeer ${wgpeer} \
wgendpoint ${server} ${port} wgaip 0.0.0.0/0
doas ifconfig wg0 ${ip} up
doas route add -priority 2 ${server} ${gateway}
doas route add -priority 7 default ${servervpnip}

Si on veut démonter le tunnel, on appelle vpndown:

#!/bin/sh -e
. ${HOME}/.vpn
doas ifconfig wg0 down
doas ifconfig wg0 destroy
doas route del ${server} ${gateway}

ps : whatsmyip est un alias pour la commande :

ftp -M -V -o- https://ipecho.net/plain; echo""

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-07-30.txt

2020-07-30T21:07:51Z

<![CDATA[

Pour envoyer des messages sur mastodon, j'utilisais l'outil codé en python nommé toot.

Sauf que sur toutes mes machines, j'ai déjà curl d'installé. J'ai donc voulu supprimer une dépendance de mon système et faire un petit script qui permet de tooter en ligne de commande, s'appuyant uniquement sur curl.

Premièrement, il faut créer une nouvelle application dans votre compte mastodon. Dirigez-vous vers les paramètres, menu "Développement", puis cliquez sur le gros bouton "NOUVELLE APPLICATION".

Cliquez ensuite sur le nom de la nouvelle application créée pour noter le jeton d'accès.

Il suffira de mettre ce jeton dans le script suivant en modifiant les deux premières variables :

#!/bin/sh
# curltoot : toot on mastodon

APIKEY="GiGnDc79AdoGLpCsMxDLasi_MHErSo5i2o9ka6HCFRI"
INSTANCE="https://bsd.network"
POST="${@}"
curl -X POST \
	--header "Authorization: Bearer ${APIKEY}" \
	--form "status=\"${POST}\"" \
	"${INSTANCE}/api/v1/statuses"

Et voilà, on peut tooter avec ce script :)

curltoot Coucou les gens!

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-07-14.txt

2020-07-14T21:07:51Z

<![CDATA[

Il existe un très bon script nommé unbound-adblock permettant de filtrer les publicités à l'aide d'unbound un peu comme le fait zerohosts, mais en plus rapide puisque le domaine bloqué est gardé en cache.

=> unbound-adblock | zerohosts

Cependant, j'utilise plutôt unwind que je trouve plus simple. C'est en fait activé sur toutes mes machines. Pourtant, ce dernier accepte une liste de domaines à bloquer très simplement : il suffit de préciser dans la configuration /etc/unwind.conf le fichier de domaines malveillants :

=> unwind

# cat /etc/unwind.conf
block list "/var/unwind.block"

Qu'à cela ne tienne, je vous propose de récupérer la liste d'unbound-adblock et l'utiliser avec unwind. On va éditer le fichier /etc/rc.local pour que toutes les semaines, la liste soit mise à jour au démarrage:

if [ -n "$(find /var/unwind.block -mtime +7 )" ]; then
    LIST="https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts"
    ftp -o- "${LIST}" | \
        grep -v "^#" |\
        grep "0.0.0.0" | \
        grep -v "0.0.0.0 0.0.0.0" |\
        cut -d ' ' -f 2 > /var/unwind.block
fi

(oui, je sais, tous les grep à la suite, on doit pouvoir faire mieux...)

Ça nous donne presque 57500 domaines bloqués.

Liste plus complète

Je maintiens une liste de domaines un peu plus complète si ça vous intéresse : unwind.block.gz.

=> unwind.block.txt.gz

Elle comporte actuellement presque 250000 domaines.

Elle est gzippée pour un transfert plus rapide, par conséquent vous pourrez la récupérer ainsi:

if [ -n "$(find /var/unwind.block -mtime +7 )" ]; then
	ftp -o- https://si3t.ch/pub/evils/unwind-block.txt.gz | gunzip > /var/unwind.block &
fi

Ça donne quoi ?

J'ai ajouté le mot clé "log" à la fin de la ligne du fichier unwind.conf pour voir apparaître dans /var/log/daemon quelques infos intéressantes. Je me suis amusé à faire le chemin suivant :

  1. accéder au moteur google.fr

  1. j'ai recherché "recette crêpes" (la base)

  1. Clic sur quelques liens au hasard.

Voici ce que j'ai vu apparaître:

Jul 14 15:52:31 moria unwind[96837]: blocking adservice.google.com.
Jul 14 15:52:37 moria last message repeated 3 times
Jul 14 15:52:42 moria unwind[96837]: blocking www.googletagmanager.com.
Jul 14 15:53:11 moria unwind[96837]: blocking adservice.google.com.
Jul 14 15:53:12 moria unwind[96837]: blocking sdk.privacy-center.org.
Jul 14 15:53:13 moria unwind[96837]: blocking www.googletagmanager.com.

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-07-02.txt

2020-07-02T21:07:51Z

<![CDATA[

Parce que la science n'est pas un dogme,

parce que la science c'est l'art de douter,

parce que douter c'est sain,

parce qu'en France on fait un sondage pour avoir la réponse à une question :

=> https://si3t.ch/pub/videos/avis-et-trous-du-cul.mp4

Je pose ça là, ça dure 2 minutes :

=> https://si3t.ch/pub/videos/EKlein-rock-science-est-doute.mp4

<3 Etienne Klein <3

(Vu sur Mastodon).

=> Mastodon

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-06-27.txt

2020-06-27T21:07:51Z

<![CDATA[

Ça fait un petit moment que j'ai envie de m'amuser avec un arduino. J'ai acheté un kit et commence à me faire la main. Avec quelques notions de C, c'est en fait très simple à programmer et utiliser. De plus, c'est une occasion de mettre en pratique mes cours d'électricité de collège :D.

=> arduino

Puisque mon système principal est OpenBSD, et puisque les instructions "officielles" ne sont plus d'actualité, voici quelques notes pour développer sur arduino UNO avec OpenBSD. Plusieurs éléments sont repris du billet de jcs.

=> https://playground.arduino.cc/OpenBSD/CLI/ | https://jcs.org/2019/12/17/arduino

Il faut les paquets suivants :

# pkg_add arduino arduino-makefile

Ensuite, pour commencer un nouveau projet, on va créer un dossier ainsi qu'un fichier Makefile comme suit:

mkdir projet
cd projet
vi Makefile

Dans le fichier, indiquez :

BOARD_TAG    = uno
include /usr/local/share/arduino-makefile/Arduino.mk

Afin de compiler votre projet, il faudra utiliser la commande gmake. Placez auparavant le code dans un fichier .ino. Assurez-vous de ne pas avoir défini de variables d'environnement de type "LDFLAGS".

Pour charger le code sur l'arduino branché par cable USB sur votre machine, exécutez gmake upload.

Cependant, vous verrez peut-être ce message d'erreur :

serial.serialutil.SerialException: [Errno 13] could not open port
/dev/ttyU0: [Errno 13] Permission denied: '/dev/ttyU0'

Hé oui, OpenBSD est sécurisé. Par défaut, un simple utilisateur n'a pas le droit d'utiliser un port série. Vous devez appartenir au groupe "dialer".

# usermod -G dialer user

user doit ensuite se reconnecter.

Pour accéder aux messages envoyés sur le port série (Serial.println), la commande suivante fera l'affaire:

cu -s 9600 -l /dev/cuaU0

Pour ma part, je compile, envoie le code dans la carte et surveille la console en une fois :

gmake && gmake upload && cu -l /dev/cuaU0 -s 9600

Pour l'instant, j'ai réussi à avoir un mini lecteur mp3 avec des contrôles simples pour mon petit droïde, ainsi qu'un détecteur de mouvement qui allume des LEDs lorsqu'on ouvre un placard. J'aimerais faire de même lorsqu'on passe la main devant une vitre... D'ici là, je dois d'abord apprendre à souder :s

Une réaction?

=> 📧 Envoyez votre commentaire par mail. | 📫 Abonnez-vous pour recevoir les réponses | 📚 Consultez les archives. | 💨 Vous désinscrire

]]>

https://si3t.ch/log/2020-06-18.txt

2020-06-18T21:07:51Z

<![CDATA[

Me voilà de retour sous cwm pour changer des habitudes (et aussi parce que j'ai une idée derrière la tête avec ce gestionnaire de fenêtres), me voilà confronté à un problème de taille : quel fond d'écran choisir?

=> cwm

Tout d'abord, je me contente très bien d'un fond uni que j'obtiens avec :

xsetroot -solid \#5e81ac &

ça donne ça :

=> https://pix.toile-libre.org/upload/original/1592464527.png

Ou alors, j'aime bien avoir de simples motifs. J'ai vu l'idée passer sur le forum nixers (que je recommande vivement! :))

=> nixers

xsetroot -fg \#5e81ac -bg \#434c5e -mod 5 5

=> https://pix.toile-libre.org/upload/original/1592464860.png

Bon, ça, c'est rigolo, mais ça ne fait pas le bonheur de tout le monde. Pour trouver afficher de jolies images, j'utilise le script setwall qui appelle soit gm (GraphicsMagick) ou xwallpaper si présent.

=> setwall dans l'archive prxbins

Pour avoir un fond d'écran différent à chaque session, un fichier aléatoire est choisi grâce au script rdmwall. Ce dernier va chercher les fonds d'écran dans mon dossier $HOME/docs/img/wallpapers.

Reste à trouver des images sympa. Pour commencer, il y a l'inévitable cave:

=> https://arpinux.org/public/

Comme indiqué sur son site, arpinux nous propose de récupérer tous les wallpapers ainsi :

mkdir lacavewalls
cd lacavewalls
wget -r -np --user-agent=Firefox -l5 -k -E -A.jpg -A.png \
  https://arpinux.org/public/wallpapers/

Si vous aimez les belles photos, faîtes un tour sur unsplash et leur section wallpapers: https://unsplash.com/wallpapers. Il y a sur ce site des artistes incroyables et des images de grande qualité.

=> https://unsplash.com/wallpapers

J'aime bien les fonds minimalistes, j'ai pu trouver mon bonheur ci et là:

=> https://www.reddit.com/r/MinimalWallpaper/ | https://wallpapersden.com/minimalist-wallpapers/ | https://wallpaperaccess.com/minimalist | https://wallpaperscraft.com/catalog/minimalism

Sinon, il y a le classique deviantar, si vous êtes assez patients pour fouiner dans cette immense base de données.

=> https://www.deviantart.com/search?q=wallpaper

Si vous aussi vous avez des sources de fonds d'écran intéressantes, faîtes-le savoir ;)

=> /img/wallpapers/

]]>

Proxy Information
Original URL
gemini://si3t.ch/log/atom.xml
Status Code
Success (20)
Meta
text/xml
Capsule Response Time
824.519323 milliseconds
Gemini-to-HTML Time
4082.301574 milliseconds

This content has been proxied by September (3851b).