Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Hello world

Here, you will see some posts

Sometimes in English , sometimes in French

Some thoughts that are too long for social media or when i want something more permanent than social media

Follow

Social media

Follow on your preferred social media :

Fediverse / Mastodon
@blog.pinage404.is-a.dev@web.brid.gy
ATmosphere / BlueSky
@blog.pinage404.is-a.dev

Web feed

Follow with your preferred format :

License

Setup is under ISC license

Articles © 2026 by pinage404 are licensed under CC BY-NC-SA 4.0

Devbox to Multiverse

TL;DR checks the results or the conclusion

Nix (vanilla)

The Nix package manager allows to download a package at a specific version

flake.nix :

{
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  outputs =
    { self, nixpkgs }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in
    {
      devShells.${system}.default = pkgs.mkShell {
        packages = [
          pkgs.nodejs # ⬅️ version frozen by the lock file
        ];
      };
    };
}

But doing it vanilla is a pain to maintain, we have to find the commit hash of nixpkgs when the wanted version was packaged

flake.nix :

{
  inputs.nixpkgs.url = "github:NixOS/nixpkgs?rev=085589047343aad800c4d305cf7b98e8a3d51ae2";
                                               # ⬆️ commit hash to find
  outputs =
    { self, nixpkgs }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in
    {
      devShells.${system}.default = pkgs.mkShell {
        packages = [
          pkgs.nodejs # ⬅️ version 21.6.2
        ];
      };
    };
}

To easily download Nix’s packages at a specific version, there are several solutions ; Devbox and Nixpkgs Multiverse are two of them

Devbox

To specify the required packages at specific version, Devbox uses a JSON file

devbox.json :

{
    "packages": ["nodejs@21.6.2"]
}

To get the nixpkgs commit hash, Devbox uses an online service (Nixhub)

Under the hood, Devbox queries Nixhub to know the nixpkgs commit hash and then generates Nix files with the commit hash (.devbox/gen/flake/flake.nix) to download the dependencies

Nixpkgs Multiverse

To specify the required packages at specific version, Nix Multiverse add some functions in the Nix language

flake.nix :

{
  inputs.nixpkgs-multiverse.url = "github:fzakaria/nixpkgs-multiverse";
  outputs =
    { self, nixpkgs-multiverse }:
    let
      system = "x86_64-linux";
      multiverse = nixpkgs-multiverse.multiverse."${system}";
    in
    {
      devShells.${system}.default = pkgs.mkShell {
        packages = [
          multiverse.fast.version "nodejs" "21.6.2"
        ];
      };
    };
}

To get the nixpkgs commit hash, Multiverse includes some giant JSON files with all nixpkgs commit hash per packages updated frequently

Context

I maintain some environments ready to go, for several languages using the Nix package manager

I used to use Devbox to get the packages needed by the sandbox

I was curious if Multiverse could improve speed or storage size

Also, i would like to check if Multiverse could avoid the drawbacks of Devbox

Devbox drawbacks

Devbox have drawbacks :

That being said : I am still happy that this project existed

And i am thankful to the Devbox’s team

Difficulties

Measures

Speed

To measure the speed, it depends on the things already cached, and it depends on the internet speed which is fluctuant

The current bottleneck is mainly on downloading stuff

So, i expect that mainly the storage size matters

I gave up

Storage size

Nix stores everything in the “Nix Store” : a hardcoded not configurable path which is /nix/store

Everything that uses Nix, will do symbolic link (symlink) to the paths in the Nix Store

It ends up to many symlinks that point to others symlinks that point to others symlinks… and some files that contain path to follows…

I tried to measure a sandbox size before doing anything, but i failed, none of what i tried gave me the actual size

# don't count all the weight of the symlinks
du --human-readable --summarize --dereference .* *
ncdu --follow-symlinks
dust --dereference-links .
filelight .
diskonaut
gdu --follow-symlinks

# display some closures but not the one generated by Devbox
gcan tui

# display 3~5Mo ; nixpkgs itself should add at least ~300Mo
nix-tree --derivation .#devShells.x86_64-linux.default

# i didn't find a way to get the sum (i don't want to do it manually)
nix build .#devShells.x86_64-linux.default && nix-du --root ./result | tred | dot -Tsvg>devshell_before.svg

# fails with this error "error: attribute 'fetchClosure' missing" because the generated file contains `builtins.fetchClosure`
nix build ./.devbox/gen/flake#devShells.x86_64-linux.default && nix-du --root ./result | tred | dot -Tsvg>devbox_before.svg

I ask some help on Matrix, and Lewo had the idea to do it inside containers

Thanks for the idea

Exception

The first test was on the Rust sandbox, which was the only exception where it takes more space than before

I almost give up, but i was curious, so i continued

Same but different

I did the first migrations manually, i eventually wrote a really simple script to do the changes

Every sandbox look similar, but all are different, so i had to change some stuff manually for each sandbox, it was faster than trying to handle every cases

Migration

For each sandbox :

  1. build a container, which :

    1. get everything needed
    2. run the test
  2. i did the migration

  3. rebuild the container

Container built with this command :

podman build .

Using the following Dockerfile :

FROM nixos/nix

ENV NIX_CONFIG="extra-experimental-features = flakes nix-command"

RUN echo "export PATH+=\":~/.nix-profile/bin/\"" >>/etc/profile

RUN nix profile add 'nixpkgs#direnv'
RUN echo 'eval "$(direnv hook bash)"' >>/etc/bashrc

WORKDIR /w
COPY . .

RUN direnv allow
RUN direnv exec . mast test

The container image nixos/nix alone took 500Mo

Results

Most of the sandboxes saved 660Mo

Check the commit with all migrations

SandboxDevboxnixpkgs-multiversedelta
c3.77Go3.10Go.67Go
clojure2.69Go2.03Go.66Go
common_lisp2.89Go2.54Go.35Go
cpp3.77Go2.03Go1.74Go
elixir1.86Go1.19Go.67Go
elm2.06Go1.29Go.77Go
erlang3.18Go2.14Go1.04Go
forth1.73Go1.07Go.66Go
fsharp3.45Go2.79Go.66Go
go2.01Go1.34Go.67Go
haskell14.51Go14.15Go.36Go
nix1.94Go1.25Go.69Go
php3.24Go1.74Go1.50Go
prolog3.11Go2.44Go.67Go
python3.95Go1.43Go2.52Go
rockstar1.84Go1.17Go.67Go
ruby2.13Go1.56Go.57Go
rust6.66Go7.53Go-0.87Go
shell2.05Go1.38Go.67Go
snapshot_testing1.71Go1.05Go.66Go
typescript_bun2.07Go1.41Go.66Go
typescript_deno1.98Go1.31Go.67Go
typescript_node_vitest2.29Go1.50Go.79Go

I don’t know why :

Sometimes the delta is big
Python saved 2.25Go with nixpkgs-multiverse
Sometimes the delta is small
Common Lisp saved 350Mo with nixpkgs-multiverse
Sometimes the delta is reversed
Rust added 870Mo with nixpkgs-multiverse

Conclusion

For all sandbox but one, Multiverse saves significative storage size

Devbox uses a JSON file which is easier for people that don’t know the Nix ecosystem

Multiverse uses the Nix language, there is only one step to download packages, which is faster

La Fresque du Climat

Il y a quelques semaines, j’ai assisté à un atelier appelé La Fresque du Climat

Qu’est-ce que c’est ?

c’est un atelier ludique où on coconstruit, avec d’autres participant·es, une fresque modélisant 1 l’ensemble des causes / conséquences autour du dérèglement climatique, à l’aide de cartes et de feutres, en utilisant l’intelligence collective et les connaissances partielles de chaque participant·e

Une animatrice et un animateur étaient là pour :

  • organiser l’atelier : expliquer le déroulement, nous donner les cartes au fur et à mesure…
  • nous aider à organiser les cartes
  • lever les doutes (est-ce que telle chose est la cause ou la conséquence de telle autre ?)
  • nous donner des informations supplémentaires

Tout est très factuel

À quoi ça sert ?

Ça permet de voir toutes les boucles de rétroactions positives 2

Généralement, quand j’entends parler d’un de ces sujets, ils ne montrent qu’une ou deux boucles de rétroactions positives

Alors que l’atelier permet d’avoir une vision d’ensemble de toutes les causes / conséquences

Ça permet d’avoir conscience de la situation actuelle

Est-ce utile ?

je me renseigne pas mal sur le sujet, mais j’ai BEAUCOUP appris

je pense que c’est un atelier d’utilité publique (et je pèse mes mots)

Comment y participer ?

Tous les futurs ateliers sont listés sur le site officiel

Originally posted on hackmd


  1. Tous les modèles sont faux, mais certains sont utiles

    George Box

  2. Une boucle de rétroaction positive est une suite de conséquences qui viennent augmenter les facteurs de la cause, provocant une amplification du phénomène

    Plus de détails sur Wikipedia

    Ce qui ne veut pas dire que c’est “positif” pour nous

Regex

TDD permet de construire une Regex, petit pas par petit pas


La documentation de Python est très complète

Warning

Attention, le moteur des regex diffère d’un langage / lib à l’autre


On peut faire des PoC ou la tester en temps réel avec ce plugin pour VSCode ou ce site (regex101)


On peut utiliser ce plugin pour VSCode pour mieux comprendre une regex et encore une fois ce site (regex101) peut donner plus d’explications

Pour s’entrainer de manière ludique il y a le jeu Regex Cross Word

Originally posted on hackmd

Mon pire entretien, ça tourne mal

(pour le moment, c’est le pire, mais j’espère qu’il restera le pire)

Contexte

À ce moment là :

  • j’ai fait déjà 5 ans d’alternance
  • j’ai récemment commencé mon premier CDI dans une ESN
    • je vais chez les clients en tant que consultant dans des missions longues en régie
    • j’ai une clause de dédie-formation qui m’empèche de partir facilement
    • cette ESN a été créé par une autre ESN “soeur” mais sont différentes
  • je suis en inter-contrat
  • l’équipe commerciale me cherche ma deuxième mission

Entretiens normaux

Pour tous mes autres entretiens, il y avait une sorte de format (auquel nous étions préparés) :

  1. le commercial fait les présentations
  2. le client nous amène dans une salle de réunion
  3. le client présente la mission
  4. il me laisse me présenter
    • les commerciaux nous ont appris à nous présenter, en suivant ce format :
      • comment on a découvert le dev
      • notre parcours (scolaire, travail…)
      • ce qu’on aime
  5. une phase de questions / réponses si on ne les a pas distillées pendant l’entretien
    • j’ai beaucoup de questions, vu que je veux avoir le plus d’infos avant de faire un choix qui va m’engager pour les mois, voir les années, à venir
      • j’ai des questions génériques pour n’importe quelles missions
      • j’ai des questions plus spécifiques à la mission
        • certaines par rapport au descriptif de la mission
        • d’autres soulevées pendant l’entretien

Appel d’offre

Sur l’appel d’offre :

  • le contexte de la mission est bref et très technique
  • une liste de taches à faire assez flous et de prérequis, mais normaux
  • des technos qui me semblent intéressantes

Pendant tout l’entretien

J’étais très mal à l’aise, vu que je ne savais pas s’ils :

  • me testaient
  • me trollaient (avec un “humour” très bizarre)
  • avaient des avis opposés aux miens
  • avaient des façons de travailler opposés aux miennes
  • ne connaissaient pas les pratiques et méthodes permettant d’améliorer la qualité ni les avantages de celles-ci
  • peut etre un mélange de tout ça

… je savais pas trop comment répondre

Quand ils posaient des questions, j’essayais de répondre en expliquant suffisamment pour qu’ils comprennent dans le cas où ils ne connaitraient pas et pas trop pour pas les prendre pour des ignorants, dans le cas inverse

Ils étaient 2, mais le chef posait plus de questions et menait l’entretien

Ils me laissaient pas répondre entièrement, il me coupait avec une autre question (qui collait à son avis fait en 2 minutes sur moi)

Ils ont globalement ignoré visuellement et verbalement le commercial

L’entretien

Nous sommes arrivés dans une salle de bureau, le bureau avait plein de trucs dessus, j’ai du pousser des machins pour pouvoir avoir la place de poser mes deux feuilles A4 (c’était bizarre 😐)


Ils (une personne, visiblement le chef, désigné par il ou le client par la suite ; et un dev de l’équipe) se sont trop rapidement présentés (j’ai pas eu le temps de retenir tellement c’était bref)


Le client a directement attaqué en me demandant de me présenter (ce qui m’a déstabilisé 😰)

Donc je commence à raconter ma vie (ce qui est déjà un exercice assez dérangeant, encore plus face à des inconnus 😟) où j’y dis notamment que j’essaie d’avoir des bonnes pratiques

Les clients des entretiens précédents avaient l’air très intéressés 😃 quand je racontais ma vie (autant les personnes techniques que celles non-techniques) :

Là, les deux avaient l’air saoulés 😐


Normalement, j’enchaine ma présentation en présentant mes missions par ordre chronologique ou celles qui me semble les plus importantes

Sauf qu’il m’a pas laissé le temps et m’a posé des questions pour chacune des missions, sans me laisser le temps de poser du contexte

  • Concrètement, quel projet tu as fait pour pratiquer tes bonnes pratiques ?
  • C’est des pratiques, c’est pas un outil en particulier, c’est quelque chose qui se fait au quotidien 😕

Mais ils n’ont pas eu l’air de comprendre


En quelques minutes, il m’a catégorisé 📦

Il m’a ensuite posé des questions, comme :

  • J’ai bien compris, tu aimes la qualité, mais du coup, comment ça se passe quand quelqu’un a un avis différent de toi ? Tu te sens frustré ?
  • Non pas forcement, ça dépend des cas
  • Mais du coup, tu insistes ? 😣
  • Non, j’essaye de comprendre les vrais besoins

Ainsi que :

  • Toi qui es plutot frontend, pourquoi tu veux faire une mission de backend ?
  • Je suis ni frontend ni backend : j’ai toujours fait des deux dans mes précédentes missions 😕
  • Moi, je crois que tu as entendu dire que NodeJS est à la mode, du coup, tu as envie d’en faire pour cette raison
  • J’aime réellement le JavaScript, j’en fait presque depuis que j’ai commencé le dev ! J’aime autant faire du backend que du frontend, je m’intéresse à NodeJS mais n’ai pas encore eu l’occasion d’en faire dans un contexte professionnel 😒

Et plein de questions bizarres, dans ce style, qui étaient très orientées et en me prétant des intentions que je n’avais pas

Comme si vouloir et aimer faire de la qualité en utilisant des méthodologies et des bonnes pratiques était quelque chose de mal


Ensuite, j’ai demandé qu’ils m’expliquent plus de contexte sur la mission

Ils m’ont parlé presque que de la partie technique (principalement les technos utilisées)

Le dev a dit des choses du genre :

  • On comprend pas ce qu’on nous demande, mais c’est comme partout
  • 🙅 😐

J’en ai compris qu’il ne comprenait pas les besoins du métier et qu’il pensait que c’était normal


Ils m’ont parlé d’un outil que je ne connais pas, je leur ai demandé à quoi ça sert

Ils m’ont donné plusieurs définitions qui avaient l’air contradictoires 🔵 🆚 ☑️ 🆚 ❎

J’ai demandé laquelle c’était entre les 3 qu’ils m’avaient données

Le client a fini par me dire :

  • Tu auras qu’à demander à l’Ops
  • 😒

J’étais toujours très mal à l’aise 😰 mais j’ai quand meme posé mes questions


L’une de mes questions préférées (qu’un des commerciaux m’avait conseillé lors d’une préparation) c’est :

  • Si je rejoins votre équipe, qu’elle sera mon plus gros challenge ?

Il me répondit ceci :

  • T’intégrer à l’équipe, car tu as l’air d’etre un profil plutot difficile, il faudra arriver à t’entendre avec les autres
  • 😶 😕 😒 😐

Je me dis que c’était du second degré, donc je continue mes questions en essayant d’ignorer


Ma dernière question (encore une suggérée par le commercial précédemment cité) :

  • Si vous aviez une baguette magique : qu’est-ce que vous changeriez dans votre quotidien ?

Il me répondit :

  • Ne plus prendre de prestataire

Surpris, je demande :

  • 😮 Pourquoi ?
  • On les forme, puis après ils discutent en bas avec un commercial, et ils changent de missions
  • Les internes peuvent faire pareil
  • Oui, mais pour les internes, on a d’autres moyens de pression
  • 😨

Pendant tout l’entretien :

  • j’ai essayé d’avoir plus d’infos, surtout celle non techniques car c’est le plus dur à comprendre ; et ils m’en ont donné peu
  • ils ont essayé (et réussi avec succès) de me déstabiliser et me mettre mal à l’aise (ça peut etre une technique de recrutement [que je désapprouve fortement] pour voir la réaction en situation de stress / inconfort / inconnu mais pas pendant tout l’entretien), ça donne pas envie de bosser avec eux

En se préparant pour partir, ils nous disent qu’ils vont débriefer (normal) ; mon commercial lui répond que nous aussi (normal) ; le mec l’a mal pris 😠

Il a dit que s’était pas correct de répondre à l’appel d’offre avec les deux sociétés (ma boite et sa boite soeur) que c’était de la concurrence déloyale (je ne pense pas)

Mon commercial a commencé à lui expliquer que ce sont deux boites différentes

Le client insistait sur ce point de concurrence déloyale

Avec le dev, on se regardait, on savait pas trop comment réagir

Puis mon commercial a répondu, qu’il ne se sentait pas à l’aise, que pendant tout l’entretien il s’était senti mal à l’aise (ça m’a rassuré 😌, je me demandais si cet entretien était normal [avec le recul, c’est évident que non, mais pendant, je comprenais vraiment pas ce qui m’arrivais {vu que mon commercial n’a pas / peu intervenu pendant l’entretien, je me demandais si c’était normal, je pensais que j’avais un problème ou que j’interprétais mal les choses ou que c’était normal ou que j’avais dit de mauvaises choses ou pas d’une bonne manière}])

Il a ajouté, que pendant toute sa carrière, il avait jamais vu un entretien comme ça

Le client s’est encore plus énervé 😠 et nous a plus ou moins foutu dehors de son bureau ➡️ 🚪

Pendant qu’on marchait dans le couloir, on a entendu :

  • Petits cons
  • 😮

Mon commercial l’a souligné à haute voix


On était dans l’ascenseur 😧, le client est revenu vers nous énervé 😠 en disant je-sais-plus-quoi

Mon commercial a répondu à plusieurs reprises pendant que le client raler :

  • Écoutez, je ne vous ai pas manqué de respect, je crois qu’on va s’arreter là et on ne va pas travailler ensemble

Le client a bloqué la porte de l’ascenseur avec son poing ✊ et d’un ton très menaçant a dit :

  • ET QUE JE TE REVOIS PLUS

Mon commercial a répondu :

  • J’y compte bien
  • TU SAIS PAS OÙ J’AI GRANDI MOI ! ALORS FAIT PAS LE MALIN ! 😡

Je me suis demandé s’il allait pas coller un pain au commercial (puis moi ensuite) 👊

  • JE SAIS OÙ VOUS ETES, JE VAIS VENIR ! 😡

Ainsi que d’autres paroles dans ce ton 😨


Ce qui est ironique, c’est que sur le chemin de l’aller, je disais à mon commercial que je me sentais plus à l’aise lorsque j’avais un commercial avec moi pour les entretiens (meme si je les connais très peu), car j’avais déjà eu des mauvais entretiens et j’en avais peur, et les commerciaux arrivent à recadrer des situations à la con, et permettent de briser la glace, et d’etre en nombre égalitaire

Originally posted on hackmd