Elixir & Phoenix en français
Des articles en français sur Elixir, Phoenix, LiveView, Ecto et OTP.
L’écosystème Elixir est riche en contenu anglophone et presque vide en français : c’est ce trou que ces articles essaient de combler, en partant de problèmes concrets rencontrés en écrivant du code.
Ce blog accompagne un dépôt de ressources et de notes : liste de librairies commentée, parcours d’apprentissage, glossaire FR ↔ EN et Livebooks exécutables.
Articles
-
Les uploads LiveView : déclarer ce qu'on accepte, et laisser le fichier arriver
Une note de frais a un libellé, un montant, et un justificatif : la photo du ticket de taxi. Le formulaire existe déjà en LiveView, il ne manque que le champ fichier. C’est l’occasion de découvrir une partie de Phoen... -
Qui est là ? Découvrir Phoenix.Presence
Il y a une petite fonctionnalité que tout le monde reconnaît : les avatars en haut d’un document partagé, qui disent qui est en train de le lire en même temps que vous. Elle paraît simple. Puis on réfléchit à la faço... -
Mettre une application Phoenix en français : qui décide de quoi
Une application Phoenix peut être entièrement écrite en français sans être vraiment francisée. Les libellés de l’interface sont traduits, et pourtant la date s’affiche en anglais, le montant sépare ses milliers d’une ... -
Deux cents liens à vérifier
Un dépôt de documentation vieillit parfois plus vite qu’on ne le pense. Le code est surveillé par les tests. Les liens, eux, ne le sont généralement pas. Une page disparaît, une documentation change d’adresse, un pro... -
Un million de processus
« Elixir peut lancer des millions de processus. » La phrase revient dans chaque présentation du langage, et elle n’est presque jamais suivie d’un chiffre. Combien de mémoire ? Combien de temps ? Et surtout : est-ce qu... -
Qui fait le café ? Une interface Livebook en quatre étapes
La documentation de Kino liste une trentaine de composants. On les essaie un par un, ça affiche des jolies choses, et au bout d’une heure on ne sait toujours pas construire une interface — parce que le problème n’est ... -
Ash : décrire la ressource, et laisser le reste se déduire
Prenez un article de blog dans une application Phoenix ordinaire. Combien de fois est-il décrit ? Le schéma Ecto dit quels champs existent. Le changeset redit lesquels sont acceptés et validés. Le contexte enveloppe l... -
mix release : ce qui est figé, ce qui se lit au démarrage, et les trois erreurs qu'on rencontre dans l'ordre
Un release, c’est votre application, la machine virtuelle Erlang et toutes les dépendances, copiées dans un dossier qui se lance sans Elixir installé sur la machine cible. Le concept tient en une phrase. Ce qui ne tie... -
Oban : la file d'attente est une table, et c'est toute la différence
Il y a deux familles de systèmes de tâches en arrière-plan. Celles qui gardent la file dans un service à part — Redis, RabbitMQ — et celles qui la gardent dans la base de données qu’on a déjà. Oban est de la seconde, ... -
Vous faites déjà de la télémétrie : ce que Phoenix émet sans qu'on lui demande
La plupart des présentations de Telemetry commencent par « voici comment émettre un événement ». C’est prendre le sujet à l’envers. Dans un projet Phoenix qui vient d’être généré, sans une seule ligne écrite, il y a d... -
Les scopes de Phoenix 1.8 : le même générateur, avant et après
La façon la plus honnête de comprendre les scopes de Phoenix 1.8, c’est de lancer deux fois le même générateur dans le même projet : une fois avant phx.gen.auth, une fois après. Le code produit n’est plus le même, et ... -
phx.gen.auth en 1.8 : le lien magique d'abord, et pourquoi le mot de passe devient optionnel
Le générateur d’authentification de Phoenix a changé de philosophie avec la 1.8, et la plupart des tutoriels en ligne décrivent encore l’ancienne. L’inscription ne demande plus de mot de passe. On saisit une adresse, ... -
Une API REST avec Phoenix : ce que le générateur écrit à votre place
Une commande suffit à obtenir une API REST complète : mix phx.gen.json Api Article articles title body:text Le problème des générateurs n’est pas ce qu’ils écrivent, c’est qu’on les utilise sans lire. Or ces six fi... -
Pourquoi mes erreurs de formulaire ne s'affichent pas
Le scénario est toujours le même. Le changeset est invalide, changeset.errors contient exactement ce qu’il faut, le formulaire s’affiche, et aucun message n’apparaît. Aucune erreur dans les logs, aucune exception : la... -
Arrêter de déboguer avec des Logger.info : iex, IO.inspect, dbg, pry
Il existe un réflexe universel, et il est mauvais : Logger.info("panier = #{inspect(panier)}") Trois défauts, qu’on ne voit pas tant qu’on n’a pas essayé autre chose. Il casse le pipe — il faut sortir la valeur du ... -
La liste chaînée n'est pas le mauvais outil, c'est la matière première
Un précédent article posait le problème : une liste chaînée est lente en accès par index, et un vecteur y répond mieux. En le partageant sur l’Elixir Forum, j’ai reçu deux réponses qui déplacent la question — :queue e... -
Des tests concurrents avec une base de données : comment, et jusqu'où
Dans la plupart des langages, faire tourner une suite de tests en parallèle contre une base de données relève de l’acrobatie : bases séparées, schémas dédiés, verrous, nettoyage entre chaque test. Beaucoup d’équipes y... -
« Let it crash » ne veut pas dire ce que vous croyez
Vous avez lu la formule dix fois. On la sort à chaque discussion sur Elixir, souvent en haussant les épaules, comme une excentricité de la BEAM : « let it crash », laissez planter. Et presque toujours, elle est compr... -
Les hooks JavaScript de LiveView : la frontière et ses règles
LiveView tient une promesse rare : construire une interface réactive sans écrire de JavaScript. Elle tient presque toujours — et puis vient le jour où il faut du glisser-déposer, une carte, un éditeur de texte riche, ... -
Les pannes silencieuses de LiveView
Un bug qui plante est un bug facile. Il y a une erreur, une trace, un fichier, une ligne. On ouvre, on corrige. Les pires sont ceux dont l’information se perd en route. Tantôt le serveur n’a rien vu passer et les jou... -
L'immutabilité ne coûte pas ce que vous croyez
C’est l’objection réflexe de quiconque arrive d’un langage impératif. On explique qu’en Elixir les données sont immuables, qu’ajouter un élément à une liste de dix mille entrées produit une nouvelle liste — et l’inter... -
Structurer un projet Elixir : ce que le compilateur ne vérifie pas
Créez un projet, mettez le module MonApp.Comptes dans lib/nimportequoi.ex, compilez. Ça marche. Renommez le fichier en zzz.ex, recompilez. Ça marche encore. C’est déroutant quand on vient de Ruby ou de Python, où le ... -
Brancher un notebook sur une application qui tourne
Quelque chose ne va pas en production. Les journaux montrent le symptôme sans la cause. Vous ouvrez un iex distant, vous tapez une ligne, puis une autre, vous remontez dans l’historique, vous perdez le fil. Une heure ... -
Un outil interne en trente lignes, dans un notebook
Vous ouvrez iex, vous tapez dix lignes pour interroger une API ou compter des lignes en base, vous lisez la réponse dans un IO.inspect, vous fermez le terminal. Le lendemain, il faut tout retaper. Et le collègue à qui... -
Le HTML en base de données est un piège
Votre application a besoin d’un champ de texte riche. Du gras, des listes, des liens, quelques images. Vous branchez un éditeur, il vous rend du HTML, vous le passez dans un filtre à balises et vous le rangez dans une... -
Aja : quand la liste chaînée n'est plus le bon outil
En Elixir, [1, 2, 3] n’est pas un tableau. C’est une liste chaînée : trois cellules, chacune contenant une valeur et un pointeur vers la suivante. Cette structure a des qualités immenses — elle est immuable à moindre ... -
Composer des requêtes Ecto : la fonction qui prend une query et en renvoie une
En Ecto, from(a in Article, where: a.publie == true) ne parle à personne. Ça ne touche pas la base, ça n’ouvre pas de connexion : ça construit une struct Ecto.Query. Le SQL n’est produit qu’au moment du Repo.all. Ce ... -
Lire une stacktrace Elixir sans paniquer
Un mur de texte rouge dans le terminal, c’est intimidant les premières fois. Puis on réalise qu’une erreur Elixir a toujours exactement la même forme, et que le type d’erreur oriente à lui seul l’essentiel du diagnost... -
Les streams LiveView : arrêter de garder 500 lignes en mémoire
Vous affichez un flux d’activité, une table de résultats, une liste de messages. Le réflexe LiveView, c’est assign(socket, :articles, Blog.liste_articles()). Ça marche parfaitement — et ça coûte plus cher qu’on ne le ... -
Ecto.Multi : composer une transaction sans se noyer dans les with
Créer un utilisateur, lui créer un profil, l’inscrire à une newsletter. Trois écritures qui doivent réussir ensemble : s’il en manque une, on ne veut aucune des trois en base. Le réflexe, quand on arrive d’un autre la...