1

Initial commit

This commit is contained in:
2025-03-28 12:57:37 +01:00
commit ed9ddcfdc8
1841 changed files with 42303 additions and 0 deletions

View File

@@ -0,0 +1 @@
file: images/A1Q6mO.jpg

View File

@@ -0,0 +1 @@
file: images/KqxGsR.jpg

View File

@@ -0,0 +1 @@
file: images/MA4m5T.jpg

View File

@@ -0,0 +1 @@
file: images/Rr8KVX.jpg

View File

@@ -0,0 +1 @@
file: images/VGXaF8.jpg

View File

@@ -0,0 +1 @@
file: images/XTPNQZ.jpg

View File

@@ -0,0 +1 @@
file: images/cW763i.jpg

View File

@@ -0,0 +1 @@
file: images/gky720.jpg

View File

@@ -0,0 +1 @@
file: images/jZltTx.jpg

View File

@@ -0,0 +1 @@
file: images/zux5qa.jpg

View File

@@ -0,0 +1 @@
file: videos/Zf8iAR.mp4

View File

@@ -0,0 +1 @@
file: videos/fubVNP.mp4

View File

@@ -0,0 +1 @@
file: videos/glsyvj.mp4

View File

@@ -0,0 +1 @@
file: videos/oOg5AS.mp4

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

View File

@@ -0,0 +1,202 @@
---
date: '2023-06-05'
title: WWDC2023
---
Conférence annuelle d'Apple consacrée notamment à l'écosystème logiciel et aux développeurs, c'est aussi l'occasion pour la marque de présenter de nouveaux produits.
Cette année, apparemment, devrait être riche en annonces intéressantes.
J'ai donc décidé de rédiger mes impressions pendant le visionnage de la conférence.
Sachez que je n'attends jamais rien des keynotes d'Apple sinon passer un bon moment de geek.
Aujourd'hui n'est pas différent.
Non pas que je ne suis pas enthousiasmé par ce que produit Apple, mais tout simplement que je suis bien équipé à l'heure actuelle et que je n'ai pas encore de raison de changer quoique ce soit.
## Macbook Air 15 pouces
Après la traditionnelle publicité (excellente, comme toujours), Tim Cook nous accueille à l'Apple Park, avant de présenter le premier produit de la conférence : le Macbook Air 15 pouces, équipé d'une puce M2.
De quoi anéantir la concurrence en termes de performances et de consommation d'énergie.
À $1299, je ne suis pas certain qu'il ait la moindre compétition avec une puce x86 traditionnelle.
![cW763i](images/cW763i.jpg)
Il semblerait que certains ne soient pas forcément d'accord avec l'ajout d'une telle taille dans la gamme *Air* du constructeur.
J'ai tendance à penser qu'il y a probablement une demande et qu'il vient combler un manque avant de passer au Macbook Pro de diagonale similaire.
En tout cas, je serais client si je n'avais pas déjà un Macbook Pro de 13 pouces (et tout le reste) : à prix équivalent (à l'époque où je l'ai acheté) et compte tenu de mon usage, je peux me passer de quelques raffinements de la gamme Pro au profit d'un écran plus grand.
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/apple-introduces-the-15-inch-macbook-air/)
## Mac Studio
On passe ensuite au Mac Studio (à $1999), le Mac mini a grosse tête.
Comme souvent sur ce type de produit chez Apple, la grosse différence est située dans les entrailles de la bête.
Apple introduit un nouveau CPU : le [M2 Ultra](https://www.apple.com/fr/newsroom/2023/06/apple-introduces-m2-ultra/).
On est d'accord, le nom commercial n'est pas top.
Mais peu importe : Apple s'est dotée du meilleur CPU, tout simplement, depuis qu'ils ont introduit le M1.
L'architecture est maîtrisée, performante, et surtout, scalable, et c'est là que le M2 Ultra brille.
![A1Q6mO](images/A1Q6mO.jpg)
Ce Mac ne m'intéresse pas particulièrement : il cible les producteurs de contenu audio et vidéo, ou de jeux-vidéo.
## Mac Pro
Apple dévoile enfin un Mac Pro avec une puce M2.
Une machine vraiment impressionnante, que le prix de $6990 destine forcément aux professionnels.
Je suppose que ses nouveautés sont extrêmement intéressantes pour ceux que ça intéresse : je dois dire que la quantité de lignes PCI-Express disponibles envoie du lourd, et que tout un tas d'usages deviennent envisageables, qu'il s'agisse de stockage ou, surtout, de traitements intensifs en tous genres.
![MA4m5T](images/MA4m5T.jpg)
Je n'en suis pas moins impressionné par la machine, bien au contraire :
> le Mac Pro avec puce M2 Ultra peut à lui seul ingérer et encoder en temps réel 24 flux de caméra 4K
Il y a bien là de quoi faire fantasmer n'importe quel geek, même non créateur de contenu vidéo...
C'est juste que je ne suis pas la cible de cet ordinateur.
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/apple-unveils-new-mac-studio-and-brings-apple-silicon-to-mac-pro/)
## iOS 17
Craig Frederighi prend ensuite la parole pour aborder iOS 17.
On y apprend l'intégration de posters de contacts, une façon plutôt agréable de personnaliser la fiche des contacts dans différentes situations (dans l'application Contact mais aussi lors d'un appel par exemple).
![KqxGsR](images/KqxGsR.jpg)
*Live Voicemail* est une nouvelle fonctionnalité que je trouve assez intéressante : l'iPhone peut afficher la transcription en temps réel d'un appel masqué.
Pratique pour moi qui filtre tout.
*Messages* reçoit quelques nouveautés bienvenues, en particulier *Checkin* : un système de notification pour savoir si vos proches sont bien arrivés à destination.
Le système a l'air vraiment rassurant.
![jZltTx](images/jZltTx.jpg)
D'autres fonctionnalités de l'application sont présentées, mais elles sont plus anecdotiques selon moi (les stickers par exemple).
*NameDrop* permet de partager sa fiche contact avec quelqu'un d'autre, facilement et naturellement.
Comme souvent, c'est le genre de fonctionnalités anodines, qui ne payent pas de mine, mais qui vont s'intégrer naturellement aux usages des possesseurs d'iPhones.
{{< video "glsyvj" >}}
Je trouve que c'est là, la force d'Apple : il y a une révolution de temps en temps (l'iPhone, les CPU M1), et le reste du temps, on a l'impression qu'Apple ne fait aucun effort.
Mais ils présentent des petites choses pour améliorer le quotidien, transformer nos usages, de façon naturelle et intuitive.
Nouvelle application présentée également : *Journal*.
Pour le coup, ça m'intéresserait de la tester quand elle sera disponible.
Le but est de consigner plus ou moins automatiquement ce qu'on fait, comme un journal intime.
*StandBy* sera une fonctionnalité permettant de garder l'affichage de l'iPhone allumé, à la manière de ma tablette domotique actuelle.
Si cette fonctionnalité arrive aussi sur iPadOS, ça m'intéresse **beaucoup**, du coup !
Ce mode ne se limite pas à afficher l'heure : plein de choses sont possibles, y compris - évidemment - Siri, l'affichage de widgets, etc.
![zux5qa](images/zux5qa.jpg)
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/ios-17-makes-iphone-more-personal-and-intuitive/)
## iPadOS
Justement, iPadOS va aussi bénéficier de nouveautés, particulièrement concernant les widgets qui deviennent plus interactifs, et plus utiles.
Ils se retrouvent aussi sur l'écran de verrouillage qui bénéficie au passage de possibilités de personnalisation auparavant réservées à l'iPhone.
![XTPNQZ](images/XTPNQZ.jpg)
Autre application réservée à l'iPhone : *Santé*, qui va débarquer dans iPadOS 17.
La gestion des PDF sur iPad s'améliore aussi, avec des fonctionnalités assez sympa comme la possibilité de remplir les formulaires (même si ce ne sont pas des formulaires PDF - ça fonctionne aussi avec une photo d'un document !).
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/ipados-17-brings-new-levels-of-personalization-and-versatility-to-ipad/)
## macOS
On passe ensuite sur les nouveautés de macOS.
Ainsi, *Sonoma* fera suite à *Ventura*.
On y trouvera des économiseurs d'écrans similaires à ceux vus sur AppleTV (ça fait un moment que j'attendais ça !).
Les widgets seront améliorés aussi sur macOS.
Je ne les utilise pas particulièrement aujourd'hui, mais s'ils deviennent aussi utiles et intéressants, je vais peut-être m'y mettre.
Surtout considérant l'intégration encore plus avancée de *Continuité*, qui permet de récupérer les informations des widgets installés sur l'iPhone, sans avoir besoin d'installer d'application sur le Mac.
Apple introduit ensuite le *Game Mode* sur Mac.
Je me souviens du *Game Mode* sous Windows et j'en garde un très mauvais souvenir, alors je suis un peu inquiet.
Néanmoins, cela signifie que le jeu sur Mac fait son chemin, et ça, c'est une excellente nouvelle.
Surtout que les images de *Death Stranding* donnent bien envie...
Après avoir présenté des fonctionnalités rigolotes et plutôt sympas pour les vidéoconférences, on parle de *Safari* avec un truc tout con auquel je pense depuis un moment : étendre le concept de navigation privée en créant des profils de navigation, et c'est exactement ce que Safari va proposer.
Concrètement, on pourra avoir une fenêtre ouverte avec le profil "Travail", et une autre fenêtre ouverte avec le profil "Personnel", par exemple.
Sur les deux fenêtres, on pourra être connecté aux mêmes sites mais avec des comptes différents.
Je pense que ça se révélera très pratique à l'usage, et que c'est une excellente extension du mode de navigation privée.
![gky720](images/gky720.jpg)
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/macos-sonoma-brings-new-capabilities-for-elevating-productivity-and-creativity/)
## AirPods
Quelques nouveautés concernant les *AirPods* sont présentées en particulier concernant leur capacité à s'adapter aux sons ambiants.
C'est impressionnant, mais ça ne me concerne pas vraiment donc, je passe.
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/airpods-redefine-the-personal-audio-experience/)
## AppleTV
Les nouveautés concernant l'*AppleTV* m'intéressent beaucoup plus, avec l'arrivée des appels *FaceTime* sur la TV, utilisant là encore *Continuité* pour fournir la caméra et le micro quand la TV n'en est pas équipée.
De quoi faire des vidéoconfs littéralement depuis le canapé !
Et on pourra le faire tout en regardant la télé sur la plus grande partie de l'écran, voire s'organiser des *watch-parties*.
![Rr8KVX](images/Rr8KVX.jpg)
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/tvos-17-brings-facetime-and-video-conferencing-to-apple-tv-4k/)
## Watch
Viennent ensuite les annonces concernant l'Apple Watch, qui ne m'intéressent pas spécialement, bien que je sois enthousiasmé par ses possibilités.
Apple s'occupe ensuite de la santé mentale, après avoir parlé de la santé physique.
C'est totalement une application pour moi et je suis très content qu'il y ait enfin des ressources sur le sujet, ne serait-ce qu'une app de tracking de l'humeur (et pas un truc fait avec les moufles).
J'espère qu'elle sera disponible sur mes plateformes, et pas seulement sur Apple Watch.
- [Communiqué de presse](https://www.apple.com/fr/newsroom/2023/06/introducing-watchos-10-a-milestone-update-for-apple-watch/)
## One more thing
Tim Cook reprend la parole pour la grosse annonce (avec le bon vieux "*One more thing*" qui va bien) : le casque VR, *Apple Vision Pro*.
Je dois dire que je n'attendais pas spécialement un casque de réalité virtuelle.
J'en ai **rien** à faire.
Je savais qu'Apple allait en faire un, sans pour autant me dire que ça allait m'intéresser.
![VGXaF8](images/VGXaF8.jpg)
Et puis, ils l'ont montré en situation réelle, avec des usages qui me correspondent.
Regarder la télé sur très grand écran - sans écran, travailler comme sur un Mac, ça a l'air magique, comme tout ce que fait Apple.
C'est bluffant, et je vois totalement comment cela pourrait transformer ma vie et mon travail.
Je n'aurai jamais attendu ça d'un casque de réalité virtuelle, et bien que ça sonne très "fanboy", un tel enthousiasme ne pouvait venir que d'un produit Apple.
{{< video "oOg5AS" >}}
Il est annoncé à $3500.
Les détracteurs d'Apple sont déjà en train de hurler au scandale, mais ça sert vraiment à quelque chose ?
Les autres, les *afficionados* comme moi, trouveront le prix normal.
On n'a rien sans rien.
Qualitativement, je ne suis pas sûr qu'il ait de rival.
Et c'est aussi l'écosystème qui fait la qualité des produits Apple.
Pour moi, ce casque signe probablement un tournant dans la technologie.
**Il va marquer l'histoire** comme étant une nouvelle interface de travail.
On va faire un bond en avant, comme on l'a fait avec l'iPhone.
Il y aussi eu des râleurs sur le prix de l'iPhone, ses usages ("*un téléphone, c'est pour téléphoner*"), et pourtant, toute la société s'est transformée, la concurrence a suivie, et tout le monde ou presque dispose aujourd'hui d'un smartphone (même moi pour le coup).
{{< video "Zf8iAR" >}}
La même chose arrivera avec les casques VR, et je suis absolument convaincu que celui d'Apple est une pierre angulaire du marché.
Cela fait depuis trop longtemps que les initiatives sont timides et réservées à un marché de "niche" (le jeu-vidéo).
Celui d'Apple peut concrétiser d'autres usages [plus intelligent que les métaverses](/interets/informatique/2022/01/26/reflexions-sur-les-metaverses/).
Rappelez-vous : je n'avais aucun intérêt pour les casques VR avant cette conférence.
Je n'ai jamais eu l'envie d'en posséder un, parce que je n'y voyais aucun intérêt.
Apple m'a montré aujourd'hui des usages concrets qui n'ont rien à voir avec le jeu vidéo, une conception intelligente parce qu'ouverte (le casque ne cherche pas à nous immerger dans ce qu'on fait au mépris de la réalité), qui va potentiellement remplacer mon double-écran et mon ordinateur de travail au profit de quelque chose d'à la fois plus vaste et moins encombrant, de plus puissant et versatile, de plus fun et pratique.
{{< video "fubVNP" >}}
J'insiste, on verra si je me trompe plus tard : **on assiste là à une transformation radicale des usages des casques VR**, vers quelque chose d'utile et pérenne.
La vision d'Apple est mature, intelligente, et je doute qu'ils se soient lancés là-dedans pour que ça fasse un flop.
**Ce casque est l'avenir**, et j'en veux un.

View File

@@ -0,0 +1 @@
file: images/WEgyO3.jpeg

View File

@@ -0,0 +1 @@
file: images/oRGwVZ.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 MiB

View File

@@ -0,0 +1,70 @@
---
date: '2023-06-08'
title: Jurassic June façon LEGO
---
[*Jurassic Park*](/critiques/films/jurassic-park/) est sorti au cinéma le 11 juin 1993 ; par conséquent, on fête cette année ses 30 ans.
Le mois de juin 2023 est appelé par les fans le *Jurassic June*, le "mois de juin Jurassique" pour les anglophobes.
J'ai un peu anticipé cette célébration puisque je vous ai déjà parlé du [set 76956](/collections/lego/jurassic-world/76956/), mais je ne me suis pas arrêté en si bon chemin.
Le fabriquant des célèbres briques de construction a sorti pas moins de cinq nouveaux sets spécialement pour l'évènement.
Évidemment, j'ai fait main basse sur les cinq sets, faible que je suis...
![oRGwVZ](images/oRGwVZ.jpeg)
Ils feront tous l'objet d'un article spécifique dans les jours à venir, mais j'avais envie de faire un peu de *teasing*, et de parler de ces sets avec un point de vue global avant de parler spécifiquement de chacun d'entre eux dans la section [Collectables](/collections/), comme je le fais d'habitude.
Commandés le jour de leur sortie (le 1er juin), ils ont été expédiés le 6.
Pour la petite histoire, le 2 juin, il y en avait déjà deux en rupture de stock (mais ils ont été réapprovisionnés depuis).
Je suis content de ne pas avoir lambiné...
Chronoposte m'envoie son traditionnel message pour me prévenir que le colis est en route, et je peux laisser des instructions au livreur.
Il faut savoir que quand j'attends un colis, je suis *toujours* en mode *suricate* : je suis aux aguets, prêt à sauter devant le camion de livraison si c'est nécessaire.
Sauf que parfois, une fois tous les trois ans, le livreur se trompe de destinataire.
Donc pour m'éviter ça, j'ai laissé le message suivant au livreur (sachant que le message est forcément *très* court) : "*Je serai chez moi, je vous attends !*".
Au passage, avec le suivi de colis, j'ai pu voir où le livreur s'est arrêté pour manger 🤣.
Donc, quand il débarque chez moi, après m'avoir tendu le colis, il me dit : "*Alors comme ça vous m'attendiez ?*", avec un petit sourire mais un peu inquiet de ma santé mentale quand même...
Je lui réponds fièrement : "*Comme un gosse attend le Père Noël !*".
On s'est marrés, il est parti livrer, je suis parti jouer.
![WEgyO3](images/WEgyO3.jpeg)
Désolé pour le reflet de la lumière sur la photo, mais j'étais trop excité pour choisir un meilleur angle, donc vous n'aurez pas mieux !
Vous constaterez un intrus parmi ces sets.
En effet, j'ai bénéficié d'une offre promotionnelle de la part de LEGO : [le set 40589, Laire de jeux du bateau pirate](https://www.lego.com/fr-fr/product/pirate-ship-playground-40589?icmp=LP-SHSB-Standard-NO_Sidekick_40589_Pirate_Ship_Playrgound_GWP_PP-P-NO-FZLDKPWN4J-1), un set tout mignon que mon épouse a bien aimé assembler !
Bon, déjà, il y a le plaisir de recevoir un gros carton.
Ça, je ne m'en lasserai jamais.
Ensuite, dans le carton, il y a plein de cartons plus petits (six en l'occurrence), imaginez ma joie.
On notera que ces sets adoptent un thème de couleurs parfaitement calibrées pour l'occasion (le rouge et vert avec des rayures rappelant le *covering* des [Ford Explorer](/collections/matchbox/jurassic-world/1128/)) en plus d'arborer un badge commémorant les 30 ans du film.
Pas de doute, ce sont bien des sets exclusifs.
On notera ensuite qu'ils couvrent plusieurs gammes d'âges compris entre 4 et 12 ans.
Ce ne sont donc pas des sets particulièrement gros : leur prix se justifie par le *fan-service*, pas par leur nombre de pièces.
Le plus petit ([76957, L'évasion du vélociraptor](https://www.lego.com/fr-fr/product/velociraptor-escape-76957)) contient 137 pièces et se paye 37.99€ (environ 0.28€ par pièce), alors que le plus gros ([76961, Le centre des visiteurs : lattaque du T. rex et du vélociraptor](https://www.lego.com/fr-fr/product/visitor-center-t-rex-raptor-attack-76961)) en contient 693 pour 129.99€ (environ 0.19€ par pièce).
À titre de comparaison, j'ai payé le [76956, Lévasion du T. rex](/collections/lego/jurassic-world/76956/) 99.99€ pour 1212 pièces (soit 0.08€ par pièce).
Traitez-moi de pigeon si vous voulez, mais je m'en fout, je suis content.
Je suis content parce qu'à l'exception du 76957[^note], chacun de ces sets nous fait revivre une scène particulièrement intense ou intéressante du film : la découverte du *Brachiosaurus*, le *Triceratops* malade, Dennis Nedry attaqué par le *Dilophosaurus* et le centre des visiteurs, avec son *T. rex* et un des *Velociraptor*.
Au fil du montage, les images du film reviennent.
Ce n'est pas pour rien que je me prévois un marathon de la saga ce week-end...
[^note]: Le set 76957, *L'évasion du vélociraptor*, s'adresse aux plus jeunes (4 ans et plus).
Bien qu'il s'agisse du plus petit des cinq sets exclusifs, il contient pas moins de trois livrets d'instructions, parce que l'approche est très didactique.
Du fait de sa simplicité, il est moins fidèle au film que les autres.
La vraie plus-value de ce set est à rechercher du côté de la minifig du personnage de Robert Muldoon qui, à ma connaissance, n'existe dans aucun autre set.
On constate aussi l'omniprésence du personnage d'Ellie Sattler, présente dans quatre sets sur les cinq !
Alan Grant n'est présent "que" dans deux des sets.
Heureusement, LEGO a varié les tenues, les coiffures et les expressions des visages.
On trouvera également Ian Malcom, Tim et Lex Murphy, Ray Arnold, Dennis Nedry, bien évidemment John Hammond mais aussi le Dr Wu.
Autrement dit, ces cinq sets regroupent au moins une minifig de chaque personnage principal ou secondaire - à l'exception de Donal Gennaro et Lewis Dodgson.
*Fan-service* assuré !
Pour finir, un mot sur les dinosaures (quand même) : leur esthétique est conforme aux productions LEGO dérivées de la saga.
C'est un plaisir tout particulier de manipuler "en vrai" les dinosaures vus, entre autres, dans [*La légende d'Isla Nublar*](/critiques/series/lego-jurassic-world-legend-of-isla-nublar/).

View File

@@ -0,0 +1,434 @@
---
date: '2023-06-10'
title: Tentative de remplacement de Drone-CI par Gitea Actions sous NixOS
---
## Contexte
J'utilise [Drone-CI](https://www.drone.io) depuis un moment maintenant, pour faire tout un tas de choses sympathiques :
- publier des nouveaux articles sur ce blog
- vérifier et compiler les firmwares utilisés dans ma domotique
- lancer des tests unitaires et fonctionnels sur mes applications
- etc.
Ce qui m'embête avec Drone, c'est qu'il n'y a pas de package ([avec options](https://search.nixos.org/options?channel=23.05&from=0&size=50&sort=relevance&type=packages&query=services.drone)) pour [NixOS](https://nixos.org/).
Du coup, je dois le lancer dans un container docker avec toute l'infrastructure que ça suppose.
C'est assez simple avec NixOS, mais à l'usage, cela occasionne beaucoup de maintenance, parce que NixOS ne met pas à jour automatiquement les containers docker (non sans raison).
La maintenance habituelle consiste donc à se rappeler de mettre à jour les containers (probablement l'étape la plus pénible), lancer quelques commandes `docker pull` sur ceux qui ont été mis à jour, nettoyer les vieilles images, etc.
Donc, moins j'ai de containers docker, mieux je me porte, sans même aborder les questions de philosophie personnelle.
[Gitea](https://gitea.io/en-us/) a introduit il y a peu la version [1.19](https://blog.gitea.io/2023/03/gitea-1.19.0-is-released/), et avec elle, [Gitea Actions](https://docs.gitea.com/next/usage/actions/overview), son propre système d'automatisation (plus qu'une simple CI-CD), dont tout le concept est pompé sur Github Action.
La compatibilité est très large, de quoi s'assurer une migration facile des utilisateurs depuis Github vers leur propre plateforme.
Et NixOS dispose depuis la version 23.05 des paquets qui vont bien : la maintenance se limitera à la mise à jour du système via la traditionnelle commande `nixos-rebuild switch --upgrade`, et basta.
## Activation de Actions dans Gitea
```nix {linenos=false,class=not-prose}
{
services.gitea = {
# ...
settings = {
#...
actions = {
ENABLED = true;
DEFAULT_ACTIONS_URL = "<URL de votre instance Gitea>";
};
};
};
}
```
Précision importante : les "actions" qui seront exécutées correspondent à des dépôts git distants qui contiennent le code nécessaire à leur exécution.
Dans le cas de Github Action, ces dépôts distants sont tous hébergés par Github et accessibles depuis le [marketplace](https://github.com/marketplace).
Dans le cas de Gitea, les actions sont hébergées n'importe où, Github compris, mais par défaut, elles seront récupérées depuis Gitea.
Or, toutes les actions du marketplace de Github **ne sont pas** disponibles depuis Gitea.
Le paramètre [`DEFAULT_ACTIONS_URL`](https://docs.gitea.com/next/usage/actions/faq#where-will-the-runner-download-scripts-when-using-actions-such-as-actionscheckoutv3) est optionnel : s'il est laissé vide, Gitea Actions tentera de récupérer l'action correspondante depuis Gitea (à moins qu'une URL absolue ne soit fournie dans le workspace, mais nous verrons ça plus tard).
La philosophie du concept appelle à auto-héberger les actions dont on a besoin sur sa propre instance de Gitea.
En renseignant l'URL de votre propre instance dans ce paramètre, vous direz à Gitea d'aller chercher les actions demandées sur votre instance de Gitea, pour toute action dont on utilisera la notation courte (donc hors URL absolue).
## Installation d'un runner
L'installation d'un [runner](https://docs.gitea.com/next/usage/actions/act-runner) est facile mais nécessite certaines précisions.
Tout d'abord, il faut obtenir un token depuis Gitea.
Selon où vous le demandez, il est possible que le runner soit attribué à un unique projet, à une organisation, ou à toutes les organisations de l'instance.
Dans tous les cas, c'est dans les paramètres (du projet, de l'organisation, ou de l'instance de Gitea) qu'il faut aller, puis dans l'onglet "*Runners*".
On clique ensuite sur le bouton "*Create runner*", et on copie le token.
Pour intégrer ce token à notre configuration de NixOS, nous avons plusieurs options :
1. coller le token directement dans la configuration : c'est peu sécurisé, surtout si versionnez votre configuration de NixOS
2. coller le token dans un fichier d'environnement, où il prendra la valeur d'une variable nommée `TOKEN`
3. coller le token dans un fichier simple qui sera lu par NixOS au moment de la reconfiguration : c'est l'option que j'ai choisi, simplement pour des raisons cosmétiques
Considérons mon bloc de configuration :
```nix {class=not-prose}
{
services.gitea-actions-runner = {
instances = {
nom-du-runner = {
enable = true;
name = "<nom du runner>";
url = "<URL de votre instance Gitea>";
token = builtins.readFile ./gitea-actions-runner-token;
labels = [
"ubuntu-latest:docker://node:18-bullseye"
"native:host"
];
};
};
};
}
```
Commençons par préciser que l'on peut disposer de plusieurs runners sur la même machine, quoique pour des raisons de performances, on évitera.
Chaque runner doit porter un nom unique qui l'identifiera dans Gitea.
On se servira de ce nom plus tard, dans le cas où l'on veut cibler un runner particulier au sein d'une action donnée.
Le nom du runner sera à ajuster, ici aux lignes 4 et 6.
### Option 2 : token dans un fichier d'environnement
Pour le token, si vous choisissez de le coller dans un fichier d'environnement, il faut créer le fichier avec le contenu suivant :
```ini {linenos=false,class=not-prose}
TOKEN="<token>"
```
Où, évidemment, on remplacera `<token>` par le token copié précédemment.
Du coup, la ligne 8 doit être modifiée, et le paramètre doit pointer vers le fichier ainsi créé :
```nix {linenos=false,class=not-prose}
tokenFile = ./gitea-actions-runner.env;
```
### Option 3 : token dans un fichier simple
Si vous avez plutôt choisi la troisième option, NixOS va peupler le paramètre `token` avec le contenu d'un fichier qu'il va lire au moment de la reconfiguration (c'est ce que fait `builtins.readFile`).
La création de ce fichier se fait avec la commande suivante :
```shell {linenos=false,class=not-prose}
echo -n "<token>" > ./gitea-actions-runner-token
```
Pour rappel, l'option `-n` permet d'éviter la ligne vide en fin de fichier (ce qui invaliderait le token), et là aussi, on remplacera `<token>` par le token copié précédemment.
***
Ensuite, on doit configurer des [labels](https://docs.gitea.com/next/usage/actions/act-runner#labels).
En - très - gros, il s'agit d'associer un nom à un container dans lequel seront exécutées les actions ou à la machine hôte.
Le package NixOS [ne propose pas encore de valeur par défaut](https://search.nixos.org/options?channel=23.05&show=services.gitea-actions-runner.instances.%3Cname%3E.labels&from=0&size=50&sort=alpha_asc&type=packages&query=gitea), et ce paramètre ne peut pas être vide.
Heureusement, la documentation de Gitea nous indique les valeurs utilisées par défaut par l'exécutable - mais sont obsolètes. Je me suis inspiré de la valeur d'exemple donnée par NixOS pour ma propre configuration.
Dans l'exemple que je vous montre, je pourrai lancer mes actions sur "*ubuntu-latest*", qui correspond à l'image docker de nodejs v18 sur une debian bullseye.
Et ce n'est qu'en écrivant ces lignes que je me rends compte que cet exemple est mauvais : le label *ubuntu-latest* ne correspond en rien à l'image utilisée...
Je propose au lecteur, en guise d'exercice, de modifier cette ligne comme bon lui semblera 😊
Autre label que j'utilise, `native:host`, qui permettra de lancer les actions sur la cible `native`, la machine hôte.
Pour des raisons de sécurité, c'est déconseillé dans le cas où vous ne maîtrisez pas les actions qui seront lancées (par exemple, si vous avez des dépôts publics accessibles en écriture).
Dans mon cas, où personne à part moi n'a accès en écriture à mon instance, je peux me le permettre.
## Mise à jour de la configuration
Il ne reste plus qu'à faire :
```shell {linenos=false,class=not-prose}
nixos-rebuild switch
```
Et tout devrait s'installer sans problème.
## Actions !
Arrivé là, vous avez un Gitea Actions fonctionnel, il faudra juste se farcir la documentation des [Actions de Github](https://docs.github.com/en/actions).
Vous n'êtes pas obligé de lire ce qui vient parce que je vais râler fort, vous voilà prévenu.
Bon, là, je vous avoue, ça se corse un peu.
Je n'ai **jamais** utilisé Github Action, donc j'avance en terre inconnue.
Et honnêtement, pour le moment, ça ne me donne pas vraiment envie.
Autant évacuer tout de suite mes griefs.
Je trouve ça absurdement compliqué.
Comparé à Drone, où l'on lance un container docker dans lequel on exécute une série de commandes, avec Actions, on effectue grosso-modo un `git clone` de chaque dépôt correspondant à une action.
Si le processus comprend 20 actions, il y aura 20 clonages à faire.
Prenons un exemple concret : la publication de mon blog.
### Clonage
La première étape de tout processus en CI-CD consiste à obtenir un accès au code source, et cela passe généralement par le clonage du dépôt d'origine.
Avec Gitea Actions, cela passe - par exemple - par le "code" yaml suivant :
```yaml {linenos=false,class=not-prose}
- name: Récupération des sources
uses: actions/checkout@v3
```
Donc, pour récupérer **mes** sources sur **mon** serveur, il faut d'abord cloner le dépôt https://github.com/actions/checkout.
Surprise : c'est tout en javascript.
Le redistribuable pèse pas loin d'1Mo de javascript, et [les sources](https://github.com/actions/checkout/tree/main/src) sont imbitables et en plus pas documentées.
Mais que fait donc tout ce javascript que le binaire `git` ne fait pas, à part quelques options de configuration ?
Est-ce que 1Mo de javascript sont nécessaires pour passer de :
```shell {linenos=false,class=not-prose}
git clone <URL de mon dépôt>
```
à :
```yaml {linenos=false,class=not-prose}
- name: Récupération des sources
uses: actions/checkout@v3
```
?
Réponse partielle : si l'exécutable `git` n'est pas disponible sur le système, on passe par l'API de Github et là ça se complique vraiment.
En outre, j'ai remarqué quelques portions de code consacrées à la télémétrie...
Donc, premier grief, on retrouve la philosophie nodejs de télécharger la moitié d'internet pour lancer une simple commande.
Et, puisque j'ai choisi d'auto-héberger les actions, je m'inflige l'obligation de garder les dépôts locaux synchronisés avec les dépôts distants.
Deuxième grief, la télémétrie, donc.
Surtout quand elle n'est pas mentionnée dans la documentation, et qu'elle n'est pas optionnelle.
Comme quoi, ce n'est pas parce qu'on opte pour la [licence MIT](https://github.com/actions/checkout/blob/main/LICENSE) qu'on est forcément très transparent...
Troisième grief, l'option [LFS](https://git-lfs.com/).
J'utilise LFS pour stocker différents médias utilisés notamment sur mon blog, tels que les images et les vidéos.
Pour "activer" l'usage de LFS, il faut rajouter une ligne :
```yaml {linenos=false,class=not-prose}
- name: Récupération des sources
uses: actions/checkout@v3
with:
lfs: true
```
Je soupçonne là encore une intégration avec l'API de Github, parce qu'au niveau de git, il n'est nullement nécessaire de préciser qu'on veut utiliser LFS lors d'un `git clone`.
Mais sans cette option, le clonage de mon dépôt se fait sans LFS *sans que je sois au courant*.
Ce n'est que bien plus tard, lors de la compilation des fichiers du site, que Hugo plante en essayant d'accéder à des fichiers qui n'existent pas.
Et c'est symptomatique d'absolument **tout** l'écosystème javascript (et Go, d'ailleurs) : **rien, absolument rien** n'est intuitif.
Tout est - mal - repensé, tout est superposition d'abstractions, et un utilisateur habitué à utiliser des outils de bas niveau ne comprend plus rien au fonctionnement des applications.
Ce fonctionnement contre-intuitif m'a forcé à remettre en question toute la chaîne de production de mon blog : est-ce que j'ai introduit un bug dans la gestion des images ? est-ce que j'utilise la bonne version d'Hugo ? me manque-t'il une dépendance ? pourquoi ça fonctionne sous Drone et pas sous Actions ? quelles différences entre les images dockers ? etc.
À aucun moment je n'ai eu droit à un message *explicite*.
Et c'est encore une fois symptomatique de la philosophie moderne du développement : on doit cacher les erreurs et les problèmes à l'utilisateur pour ne pas créer de situations anxiogènes.
On n'arrête l'exécution d'un processus qu'en cas de situation critique.
On doit poursuivre l'exécution coûte que coûte.
Résultat, Hugo refuse de compiler certains templates parce que le "format d'une image est incorrect".
Je modifie le template en question, essayant de corriger un bug qui n'existe pas.
Je relance la CI, je dois attendre d'arriver à la compilation des ressources après avoir téléchargé la moitié d'Internet pour la centième fois, et constater que le "bug" s'est "étendu" à d'autres fichiers.
Quand une application me dit "format d'image incorrect", je me dis qu'il manque une librairie particulière (du genre *libpng* ou *libjpeg*).
Je ne pense pas du tout à activer une option yaml pour que le clonage se fasse avec LFS...
C'est pas fini...
### Hugo
Prochaine étape, "initialiser" [Hugo](https://gohugo.io/).
Cela passe par l'action [actions-hugo](https://github.com/peaceiris/actions-hugo), qui permet de choisir une version du générateur de sites statiques, entre autres.
```yaml {linenos=false,class=not-prose}
- name: Initialisation de Hugo
uses: actions/actions-hugo@v2
with:
hugo-version: "latest"
extended: true
```
Ce n'est pas comme s'il était déjà installé dans mon image docker... (qui diffère de celle proposée dans la configuration du runner donnée plus haut).
Donc, pareil : le dépôt de l'action est cloné, Hugo est téléchargé...
Heureusement que [je suis enfin passé à la fibre optique](/interets/informatique/2023/03/17/passage-a-la-fibre-optique/), j'imagine le temps que ça m'aurait pris de débugguer tout ça sur de l'ADSL...
### Nodejs
De façon similaire à Hugo, il faut initialiser nodejs...
```yaml {linenos=false,class=not-prose}
- name: Initialisation de node.js
uses: actions/setup-node@v3
with:
node-version: "latest"
```
Rebelotte, encore [un dépôt externe](https://github.com/actions/setup-node) à cloner.
### Installation des dépendances et compilation
Ça y est, c'est l'étape où je peux faire un `npm i` pour installer quelques dépendances pour construire mon blog.
C'est littéralement l'étape 1 dans un processus exploitant Drone :
```yaml {linenos=false,class=not-prose}
kind: pipeline
type: docker
name: publish
steps:
- name: build
image: klakegg/hugo:ext-alpine-ci
commands:
- npm i
- npm run prod
```
Pour le coup, cette étape ne présente aucune difficulté avec Gitea Actions (même si je l'ai scindée ici), rien à cloner :
```yaml {linenos=false,class=not-prose}
- name: Installation des dépendances
run: npm i
- name: Construction du site
run: npm run prod
```
### Déploiement
Dernier clou dans le cercueil de Gitea Actions : impossible, dans la version 1.19.3 fournie par NixOS, d'exploiter les secrets nouvellement introduits pour stocker une clé privée.
Sauf que là encore, aucun message d'erreur n'est assez explicite pour me le dire.
Mais c'est de ma faute, j'aurai dû mieux lire ce qui est à l'écran avant de me plaindre.
Explications.
Pour déployer, je passe par `rsync`.
J'ai donc besoin de quelques informations de base mais qui doivent rester confidentielles, notamment l'utilisateur SSH et sa clé privée.
Ça tombe bien, Gitea a introduit le stockage de [secrets](https://docs.gitea.com/next/usage/secrets) dans sa version 1.19, justement pour qu'on puisse s'en servir dans les actions.
Tout à la fois content de trouver cette fonctionnalité assez attendue parmi les utilisateurs et inquiet qu'un truc tourne mal, je renseigne vite fait les quelques secrets dont j'ai besoin - dont cette fameuse clé privée - et j'ajoute l'action à mon projet :
```yaml
- name: Déploiement
uses: https://github.com/easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: $@{{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-rlgoDzvc -i --delete"
SOURCE: "public/"
REMOTE_HOST: $@{{ secrets.SSH_HOST }}
REMOTE_USER: $@{{ secrets.SSH_USER }}
TARGET: $@{{ secrets.TARGET }}
EXCLUDE: "/node_modules/"
```
Je lance, j'attends qu'on arrive à cette étape, et ça crashe, avec un message me disant que ma clé est invalide, dans une magistrale illustration de ma remarque d'avant (on poursuit d'exécution quoiqu'il arrive).
L'action a spammé mon serveur SSH après son infructueuse tentative d'utilisation de ma clé "invalide", continuant chaque étape comme si la clé avait été acceptée, pour faire... je ne sais pas trop quoi en fait, je voulais juste un `rsync` moi...
``` {linenos=false,class=not-prose}
[DIR] Creating /***/.ssh dir in workspace ***
✅ [DIR] dir created.
[FILE] writing /***/.ssh/known_hosts file ... 0
✅ [SSH] known_hosts file ensured /***/.ssh
✅ [DIR] /***/.ssh dir exist
[FILE] writing /***/.ssh/deploy_key_***_1686345375116 file ... 457
✅ [SSH] key added to `.ssh` dir /***/.ssh deploy_key_***_1686345375116
rsync version 3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
symtimes, prealloc, stop-at, no crtimes
Optimizations:
SIMD, asm, openssl-crypto
Checksum list:
xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
zstd lz4 zlibx zlib none
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
✅️ [CLI] Rsync exists
[Rsync] Starting Rsync Action: /workspace/Blog/interets/informatique/public/ to ***@***:***
[Rsync] excluding folders /node_modules/
Warning: Permanently added '***' (ED25519) to the list of known hosts.
Load key "/***/.ssh/deploy_key_***_1686345375116": invalid format
Permission denied, please try again.
Permission denied, please try again.
Received disconnect from *** port 22:2: Too many authentication failures
Disconnected from *** port 22
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
❌ [Rsync] error:
Error: rsync exited with code 255
at ChildProcess.<anonymous> (/run/act/actions/https---github.com-easingthemes-ssh-deploy@main/dist/index.js:2:2603)
at ChildProcess.emit (node:events:511:28)
at ChildProcess._handle.onexit (node:internal/child_process:293:12) {
code: 255
}
❌ [Rsync] stderr:
Warning: Permanently added '***' (ED25519) to the list of known hosts.
Load key "/***/.ssh/deploy_key_***_1686345375116": invalid format
Permission denied, please try again.
Permission denied, please try again.
Received disconnect from *** port 22:2: Too many authentication failures
Disconnected from *** port 22
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
❌️ [Rsync] stdout:
❌ [Rsync] command:
================================================================
rsync /workspace/Blog/interets/informatique/public/ ***@***:*** --rsh "ssh -p 22 -i /***/.ssh/deploy_key_***_1686345375116 -o StrictHostKeyChecking=no" --recursive --exclude=/node_modules/ -rlgoDzvc -i --delete
================================================================
❌ [ERROR] rsync exited with code 255
Warning: Permanently added '***' (ED25519) to the list of known hosts.
Load key "/***/.ssh/deploy_key_***_1686345375116": invalid format
Permission denied, please try again.
Permission denied, please try again.
Received disconnect from *** port 22:2: Too many authentication failures
Disconnected from *** port 22
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
```
Pourtant, cette même clé privée était utilisée par Drone depuis quelques années, sans le moindre problème.
En fait, c'est Gitea qu'il faut pointer du doigt ici.
Le formulaire pour soumettre un secret [supprime les espaces et les lignes vides](https://github.com/go-gitea/gitea/issues/24721), au début et *à la fin* de la chaîne soumise.
Or, une ligne vide est exigée en fin de chaîne pour qu'une clé privée soit considérée valide.
Et Gitea m'a prévenu : dans la zone de texte, où je colle ma clé privée, il est clairement indiqué que les espaces vides au début et en fin de chaîne seront supprimés, ce que je n'ai vu qu'après une journée de recherche de tout ce qui peut bien merder avec ma clé privée.
Et comme c'est un secret, je ne peux même pas essayer de l'afficher pour la débugguer, et vu qu'elle aurait de toute façon été formatée pour l'affichage dans l'onglet de la CI, je n'aurai probablement pas vu que la ligne vide finale était absente.
Mais de toute façon, je ne cherchais pas un problème avec ma clé de prime-abord puisqu'elle a toujours fonctionné.
J'ai cherché un problème dans la gestion des secrets, leur expression, et leur usage, qui se fait avec les outils de templating de Go, et [qui m'insupportent](/interets/informatique/2022/02/12/rant-hugo-et-tailwind/).
## Conclusion
J'ai perdu trop de temps pour arriver à un résultat non-fonctionnel.
C'est très dommage, parce le concept et son intégration sont bons, dans l'idée.
Ce système permet l'exécution des actions par matrices, ce qui simplifie considérablement les tests sur plusieurs plateformes différentes (par exemple Laravel 9 avec PHP 7 et PHP 8 d'une part, Laravel 10 et PHP 8 d'autre part).
Il permet aussi le partage d'actions préfabriquées par la communauté.
Mais tant que le système devra s'appuyer sur les actions Github existantes, il sera grévé par du code de mauvaise qualité, dans lequel on ne peut pas avoir confiance, et qui a le potentiel d'introduire du code malveillant dans des composants plutôt sensibles de la chaîne de production de code, et ce de façon à peu près inaperçue.
Avec Drone, on choisi bien son container docker, ou on le construit soi-même, et c'est tout : chaque étape est une simple commande.
L'intégration n'est pas aussi poussée que Gitea Actions, ce qui n'est pas forcément une mauvaise chose tant que Gitea nous permet de faire ce qu'on veut avec les hooks.
Mais au moins, ça fonctionne, et si la moindre commande retourne une erreur, tout s'arrête.
Et en plus on peut être notifié via des canaux de boomers, genre les emails.
Sérieusement, dans le milieu Go/JS, vous savez qu'il y a des alternatives à Slack ?
Du coup, pour le moment, Gitea Actions, c'est non pour moi.
Le logiciel est léger, mais ce qui en est fait est d'une lourdeur et d'une pénibilité bien supérieure à celle de maintenir un container docker.
Les habitués de Github ne devraient pas avoir trop de mal à s'en sortir, ils continueront probablement d'utiliser les actions qu'ils ont toujours utilisé.
Mais moi qui n'y ais jamais mis les pieds, c'est, je le répète, absurdement compliqué.
En ce qui me concerne, j'arrête Gitea Actions, et je vais creuser du côté de [Woodpecker](https://woodpecker-ci.org/), fork de Drone qui dispose de paquets pour NixOS.
Le pire c'est que pour une fois, je ne suis pas fier de mon *rant* : j'avais vraiment envie que ça fonctionne, que ça me plaise, que ça me corresponde, que ça m'enthousiasme.
Mais j'en suis très loin...

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View File

@@ -0,0 +1,80 @@
---
date: '2023-06-13'
title: Passage de NixOS à Pop!_OS sur ma machine de jeu
---
## Contexte
Depuis que [j'ai acquis mon nouveau PC de jeu](/interets/informatique/2022/04/15/mon-nouveau-pc-de-jeu-est-arrive/), je n'ai rien installé d'autre dessus que Windows 11 (qui était pré-installé en fait) et [NixOS](https://nixos.org).
Mais face à quelques difficultés mineures, j'ai décidé d'essayer [Pop!_OS](https://pop.system76.com).
Commençons par clarifier certains points :
- je ne remets pas en considération NixOS ou ses qualités ; cela reste mon système d'exploitation préféré pour mes serveurs, et dans ce cadre, je n'ai aucune raison de changer pour le moment
- les "problèmes" que je rencontre ne sont pas dus à NixOS mais à mon incapacité à comprendre ce que je dois faire pour les résoudre ; je rajoute que si l'envie me prenait d'investiguer plus avant, je finirai par trouver des solutions, mais pour l'heure, je n'ai pas envie de réfléchir : sur une machine de jeu, je veux jouer
NixOS m'a apporté le minimalisme, la configurabilité et la reproductibilité que l'on attend d'un ordinateur.
Pour un serveur, ce sont des qualités cruciales, gages de stabilité et de conformité à un environnement attendu.
Pour une machine desktop dont les usages sont très différents, ces qualités deviennent parfois des obstacles contre lesquels on doit se battre.
Ceci est du à une différence fondamentale de paradigme : sur un serveur, on veut que chaque service soit capable de fonctionner sans aucune interférence depuis ou vers les autres services.
On ne veut pas que la mise à jour d'une librairie donnée en vue d'utiliser une version spécifique d'un service entraîne l'incompatibilité d'un autre service.
Par conséquent, sur un serveur, on cherche l'atomicité : on va configurer chaque service avec soin, et NixOS nous évite de nous préoccuper des incompatibilités.
Sur un desktop, le paradigme est complètement différent : on veut (*je veux*) un ensemble cohérent, intégré, même si cela introduit des instabilités, des dysfonctionnements, ou des comportement inhabituels.
Il est presque toujours possible d'y remédier *a posteriori*, là où dans le cadre d'un serveur, on se doit d'anticiper et éviter l'introduction de problèmes.
Dit autrement, les exigences ne sont simplement pas les mêmes sur un serveur que sur une machine de jeu.
## Bugs et glitches
Or, j'ai eu quelques problèmes sur ma machine de jeu sous NixOS, invisibles sur certains jeux (les moins exigeants) mais rédhibitoires sur d'autres.
Des problèmes liés au pilote de la carte graphique et sa configuration, mais aussi, sans doute, liés à la configuration du noyau, et/ou de l'environnement de bureau.
Des problèmes que j'ai souvent vu au cours de ma vie, sur tout un tas de machines différentes.
Par conséquent, il est évident que le problème vient de l'interface chaise/clavier, et que je me suis révélé incapable ou trop fainéant pour jamais les résoudre.
Comme je le dis souvent, je n'aime pas qu'on me tienne la bite pour pisser, mais je me suis dit que, cette fois, j'allais essayer de faire confiance à un système d'exploitation orienté desktop, complet, mature, reposant sur des bases solides.
Si possible, orienté vers le jeu-vidéo.
Évidemment, SteamOS semble être le choix le plus approprié, mais à ma connaissance, Valve ne fournit plus d'image ISO à destination d'une installation PC du système d'exploitation.
[La page habituelle](https://store.steampowered.com/steamos/buildyourown) qui permettait de télécharger l'ISO en question n'offre à télécharger que l'image de recovery de SteamOS à destination du Steam Deck.
D'autres solutions existent ([Draugr](https://draugeros.org/) semble avoir quelque notoriété) mais j'ai choisi Pop!_OS parce que c'est un système que je suis depuis longtemps et qui, du coup, me semble être un projet pérenne.
Et grand bien m'en a pris puisque la plupart des problèmes que je rencontrais avec NixOS ont disparu au passage sous Pop!_OS.
Le problème majeur qui m'a décidé à changer concerne un bug graphique que j'ai presque toujours connu sous GNU-Linux mais que je n'ai jamais réussi à résoudre, ce qui me conforte dans l'idée qu'il provient d'un problème dans la configuration du noyau Linux.
![pTNHCJ](images/pTNHCJ.png)
L'image ci-dessus est tirée d'une conversation sur Internet de gens que je ne connais pas concernant un jeu auquel je ne joue pas : je n'ai pas pensé à prendre une capture pour illustrer cet article puisque je ne pensais pas que j'en ferai un article...
Néanmoins, c'est exactement ce à quoi ressemblent les bugs auxquels je suis moi-même confronté.
En outre, je constatais du *banding* et divers problèmes évoquant un gamma mal réglé sans que ce soit pour autant la cause réelle.
Ces problèmes concernaient les jeux en 3D, jamais les jeux en 2D, ce qui portait les soupçons sur OpenGL, Mesa, ou l'une des multitudes de librairies existantes liées à la 3D sous GNU-Linux, d'autant plus qu'aucun réglage dans le panneau de configuration Nvidia ne semblait avoir la moindre incidence.
Au final, ce sont des problèmes bien trop complexes pour moi, et j'ai abandonné toute tentative de résolution.
À la place, j'ai testé Pop!_OS, et ces problèmes n'existent plus.
Ce qui est dommage, c'est que je n'aurai pas le fin mot de l'histoire, je ne saurai peut-être jamais quelle est la cause de ces problèmes.
## Autres considérations
Mis à part la résolution de ces problèmes par je ne sais quelle sorcellerie, Pop!_OS me semble être un système desktop tout à fait satisfaisant.
Basé sur Ubuntu, et connaissant bien ces fondations, je suis à l'aise pour gérer les quelques points très personnels de l'environnement (c'est-à-dire, qui se gèrent exclusivement à la console).
En outre, j'ai décidé de demander à cette machine un peu plus que faire tourner mes jeux : il me paraissait intéressant de pouvoir au moins rédiger quelques articles pour mon blog sans avoir à basculer sur mon Mac Mini, notamment le présent billet mais aussi mes futures critiques de jeux-vidéo.
Sur ces points, Pop!_OS rempli parfaitement son office, en plus de m'offrir une expérience visuelle un peu plus agréable que XFCE (par défaut).
C'est évidemment moins minimaliste, mais c'est aussi plus confortable pour faire autre chose, de temps en temps, que du jeu vidéo.
Néanmoins, je ressens une nette différence avec NixOS sur ce point-clé que j'abordais avant.
Écrire une ligne dans un fichier de configuration pour installer une application, pour s'assurer de son existence et de son fonctionnement, c'est un luxe que je n'ai pas ici.
Pop!_OS me rappelle que je suis dans un environnement "traditionnel", "*mainstream*", et que l'installation d'un paquet a un effet immédiat, mais je n'ai pas vraiment de contrôle dessus (ou plus exactement, je ne maîtrise pas les effets de bord de son installation).
C'est un sentiment qui m'est difficile à décrire.
J'ai l'impression que chaque action que j'exécute sur la machine va avoir une incidence sur les autres.
Comme si, simplement en installant une application ou une librairie, même qui n'a rien à voir avec le jeu-vidéo, j'allais provoquer la réapparition des problèmes évoqués plus haut.
Ce sentiment est totalement inconnu sous NixOS.
En fait, NixOS a introduit chez moi l'anxiété des environnements traditionnels (pardonnez-moi l'abus de language mais c'est une illustration : "non-reproductibles").
Comme j'essaye de le faire à chaque fois, j'écrirai un nouvel article de retour d'expérience dans quelques mois, mais pour l'heure, je vais pouvoir jouer un peu...

View File

@@ -0,0 +1 @@
file: images/4yd01I.png

View File

@@ -0,0 +1 @@
file: images/Feu5EX.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

View File

@@ -0,0 +1,97 @@
---
date: '2023-06-17'
title: Migration vers Woodpecker
---
Après avoir testé [Gitea Actions](/interets/informatique/2023/06/10/tentative-de-remplacement-de-drone-ci-par-gitea-actions-sous-nixos/) (et, spoiler alert, ne pas avoir été convaincu), je poursuis ma quête du remplacement de [Drone](https://www.drone.io/) en tant que CI/CD.
J'ai donc essayé (et, spoiler alert, adopté) [Woodpecker](https://woodpecker-ci.org/), fork de Drone.
Pour rappel, la principale raison pour laquelle je souhaite me débarrasser de Drone est l'absence d'intégration avec NixOS.
On pourra m'objecter que je n'ai "qu'à le faire moi-même", mais je sais reconnaître quand je ne suis pas capable de faire quelque chose.
Le fait est que, à l'heure actuelle, Drone tourne dans un container docker, et je n'en veux plus.
Donc, Woodpecker.
Note : la configuration proposée ici doit être adaptée en fonction de **vos** prérogatives.
En ce qui me concerne, Caddy fait office de reverse-proxy, ma CI/CD est interfacée à Gitea, et Gitea n'est que partiellement ouverte au reste du monde.
## Installation
Sous NixOS, la migration est plutôt facile.
Il suffit de supprimer les déclarations concernant Drone, et d'ajouter celles pour Woodpecker.
```nix {class=not-prose}
{
services.woodpecker-server = {
enable = true;
environment = {
# Enable at first launch
# WOODPECKER_OPEN = "true";
WOODPECKER_SERVER_ADDR = ":10081";
WOODPECKER_HOST = "https://<FQDN de votre CI>";
WOODPECKER_GITEA = "true";
WOODPECKER_GITEA_CLIENT = builtins.readFile ../secrets/services/woodpecker/gitea-client-id;
WOODPECKER_GITEA_SECRET = builtins.readFile ../secrets/services/woodpecker/gitea-client-secret;
WOODPECKER_GITEA_URL = "https://<FQDN de votre instance de Gitea>";
WOODPECKER_AGENT_SECRET = builtins.readFile ../secrets/services/woodpecker/agent-secret;
};
};
services.woodpecker-agents.agents = {
minisforum-u820 = {
enable = true;
extraGroups = [
"docker"
];
environment = {
WOODPECKER_SERVER = "localhost:9000";
WOODPECKER_AGENT_SECRET = builtins.readFile ../secrets/services/woodpecker/agent-secret;
};
};
};
}
```
Dans mon cas, le serveur Woodpecker écoute sur le port 10081 sur `localhost` (je charge Caddy de faire le reverse-proxy pour que ma CI soit joignable depuis `WOODPECKER_HOST`).
J'ai repris les mêmes secrets que Drone, stockés dans les fichiers lus avec `builtins.readFile`, je les ai juste mis à un emplacement plus approprié.
Un mot concernant la ligne 6 : il faut la décommenter avant d'accéder à l'interface web de Woodpecker, sinon il ne lui sera pas possible de s'enregistrer auprès de Gitea.
En ce qui me concerne, je veux que ce soit Gitea qui gère les comptes utilisateurs, je n'ai pas envie/besoin de gérer d'autres comptes depuis Woodpecker.
C'est la raison pour laquelle, une fois l'étape initiale accomplie, je commente à nouveau cette ligne, de sorte à ce que personne ne puisse s'enregistrer sur ma CI/CD à part moi.
Si vous souhaitez ouvrir votre instance à l'extérieur, la ligne 6 est requise et la variable `WOODPECKER_OPEN` doit valoir `"true"`.
Le reste est en tout point identique à la configuration habituel de Drone, exception faite du nom des variables, et de l'obligation d'ajouter l'agent au groupe `docker`, puisque c'est désormais une application "native" et non plus un container.
On notera que l'adresse du serveur déclarée à la ligne 24 est celle du serveur RPC de Woodpecker, et non l'adresse à laquelle on peut afficher l'interface web de Woodpecker.
## Critique
Woodpecker est, visuellement, encore assez brut de décoffrage.
Ce n'est ni beau ni moche, mais au moins il y a un thème sombre et je ne me brûle plus les yeux...
Les contrastes devront être revus par contre.
![4yd01I](images/4yd01I.png)
![Feu5EX](images/Feu5EX.png)
Pas de coloration syntaxique dans les pipelines, les icônes sont placées de façon peu harmonieuse.
Ce sont des détails cosmétiques : ils n'enlèvent rien aux qualités intrinsèques de Woodpecker ; ce sont simplement des témoins de la jeunesse du projet (version 0.15.3 à l'heure où j'écris ces lignes).
Ce qui m'embête - un peu - plus, c'est la déclaration des pipelines.
Les auteurs de Woodpecker semblent avoir eu l'intelligence de supporter la structure de Drone (via le traditionnel fichier *.drone-ci.yml*) tout en poussant à une nouvelle structure spécifique à Woodpecker (dans un fichier *.woodpecker.yml*).
Cependant, la structure actuelle (de la version 0.15.3) diffère déjà de la structure qui sera proposée dans la prochaine version[^1].
[^1]: Voir la documentation actuelle : <https://woodpecker-ci.org/docs/usage/plugins/overview> (vérifiée le 29 février 2024)
C'est une critique dure que je fais ici, parce qu'en fin de compte les changements devraient être mineurs, et surtout, les pipelines de Woodpecker semblent moins "verbeuses" que celle de Drone, en tout cas pour le moment.
La structure du yaml est un peu simplifiée, et la simplification est - presque - toujours bienvenue.
## Conclusion
Il n'y a pas vraiment plus à en dire.
Woodpecker semble être une bonne alternative à Drone, dont elle est de toute façon l'héritière.
Disposant d'une intégration à NixOS, et à Gitea (tout en restant agnostique), Woodpecker remplit toutes les cases pour devenir le remplaçant de Drone dans mon écosystème.

View File

@@ -0,0 +1,142 @@
---
date: '2023-06-21'
title: Migration de pi-hole vers AdGuard Home et digression
---
> Attention, je deviens vulgaire au cours de cet article.
Je continue de supprimer mes services sous docker afin de privilégier des solutions natives à NixOS.
Après avoir [remplacé Drone par Woodpecker](/interets/informatique/2023/06/17/migration-vers-woodpecker/) (et jusqu'à présent, j'en suis tout à fait satisfait), je me suis lancé dans le remplacement de [pi-hole](https://pi-hole.net) par [AdGuard Home](https://adguard.com/fr/adguard-home/overview.html).
J'avais déjà fait plusieurs fois la tentative, étant donné que la popularité d'AGH n'est pas récente, sans jamais vraiment avoir été convaincu.
Si, techniquement, le passage de pi-hole à AdGuard Home s'est fait sans le moindre problème (voir le code ci-dessous), AGH me laisse une impression troublante que le web va finir par complètement nous échapper.
```nix {class=not-prose}
{
services.adguardhome = {
enable = true;
settings = {
bind_port = 8080;
users = [
{
name = "richard";
password = "<mon super mot de passe>";
}
];
};
};
}
```
Ce sentiment n'est pas dû à l'application en elle-même mais aux technologies sous-jacentes.
J'y pense et je n'en parle que maintenant parce que depuis plusieurs années que j'utilise pi-hole "à ma façon", je n'avais pas encore à me poser la question, mais maintenant que j'ai décidé de passer sur AdGuard Home, il est grand temps que je vous parle de mon inquiétude sur l'avenir de l'informatique.
En l'occurrence, je veux parler de DNS-over-QUIC et de DNS-over-HTTP/TLS.
## Digression
### QUIC
DNS-over-QUIC me dérange, à cause de QUIC.
Pour rappel, c'est le HTTP/3 [voulu, conçu](https://en.wikipedia.org/wiki/QUIC) et forcé par Google.
Traitez-moi de conspirationniste anti-Google si vous voulez, mais permettez-moi un petit rappel de faits vérifiables, et de vous présenter les liens que j'établis entre ces faits.
QUIC a été déployé de façon publique **et** expérimentale dans Google Chrome [en 2012](https://blog.chromium.org/2013/06/experimenting-with-quic.html), par et pour les services de Google.
Un brouillon du protocole a été soumis à l'IETF en [juin 2015](https://datatracker.ietf.org/doc/draft-tsvwg-quic-protocol/00/) (rapidement remplacé par une nouvelle version en juillet).
Six mois plus tard, soit une fois que l'IETF considère le brouillon comme étant obsolète, une nouvelle version est publiée, prolongeant la validité du brouillon.
Certes, quelques modifications ont été réalisées entre temps, mais le timing est troublant.
D'autant plus que six mois plus tard, encore, le nouveau brouillon n'est toujours pas ratifié, et fait l'objet d'une nouvelle publication, prolongeant de fait sa validité pour l'IETF.
Ce brouillon a définitivement expiré le [9 janvier 2017](https://datatracker.ietf.org/doc/draft-hamilton-early-deployment-quic/).
Pourtant, en octobre 2018, [le protocole est subitement renommé HTTP/3](https://www.zdnet.com/article/http-over-quic-to-be-renamed-http3/) pour "anticiper sa promotion en standard du Web", ce qui ne se produira pourtant pas avant mai 2021 avec la publication de la [RFC9000](https://datatracker.ietf.org/doc/html/rfc9000).
Peut-être que je me place d'office dans une chasse aux sorcières, néanmoins il est impossible de nier que Google est partout, et décide de beaucoup plus que ce qui concerne son moteur de recherche.
Google a tout pouvoir pour imposer ses choix technologiques ; qu'ils soient bons ou mauvais n'est pas la question.
Google n'a demandé l'avis à personne (les utilisateurs de Chrome) pour faire ses expérimentations.
Ce n'est pas comme s'ils expérimentaient sur leur moteur de recherche, où des changements seraient perçus comme la mise à jour de **leur** logiciel.
On parle là de l'appropriation par la transformation d'un protocole réseau qui ne leur appartient pas.
On parle d'une dystopie, où une entreprise privée s'arroge tout pouvoir sur les infrastructures logicielles du réseau public d'Internet.
Ils avaient déjà fait le coup avec [SPDY](https://fr.wikipedia.org/wiki/SPDY) (devenu HTTP/2), mais comme tout le monde est content parce que ça permet aux devs web d'être de grosses fénéasses (en permettant notamment d'ouvrir plusieurs flux pour télécharger toutes les merdes en javascript qu'ils ne savent pas concaténer), tout le monde s'en fout que ce soit Google aux manettes.
Je ne comprends pas comment on peut être aussi cons, ou fantasmer à ce point un monde informatique où Google est Dieu tout puissant.
[J'en parlais déjà en 2016](/interets/informatique/2016/07/27/alphabet-une-entreprise-pas-comme-les-autres/) de cette aberration de permettre à Google de faire tout et n'importe quoi sur Internet.
"Et alors ?", vous me direz avec un soupçon de condescendance, "Rien de grave n'est arrivé, on a de meilleurs protocoles, de quoi tu te plains ?".
Je ne peux que lancer mon bras en l'air, dépité devant tant d'inaptitude à réfléchir au long terme et sur les ramifications de tout ça.
C'est juste que ça fait depuis vingt ans qu'on vous dit que Google c'est le mal, qu'on vous explique pourquoi, qu'on vous propose des alternatives, et au final, c'est juste de la putain de politique.
Les grands pontes se retrouvent à la tête des organismes les plus importants du Web (IETF, W3C), et on a juste à fermer nos gueules parce qu'ils savent mieux que nous ce qui est bien - pour eux et leurs entreprises.
À quel moment on a voté pour eux ?
Qui sont nos représentants de ces organismes ?
Ce n'est pas comme si un gars un jour avait développé un truc dans son garage et que ça avait du succès.
Là, c'est de la putain de politique, et ça me gonfle que mon monde (l'informatique) soit déjà infesté par la politique.
### DNS-over-whatever
DNS-over-HTTP, c'est la même rengaine, mais avec d'autres implications.
C'est encore un truc que l'on doit à Google (même si Mozilla y a participé).
Pareil pour DNS-over-TLS, Google est là.
Je ne supporte plus cette entreprise qui fourre son nez partout, faisant croire qu'ils améliorent Internet alors qu'ils participent à sa centralisation.
À la base, DNS-over-HTTP, ratifié en 2018, devait résoudre des cas particuliers de la gestion des DNS, notamment en terme de sécurité.
6 ans *après* que j'ai proposé ODDNS et que je me sois fait pourrir par Stéphane Bortzmeyer[^oddns], me conduisant à abandonner le projet sous les insultes de mon "aide de camp" de l'époque, qui m'a notamment traité de "connard" à cause de cet abandon.
[^oddns]: Liens morts constatés le 29 février 2024 et sans exemplaire disponible sur web.archive.org.
Là, je l'ai mauvaise parce qu'ODDNS, c'était une preuve de concept qu'exploiter DNS par HTTP était faisable, souhaitable.
Sauf que je suis pas un commercial moi, je suis un technicien, et personne n'a compris ce que je faisais.
ODDNS a eu son heure de gloire sur les réseaux sociaux dans le monde entier, pendant quelques jours.
Avant que Bortzmeyer ne vienne me couper l'herbe sous le pied en dénigrant le travail d'un autre comme seul un informaticien sait le faire.
En outre, et c'est le plus important après cette digression dans la digression, DNS-over-HTTP est conçu pour éviter la censure.
Un blocage DNS est inefficace over-HTTP.
C'est parfait pour les utilisateurs victimes de la censure étatique, mais il fallait bien s'attendre à ce que des entreprises comme Google mettent la main dessus, et s'en servent pour éviter que les utilisateurs puisse continuer à bloquer leurs domaines...
Alors, si DNS-over-HTTP devient la norme, je fais comment pour bloquer toutes les merdes de Google, de facebook et de Microsoft ?
Terminées les listes de domaines à blacklister.
Impossible de savoir qui fait quoi sur mon propre réseau.
Au moins, passant par mon propre DNS, je vois quel périphérique réclame la résolution de tel domaine.
Avec DNS-over-HTTP, c'est fini ça, et mes données foutrons le camps chez Google, ou en Chine, sans que je le sache.
On dispose de serveurs DNS racines.
L'infrastructure DNS du web repose sur ces serveurs.
Google : "Bah, OSEF, on va faire du DNS-over-HTTP, comme ça ils restent en place, ils font leur tambouille, et puis comme on est Google les utilisateurs vont tous vouloir faire du DNS-over-HTTP (au pire on dit que c'est une expérimentation, on fait un draft, et puis t'as pas un pote à l'IETF ? valà, bam ça devient une RFC), on est des héros, on leur évite la censure, et puis c'est nous qui devenons les nouveaux serveurs racine, comme ça, on ramène encore plus de traffic, et de $$$, et on peut continuer avec les prochains trucs. Tiens, bah ! On va s'incruster dans l'[IoT](https://developers.google.com/iot?hl=fr), et puis le [Wifi](https://store.google.com/fr/product/google_wifi?hl=fr) aussi ! On a déjà les [caméras](https://store.google.com/fr/product/nest_cam_battery?hl=fr), les [sonnettes](https://store.google.com/fr/product/nest_doorbell_battery?hl=fr) (une sonnette à 200€, au passage), les enceintes connectées et tout.".
Nous sommes des brebis, des moutons, et on n'a que peu de choix pour s'en sortir.
Putain, je veux pas de cet Internet-là.
J'en ai jamais voulu.
Je vous ai toujours dit ce que j'en pensais.
Je suis vraiment inquiet sur l'avenir d'Internet.
### Le rapport avec AdGuard
Pi-hole ne m'a jamais parlé de DNS-over-HTTP et je ne me suis jamais renseigné sur quelqu'application tierce pour le faire.
Je ne veux pas légitimer cet usage sur mon réseau.
DoH est nativement supporté par AdGuard Home, ce qui me fout déjà l'angoisse de ce que l'application peut faire avec une mauvaise configuration et de mauvaises attentions.
L'hostilité grandissante des applications à l'encontre des utilisateurs anime en moi une paranoïa que même une licence [GPL](https://github.com/AdguardTeam/AdGuardHome/blob/master/LICENSE.txt) ne peut apaiser.
AdGuard valorise cet usage en poussant à sa configuration, à son activation, demandant de fait d'exposer l'interface sur le web.
Mais je m'en fous de ça, moi.
Tout ce que je veux, c'est que **MON** putain de réseau local passe par les services que **JE** contrôle, et personne d'autre.
## Conclusion
AdGuard Home a désormais remplacé pi-hole sur mon réseau, tout fonctionne bien.
Je l'ai déjà dit : techniquement, tout va bien.
Mais je ne suis pas tranquille pour autant, je suis mal à l'aise, inconfortable, comme si j'allais réaliser que j'aurai dû rester sous pi-hole, voire utiliser le système de blocage minimaliste proposé par OPNSense.
Je déteste ça.
<details class="update"><summary>Mise à jour du 22 juin 2023</summary>
Je suis repassé à pi-hole en docker en attendant de trouver mieux.
Vraiment trop mal à l'aise avec AdGuard Home.
</details>

View File

@@ -0,0 +1,111 @@
---
date: '2023-06-26'
title: De retour sur le fediverse
---
Présent sur le [fediverse](https://fr.wikipedia.org/wiki/Fediverse) dès les premiers jours de ce blog, [je m'en suis retiré pour ouvrir un serveur Matrix](/interets/informatique/2021/12/30/bonne-annee-2022/) avant de finalement décider que [je n'avais plus envie de le maintenir](/interets/informatique/2023/03/24/matrix-c-est-fini/).
## Contexte
À chaque éternuement d'un réseau social, le fediverse engrange de nouveaux utilisateurs.
L'exemple le plus récent est celui de [reddit](https://www.reddit.com).
À la suite de [la nouvelle politique](https://www.lemonde.fr/pixels/article/2023/06/12/pourquoi-les-administrateurs-de-reddit-le-plus-gros-forum-du-monde-se-mettent-en-greve_6177262_4408996.html) très hostile contre les applications tierces, beaucoup d'utilisateurs se réfugient sur son alternative décentralisée [lemmy](https://join-lemmy.org/).
Et à chacune de ces migrations, voyant l'enthousiasme des gens pour les plateformes décentralisées, je me dis qu'il faudrait quand même que je m'y remette.
Du coup, me revoilà sur le fediverse.
J'auto-héberge une instance mono-utilisateur de [mastodon](https://joinmastodon.org/).
J'ai fait ce choix pour plusieurs raisons intriquées.
1. **La popularité de mastodon** :
Qu'on le veuille ou non, mastodon est la reine du micro-blogging sur le fediverse.
Ce n'est pas l'application la plus ancienne (loin de là) mais c'est sur mastodon que tout le monde va en quittant facebook/twitter.
Enfin, "tout le monde", vous me comprenez...
2. **L'installation native dans NixOS** :
Conséquence de sa popularité, mastodon dispose d'une [procédure d'installation native à NixOS](https://nixos.wiki/wiki/Mastodon).
Pas besoin de m'emmerder avec des containers docker.
3. **Ça marche** :
mastodon n'était pas mon premier choix.
En premier lieu, je voulais retourner sur [misskey](https://misskey-hub.net/en/).
Mais l'absence d'installation native à NixOS et des bugs d'affichage assez gênants sur macOS Sonoma m'ont fait abandonner l'idée.
J'ai ensuite essayé d'installer [Pleroma](https://nixos.org/manual/nixos/stable/index.html#module-services-pleroma) et [Akkoma](https://nixos.org/manual/nixos/stable/index.html#module-services-akkoma) (nativement installables dans NixOS), mais je n'ai même pas pu accéder à la moindre page.
Quand ça ne fonctionne pas tout de suite, je passe à autre chose : alors qu'en apparence, je croyais que mastodon allait être une plaie à installer, ça s'est révélé assez facile ; et surtout, ça a fonctionné du premier coup.
J'aimerais signaler à mon lectorat que je n'ai pas choisi mastodon sur des critères éthiques.
J'ai bien conscience que, dans l'intérêt du fediverse, outre ne pas s'entasser sur les mêmes instances, il est pertinent d'explorer les applications qui ne sont pas #1 sur leurs créneaux respectifs (et habituellement, c'est ce que je fais).
Cependant, ma volonté à résoudre les problèmes s'étiole avec le temps.
Je veux que ça marche, et que ça marche rapidement.
L'informatique doit *résoudre* des problèmes, pas en créer.
## Installation de mastodon sous NixOS
Peut-être qu'il me suffisait de quelques menus ajustements pour faire fonctionner misskey, mais c'était contraire à mon objectif "zéro-container".
Peut-être qu'avec un peu de persévérance, j'aurai pu faire tourner Pleroma ou son fork Akkoma.
Oui, mais Mastodon a fonctionné *out-of-the-box* sans le moindre problème, et avec une configuration minimale :
```nix {class=not-prose,linenos=false}
services.mastodon = {
enable = true;
# À remplacer par votre propre nom de domaine
localDomain = "fedi.richard-dern.fr";
# Ça c'est juste pour moi
extraConfig.SINGLE_USER_MODE = "true";
# À compléter
smtp.fromAddress = "";
};
```
Si on utilise [nginx](https://nginx.org/en/), il suffit de rajouter `configureNginx = true;`.
Si, comme moi, on utilise [caddy](https://caddyserver.com/), la configuration est plus verbeuse, mais elle est fournie par [le wiki de NixOS](https://nixos.wiki/wiki/Mastodon#Using_Caddy_as_a_server) et fonctionne après un simple copier-coller *sans la moindre modification* (à part, évidemment, le nom de domaine).
Il ne faut juste pas oublier d'ajouter caddy au groupe `mastodon` :
```nix {class=not-prose,linenos=false}
users.users.caddy.extraGroups = [ "mastodon" ];
```
Et c'est tout pour la configuration.
Il ne reste plus qu'à ajouter son utilisateur :
```shell {class=not-prose,linenos=false}
mastodon-tootctl accounts create <nom d'utilisateur> --email=<adresse email> --confirmed --role=Owner
```
Ça change carrément de l'installation pénible sous debian lorsque j'ai fait mes premiers essais, quand mastodon n'était encore qu'un bébé mammouth...
## Changement de stratégie
Quand j'ai joint le fediverse à la création de ce blog, j'ai fait ça comme un gros porc.
J'ai suivi plein de comptes (qui m'intéressaient réellement).
Mais comme je les suivais déjà par d'autres moyens (principalement par les flux RSS mis à disposition), l'information était redondante.
De plus, j'ai ajouté un relais à mon instance, ce qui a deux effets : faciliter mon insertion dans le réseau et polluer mes flux avec du contenu qui ne m'intéressait pas.
Cette fois, je vais être moins bourrin et je ne vais pas ajouter de relais.
Je m'abonnerai au fur et à mesure de mes découvertes, mais je ne ferai pas de "lèche-vitrine" sur de grosses instances.
Je pense que j'ai fait une erreur de débutant en 2021, et que, comme toute chose en informatique, il faut être patient.
Je crois qu'il existe un juste milieu entre la surconsommation et l'austérité, et je vais tenter cette voie.
Il se peut que dans quelques temps je fasse machine arrière, ou qu'au contraire je trouve un équilibre.
On verra bien.
## Objectifs
Je poursuis plusieurs objectifs en revenant sur le fediverse :
- offrir à mes visiteurs un canal de communication plus direct et moins formel que les emails
- voir si mes observations antérieures sont positivement altérées par mon changement de stratégie face au réseau
- rencontrer des gens sympas (voire ceux que j'avais déjà rencontré à l'époque...)
## Avertissements
Notez bien cependant que c'est mon serveur, mon instance, mon service, mes règles, et ça doit donc m'être profitable *à moi*.
Désolé de mettre plusieurs possessifs dans la phrase mais si un jour j'estime que ce service ne m'est plus profitable, je m'en débarrasserais sans cérémonie.
Quand je dis que "*ma volonté à résoudre les problèmes s'étiole avec le temps*", ça vaut aussi pour les problèmes sociaux.
Autrement dit, si j'estime que le rapport entre a) le coût de maintenance du serveur, b) le temps passé à gérer les problèmes techniques ou sociaux, et c) les échanges positifs est déséquilibré, je fermerais cette instance comme j'ai fermé la première et mon instance Matrix.
Cet équilibre va donc dépendre du comportement des gens qui interagissent avec moi.
~~Si, après cet avertissement auto-protecteur, vous avez toujours envie de me suivre par une autre voie que mon flux RSS, je vous invite à me suivre 😊~~.

View File

@@ -0,0 +1 @@
file: images/1kxGar.jpg

View File

@@ -0,0 +1 @@
file: images/QXP3MS.jpg

View File

@@ -0,0 +1 @@
file: images/SZDBh2.jpg

View File

@@ -0,0 +1 @@
file: images/TYYxDI.jpg

View File

@@ -0,0 +1 @@
file: images/cvQLk5.jpg

View File

@@ -0,0 +1 @@
file: images/qeu1SY.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

View File

@@ -0,0 +1,106 @@
---
date: '2023-06-30'
title: Ma moisson des soldes Steam
---
J'ai - un peu - craqué cette année sur les [soldes d'été de Steam](https://store.steampowered.com/), mais, à ma décharge, les promos sont alléchantes.
Je ne sais pas encore si je vais vous proposer un test de chaque jeu que j'ai acheté, mais j'avais envie d'au moins partager avec vous mes "découvertes".
> Toutes les images illustrant cet article proviennent de Steam.
## Terraria
![qeu1SY](images/qeu1SY.jpg)
Je l'ai depuis longtemps dans ma *wishlist* sans que je me résolve à l'acheter, malgré un prix de base très attractif, sa popularité pour son âge vénérable, et parce que c'est plus ou moins le jeu qui a inspiré [*Minecraft*](https://www.minecraft.net/fr-fr) (auquel j'ai énormément joué jusqu'à sa prise de possession par Microsoft).
À 4.99€ au lieu de 9.99€ en temps normal, il n'y a plus vraiment de raison d'hésiter pour acheter [*Terraria*](https://store.steampowered.com/app/105600/Terraria/).
Et puis, j'ai fait tomber la barrière psychologique de la 2D et du 8bits avec des jeux comme [*Starbound*](https://store.steampowered.com/app/211820/Starbound/), [*Stardew Valley*](https://store.steampowered.com/app/413150/Stardew_Valley/), ou plus récemment [*Dwarf Fortress*](/critiques/jeux-video/dwarf-fortress/).
J'anticipe jouer un peu plus d'une centaine d'heures : au-delà, je commence à saturer du scrolling en 2D, mais peut-être que je me surprendrai à être accroc...
## Horizon Zero Dawn
![TYYxDI](images/TYYxDI.jpg)
Ça faisait depuis un moment que mon père me parlait de [*HZD*](https://store.steampowered.com/app/1151640/Horizon_Zero_Dawn_Complete_Edition/), et étant pour le moins friand de [*Ark: Survival Evolved*](https://www.richard-dern.fr/critiques/jeux-video/ark-survival-evolved/), il faut dire que *Horizon Zero Dawn* a des atouts pour me séduire.
Néanmoins, à son prix de base de 49.99€, je ne voulais pas prendre le risque d'être déçu.
Ce n'est pas tout à fait le même jeu qu'*Ark*, et je suis assez pointilleux en ce qui concerne les jeux qui se réclament du style "Survie en monde ouvert".
Mais en passant à 16.49€, je suis tout de suite moins frileux.
J'en attends tout de même beaucoup : j'espère que suivre le scénario me tiendra une cinquantaine d'heures de jeu, et que ne pas le suivre me procurera plus d'une centaine d'heures.
Mais je n'espère pas qu'il me tienne aussi longtemps qu'*Ark* (auquel j'ai joué 1324 heures).
## Red Dead Redemption II
![cvQLk5](images/cvQLk5.jpg)
[*RDR2*](https://store.steampowered.com/app/1174180/Red_Dead_Redemption_2/) fait partie de ces jeux où il me faut rien de moins qu'une conjonction favorable des planètes pour me décider à l'acheter.
En cause : une tarification que je trouve prohibitive.
Si je me fie à une description succincte lue au hasard sur Internet, *RDR2* est un mélange de *Skyrim* et *GTA 5* au far west.
J'ai passé 555 heures sur le premier, mais "seulement" 50 sur le deuxième, alors que j'en attendais beaucoup plus.
Alors, à 60€ à son prix de base, je n'avais vraiment pas envie de risquer d'être déçu.
Pourtant, il me fait baver depuis sa sortie en 2019, avec ses paysages magnifiques, la sensation de liberté qui émanait des vidéos publiées sur Internet, et puis, le *far west*...
À 19.79€, s'il me tient 50 heures, je serai content de mon achat.
Alors s'il me tient 500 heures...
## Age of Empires IV
![1kxGar](images/1kxGar.jpg)
Grand fan du III, sur lequel j'ai passé 939 heures, je lorgnais sur [*Age of Empires IV*](https://store.steampowered.com/app/1466860/Age_of_Empires_IV_Anniversary_Edition/) avec une envie mêlée d'inquiétude : et si ce n'était que le III modernisé ?
Et si, comme c'est manifestement le cas sur beaucoup de franchises, le nouvel épisode était moins bien que celui d'avant ? (hello Civilization...)
Je ne pouvais me résoudre à payer 40€ sans savoir si le jeu allait me convenir, mais à 19.99€, le pari est un peu moins risqué.
On verra bien : je serai content de passer la centaine d'heures de jeu.
## Timberborn
![SZDBh2](images/SZDBh2.jpg)
De la construction de base post-apocalyptique avec des... castors !
Je sors un peu de ma zone de confort puisqu'habituellement, les jeux de construction de base et/ou post-apo auxquels je joue ne mettent pas vraiment les castors à l'honneur (quoiqu'il y a [leurs ancêtres](https://ark.wiki.gg/wiki/Castoroides) dans *Ark*, vous me direz...).
[*Timberborn*](https://store.steampowered.com/app/1062090/Timberborn/) semble apporter un souffle de renouveau au genre, avec des mécaniques apparemment intéressantes.
Et puis le thème est contemporain et m'interpelle : réinstaurer la vie là où elle n'est plus, les humains étant absent du tableau.
Je n'ai pas choisi ce jeu pour l'économie réalisée pendant les soldes : le jeu passe de 24.50€ à 19.60€.
Je l'ai acheté pour la curiosité, parce que j'aime les jeux de construction de base, et aussi parce que l'environnement graphique me plaît bien.
J'espère y jouer au moins une cinquantaine d'heures, mais j'en attends plus que ça.
## Dave the Diver
![QXP3MS](images/QXP3MS.jpg)
Alors là, pour le coup, je sors **complètement** de ma zone de confort, mais tant pis.
J'étais accroché dès le visionnage de la vidéo diffusée à l'occasion de la sortie du jeu avant-hier.
Cette vidéo est seule responsable de mon achat.
Je n'ai pas l'habitude des jeux "loufoques" (le plus barré des jeux en ma possession est [*The Stanley Parable*](https://store.steampowered.com/app/221910/The_Stanley_Parable/), suivi par [*Spore*](https://store.steampowered.com/app/17390/SPORE/), c'est vous dire).
Mais le mélange des genres distillé dans cette vidéo introductive m'a simplement semblé irresistible d'intelligence, d'esthétisme, d'humour et d'orchestration.
Le thème semble original, la réalisation paraît académique (dans le sens le plus noble du terme).
Je me risquerai même à dire : génial (et je me refuse d'utiliser ce terme à la légère).
Les critiques sont dithyrambiques : j'ai rarement vu un jeu aussi estimé par la communauté (on parle de 200 commentaires négatifs sur 12000, à mes yeux c'est un excellent rapport).
J'imagine qu'il y a au moins deux cas de figure :
- on est généralement bon public, du coup on se laisse facilement tenter par ce genre de jeux un peu "exotiques"
- on est généralement frileux (comme moi), ça passe ou ça casse, et manifestement, dans la plupart des cas avec Dave the Diver, ça passe
Pas soldé, il est toutefois remisé de 10% à l'occasion de sa sortie d'accès anticipé, passant de 19.99€ à 17.99€.
Et honnêtement, si [*Dave the Diver*](https://store.steampowered.com/app/1868140/DAVE_THE_DIVER/) tient les promesses de la vidéo promotionnelle, je me satisferai d'une durée de vie d'une trentaine d'heures.
## Conclusion
Je n'achète pas mes jeux de façon impulsive.
Généralement, mes achats découlent d'une longue procédure de réflexion, de recherche d'avis aussi bien positifs que négatifs, aussi bien dans les commentaires de Steam que dans la presse spécialisée.
Rarement, pour ne pas dire jamais, je n'achète plusieurs jeux d'un seul coup, et c'est très rare que je les achète pendant les soldes (je profite plutôt des réductions occasionnelles en cours d'année, ou j'attends que le prix baisse "naturellement").
Mais cette année, ma *wishlist* commençait à prendre de l'embonpoint, en même temps que je me lassais de mes jeux du moment (principalement *Dwarf Fortress*, *Ark* et *Jurassic World Evolution*).
Alors, ces soldes d'été m'ont semblé salvatrices, surtout considérant la diversité des jeux qui m'ont tenté cette année, et surtout considérant que j'ai fait le choix de sortir de ma zone de confort (un peu avec *Timberborn*, beaucoup avec *Dave the Diver* !).
J'ai hâte de tester tout ça !