Le défi de l'alignement des icônes avec le texte dans les listes est qu'une fois que le texte dépasse une ligne, l'icône centrée visuellement peut paraître décalée. L'approche initiale consistant à utiliser align-items: start dans Flexbox déplace l'icône au sommet du conteneur, ce qui n'est pas idéal en raison de l'espace de ligne par défaut.
Pour résoudre ce problème lorsque l'icône est un élément HTML, il est recommandé d'ajuster la position verticale de l'icône. L'utilisation d'une valeur fixe avec transform: translateY() s'avère instable lorsque la taille de la police, la taille de l'icône ou la largeur du conteneur changent. La solution la plus robuste consiste à utiliser l'unité lh (line-height) pour calculer un décalage dynamique, assurant ainsi un alignement constant quelle que soit la taille du texte ou de l'icône.
Lorsque l'icône est ajoutée via un pseudo-élément comme image de fond, le même principe de calcul d'un décalage relatif s'applique pour garantir un alignement cohérent avec la première ligne de texte, même lorsque le texte se prolonge sur plusieurs lignes.
L'auteur a migré de l'application Authy pour la double authentification vers Aegis Authenticator, un logiciel libre. Cette transition a été motivée par l'incompatibilité d'Authy avec le système d'exploitation Murena /e/OS, utilisé sur son nouveau Fairphone, en raison de restrictions de sécurité liées aux ROM personnalisées.
Aegis a été choisi pour sa nature logicielle libre et pour maintenir une séparation entre la gestion des mots de passe et celle des codes de double authentification, privilégiant ainsi une application dédiée et simple d'utilisation sur smartphone. Le processus de migration a impliqué une approche minutieuse de changement un par un des comptes, avec une désactivation puis réactivation du 2FA, la génération de nouveaux codes de secours, et une vérification systématique de la fonctionnalité avant de supprimer l'ancien enregistrement dans Authy.
Pour assurer une transition réussie et ne rien oublier, l'auteur a utilisé des tags dans son gestionnaire de mots de passe et un fichier tableur dédié au suivi de la migration de chaque service vers Aegis, jusqu'à ce que tous les codes Authy aient été remplacés.
L'article explore comment étendre un blog existant, construit avec le générateur de site statique Hugo, pour le rendre accessible via le protocole Gemini. Le protocole Gemini est présenté comme une alternative minimaliste et plus respectueuse de la vie privée au Web actuel, évitant des aspects comme les publicités, le pistage systématique et les feuilles de style complexes. L'objectif est de créer une "capsule Gemini" ou un "gemlog" qui héberge le contenu du blog.
La démarche consiste d'abord à utiliser les capacités natives d'Hugo pour générer le contenu au format Gemtext, un format simple attendu par le protocole Gemini. Cela implique de configurer Hugo pour qu'il génère des fichiers avec l'extension .gmi et d'ajouter des templates spécifiques pour transformer le contenu Markdown existant en ce nouveau format. Plusieurs autres projets et articles sont mentionnés comme références pour cette transition vers Gemini avec Hugo.
Pour rendre le blog Gemini accessible, la seconde étape consiste à mettre en place un serveur Gemini capable de servir les fichiers .gmi générés par Hugo. L'article promet ensuite de présenter des clients Gemini permettant de consulter ce nouveau blog accessible via le protocole gemini://.
Pour suivre l'évolution de fichiers publics, comme la liste des plateformes agréées de la DGFiP, qui ne fournissent pas de métadonnées de modification (Last-Modified ou ETag), il est nécessaire de mettre en place un système de collecte régulière. L'absence de ces informations rend impossible de déterminer si un fichier a été mis à jour sans le télécharger et le comparer, entraînant une perte d'historique pour chaque jour sans relevé.
La solution proposée consiste à télécharger le fichier quotidiennement et à utiliser Git comme système d'archivage pour conserver les versions successives. L'analyse des fichiers .xlsx est simplifiée en exploitant leur structure ZIP contenant des fichiers XML, sans avoir recours à des bibliothèques complexes. Le processus utilise des outils en ligne de commande comme unzip et une analyse des chaînes de caractères dans xl/sharedStrings.xml ainsi que du contenu des cellules dans xl/worksheets/sheet1.xml.
Cette méthode de parsing XML par expressions régulières est spécifiquement adaptée à des fichiers dont la structure est stable et connue, garantissant que toute modification du format par le producteur du fichier entraînera une défaillance du script. Il est donc crucial de lancer la collecte dès que possible, même avec un script imparfait, afin de ne pas perdre de données historiques.
Un joli plaidoyer de Ploum pour ne pas utiliser l'IA dans la communication écrite : l'IA écrit de manière "vide" - il compare avec de la prose de "marketeux" - alors qu'une rédaction humaine, même maladroite, est incomparablement plus informative.
Le "seasonal slump" est une baisse saisonnière d'énergie, de concentration et d'enthousiasme qui survient généralement en automne avec la diminution des jours. Ce phénomène a une base biologique liée à la réduction de la lumière du jour qui perturbe l'horloge interne du corps.
La lumière du jour influence notre rythme circadien et la production de mélatonine, nous rendant plus somnolents et affectant nos niveaux de sérotonine, un messager chimique du cerveau lié à l'humeur. Cela, combiné à une tendance naturelle à moins bouger et à manger plus lourd, crée un cercle vicieux de baisse d'énergie.
Pour contrer ce phénomène, l'article propose six stratégies basées sur la science, axées sur l'exposition à la lumière naturelle dès le matin, l'activité physique (idéalement en extérieur), le maintien d'un horaire de sommeil régulier, la socialisation, la mise en place de projets motivants et une alimentation adaptée. Il est souligné que la dépression saisonnière est une condition distincte nécessitant un avis médical.
Ce billet décrit une approche pour renforcer la sécurité de Nginx Proxy Manager (NPM) dans un environnement Docker en utilisant CrowdSec. L'objectif est d'éviter de créer une image Docker personnalisée pour NPM, ce qui compliquerait les mises à jour. L'astuce consiste à faire tourner CrowdSec sur l'hôte et à lui permettre de lire les logs de NPM, sans modifier l'image officielle.
La solution proposée fait de CrowdSec un outil de détection et le firewall bouncer de CrowdSec une solution d'application des décisions. CrowdSec analyse l'activité de NPM, identifie les comportements malveillants, et le firewall bouncer utilise iptables pour bloquer les adresses IP incriminées au niveau du réseau, protégeant ainsi les services Docker exposés.
Cette méthode privilégie la simplicité et la maintenabilité, en conservant l'image NPM officielle et en évitant les dépendances à des images personnalisées moins suivies. Le filtrage s'opère au niveau du firewall plutôt qu'au niveau du serveur web lui-même, offrant une protection par blocage d'adresses sources pour les services Docker publiés.
Le projet Agojie vise à automatiser le jeu de société Dice Throne. Le développement a débuté par des décisions fondamentales avant même la première ligne de code, abordant la structure du modèle du jeu, la mécanique de défense des héros, la découpe des tâches de développement et le choix de la pile technologique. L'objectif initial est de modéliser le cœur du jeu en un contre un, en se concentrant sur la gestion des dés, avant d'intégrer les cartes et les effets de statut.
Trois idées d'architecture ont été envisagées dès le départ : la séparation entre la définition d'un héros et l'état d'une partie, la modélisation du jeu comme un "Aggregate" pour garantir l'intégrité des règles métier, et l'utilisation d'"Domain Events" pour enregistrer les faits importants du domaine. Cependant, ces idées n'ont pas été appliquées immédiatement, privilégiant une approche où les décisions sont justifiées par les règles du jeu et non par l'intuition.
Ce projet est structuré en quatre étapes principales : la mise en place du cœur du jeu sans cartes, le développement d'une interface utilisateur basique avec sauvegarde des parties, l'intégration de la couche de cartes pour influencer le jeu, et enfin la gestion des effets de statut qui affectent les héros. La première phase consiste en la rédaction d'une spécification détaillée des règles du jeu de Dice Throne, incluant des exemples concrets pour guider le développement du code.
Résumé pour Shaarli:
Le projet Agojie se lance dans l'automatisation de Dice Throne, un jeu de dés et de combat stratégique. Les premières étapes se concentrent sur les décisions architecturales et la modélisation des règles fondamentales, sans écrire de code. L'objectif est de développer le cœur du jeu, puis d'ajouter progressivement des fonctionnalités comme les cartes et les effets de statut, en s'appuyant sur des principes de conception logiciel rigoureux.
Le texte explore deux approches pour gérer les dépendances lors de tests locaux de services communiquant avec S3 dans une application Symfony. La première question technique concerne l'utilisation de class: versus alias: pour redéfinir un service. L'auteur illustre qu'un alias peut être préférable car il permet de pointer vers une autre définition de service sans pour autant le réinstancier directement, évitant ainsi des erreurs de construction comme le manque d'arguments.
La deuxième question aborde une décision d'architecture : privilégier un "double maison jetable" (un faux service temporaire redirigeant vers le système de fichiers local) plutôt qu'une solution comme MinIO (un conteneur S3-compatible). Cette approche est motivée par la simplicité et la réversibilité, rendant la modification facilement identifiable et supprimable après les tests, notamment grâce au bloc when@dev de Symfony qui permet de scoper la configuration à un environnement spécifique.
En résumé, le choix entre une configuration via class: ou alias: pour substituer un service en environnement de développement, et le type de fausse dépendance utilisé, sont des décisions d'ingénierie qui doivent être adaptées au contexte et aux besoins de réversibilité du processus de développement. L'utilisation de blocs de configuration conditionnels comme when@dev facilite l'intégration et la suppression temporaire de ces adaptations pour les besoins de recettes et de tests.
Le composant Symfony ObjectMapper simplifie la conversion entre différents objets, notamment pour transformer des DTOs (Data Transfer Objects) en entités ou vice versa. Cette approche permet de découpler les données d'entrée et de sortie d'une API des modèles internes, ce qui est particulièrement utile lors de la gestion de code existant ou de l'implémentation d'architectures hexagonales.
L'ObjectMapper agit comme un traducteur, prenant les données d'un objet source et les convertissant directement dans le format d'un objet cible, sans passer par une étape intermédiaire sous forme de tableau. Cette méthode est plus simple et efficace que l'utilisation du composant Serializer de Symfony, qui nécessitait une normalisation en tableau puis une dénormalisation, impliquant potentiellement plus de configuration.
L'utilisation de DTOs est recommandée pour séparer clairement les responsabilités. Tandis que les entités sont liées à la logique métier et à la persistance, les DTOs définissent les données à exposer ou à recevoir à une interface spécifique, offrant ainsi un contrôle sur ce qui traverse les frontières de l'application et améliorant la maintenabilité.
L'application Symfony a souffert d'épuisement de mémoire, provoquant des plantages de conteneurs nocturnes. Le développeur a d'abord suspecté une fuite de mémoire, mais l'analyse a révélé que le problème provenait de requêtes gourmandes en ressources, chacune consommant jusqu'à 512 Mo. Ces requêtes saturaient rapidement le pool de travailleurs PHP-FPM, entraînant l'indisponibilité du site.
Face à l'augmentation du contenu, le développeur a mis en place des outils de surveillance pour identifier les routes problématiques. Il a découvert cinq schémas récurrents dans Doctrine, tous contribuant à la consommation excessive de mémoire. La première cause identifiée était une hydratation complète des entités Doctrine lorsque seules quelques colonnes étaient nécessaires, comme dans le cas de la génération du sitemap.
Cette surconsommation de mémoire a été résolue en optimisant le code pour éviter l'hydratation inutile des entités. Le développeur a instrumenté son application avant de toucher au code, ce qui lui a permis de cibler précisément les problèmes. L'objectif était de réduire la quantité de données chargées et traitées par chaque requête, afin de prévenir l'épuisement de la mémoire.
L'application Symfony a rencontré des problèmes de mémoire dus à des requêtes gourmandes, saturant le pool de workers. Après analyse, cinq schémas récurrents dans Doctrine ont été identifiés comme responsables, notamment une hydratation complète des entités là où seule une partie des données était nécessaire. L'optimisation du code pour réduire la consommation de mémoire par requête a permis de résoudre le problème.
L'article aborde le conflit entre le principe d'immuabilité de l'event sourcing et le droit à l'effacement du RGPD. Les approches traditionnelles comme la réécriture ou la suppression physique des événements sont jugées destructrices pour l'intégrité du système.
La solution proposée repose sur le concept de "forgettable payloads" : les données personnelles ne sont plus stockées directement dans les événements immuables, mais dans un espace de stockage séparé et mutable. L'événement conserve son identité et une référence vers ces données, mais la suppression du compte utilisateur implique de rendre ces données inaccessibles, sans altérer le flux d'événements.
Cette inaccessibilité est concrètement réalisée par le "crypto-shredding" des données : chaque charge utile est chiffrée avec une clé unique, et le processus d'effacement consiste à détruire cette clé. Si aucune copie de clé ou donnée en clair ne subsiste ailleurs, les données chiffrées deviennent indéchiffrables, honorant ainsi la demande d'effacement sans compromettre l'historique des événements.
Le composant Symfony Runtime, introduit dans Symfony 5.3, a modernisé le démarrage des applications PHP en séparant la logique d'initialisation de celle du contrôleur frontal. Auparavant, le fichier public/index.php contenait une grande partie de l'infrastructure de l'application, ce qui posait des problèmes de maintenance et de propagation des mises à jour du code de démarrage.
Grâce à Runtime, le code d'amorçage est désormais géré par un composant Composer dédié, permettant ainsi des mises à jour plus fluides via la gestion des dépendances. Cette architecture découplée est particulièrement avantageuse car elle permet aux applications Symfony de s'exécuter dans divers environnements, qu'il s'agisse des serveurs PHP traditionnels (PHP-FPM) ou de solutions plus modernes comme FrankenPHP, Swoole ou ReactPHP, sans modifier le contrôleur frontal.
Le principal avantage architectural de Symfony Runtime réside dans sa capacité à désolidariser le processus de démarrage de l'application de son modèle d'exécution. Cela signifie qu'une même application peut s'adapter à différents types d'environnements d'exécution, y compris les processus PHP à longue durée de vie, sans nécessiter de réécrire sa logique d'initialisation. Cette flexibilité ouvre la voie à une portabilité accrue des applications Symfony sur une gamme plus large de plateformes.
Symfony 8.1 introduit la variable d'environnement FRANKENPHP_RESET_KERNEL pour résoudre un problème de fuite d'état dans les applications PHP fonctionnant en mode "worker" avec FrankenPHP. Ce mode maintient le processus PHP en vie entre les requêtes pour améliorer les performances, mais crée un risque que l'état de services persistants ne soit pas correctement réinitialisé, ce qui peut entraîner une incohérence ou une exposition involontaire de données entre les requêtes.
Traditionnellement, chaque requête HTTP dans PHP démarrait avec un environnement isolé, garantissant que l'état de l'application était remis à zéro. Le mode worker de FrankenPHP, quant à lui, réutilise le noyau et les services Symfony, offrant un gain de vitesse significatif mais introduisant le risque de propagation d'état non désiré si les services ne sont pas explicitement réinitialisés.
Pour pallier ce risque, Symfony propose l'interface ResetInterface qui permet aux services de vider leur état entre les requêtes. Cependant, cette approche dépend de la bonne implémentation par tous les services, y compris ceux de tiers ou le code hérité. FRANKENPHP_RESET_KERNEL agit comme une mesure de sécurité supplémentaire, garantissant que le noyau est réinitialisé automatiquement, ce qui renforce la robustesse et la sécurité des applications PHP en mode worker.
Le nouveau command symfony lsp:check résout un problème courant de typographie dans les noms de routes Symfony que les outils d'analyse statique comme PHPStan ne peuvent pas détecter. Ces erreurs, souvent des fautes de frappe minimes, peuvent passer inaperçues lors des revues de code ou des tests automatisés, menant à des bugs en production. Le command analyse les routes, les templates, les traductions et la configuration pour identifier ces erreurs spécifiques à Symfony.
Le command symfony lsp:check est une version autonome des diagnostics déjà présents dans les extensions de langage Symfony pour les éditeurs. Il fonctionne en démarrant l'application dans l'environnement sélectionné pour analyser la configuration et les routes réelles, offrant ainsi une détection précise des erreurs. Il couvre un large éventail de problèmes, incluant les routes inexistantes, les templates manquants, les clés de traduction erronées et les configurations invalides, avec la possibilité de basculer vers une analyse statique si l'exécution du code n'est pas possible en CI.
Visa et Mastercard sont des réseaux de cartes, et non les émetteurs de cartes ou les banques qui fournissent ces cartes aux consommateurs. Ils ne s'occupent pas non plus des processeurs de paiement qui gèrent les transactions sur les terminaux ou en ligne, ni de l'intégration des commerçants.
Leur rôle principal est de relier les titulaires de cartes et les émetteurs aux commerçants et aux acquéreurs afin de faciliter les transactions par carte. Ils exploitent l'infrastructure de télécommunication nécessaire au routage des messages de transaction, coordonnent le transfert de fonds et règlent les transactions entre les parties concernées.
En outre, ces réseaux définissent les règles qui régissent leur écosystème, y compris les procédures de règlement des litiges, et mettent en place des incitations pour encourager l'utilisation de leurs réseaux. Leur infrastructure est conçue pour être hautement sécurisée et résiliente afin d'assurer la fiabilité des transactions.
L'article soutient que la tendance actuelle à diviser les systèmes d'IA en de multiples agents spécialisés, à l'instar des microservices, peut être prématurée et coûteuse. Il souligne que de nombreux agents médiocres ne surpassent pas un seul agent performant, et que la complexité croissante d'un agent unique conduit à une dégradation progressive. Les problèmes majeurs incluent la difficulté de sélectionner le bon outil parmi une liste étendue, la contradiction des instructions dans un unique prompt, et la difficulté de modifier le système sans affecter l'ensemble.
Le moment idéal pour opérer une scission en agents multiples est lorsque ces difficultés deviennent mesurables et nuisibles, et non sur la base d'une esthétique ou d'une tendance. La solution proposée est le schéma "supervisor pattern", où un agent superviseur centralise la classification et le routage des requêtes vers des agents spécialisés. Chaque agent spécialiste est confiné à un domaine unique, disposant de son propre prompt clair, d'un ensemble d'outils limité et distinct, et gérant son propre état de conversation.
Ce modèle permet de retrouver la précision dans le choix des outils et d'éviter les conflits d'instructions, offrant ainsi une meilleure maintenabilité et évolutivité. L'idée principale est de ne pas commencer avec une architecture multi-agents avant que la nécessité ne soit clairement établie par des problèmes concrets liés à la complexité d'un agent unique, puis d'adopter une approche structurée avec un superviseur et des spécialistes.
L'implémentation de Page Objects dans Playwright est une approche pour améliorer la maintenabilité et la réutilisabilité du code de test automatisé. Plutôt que d'interagir directement avec les éléments de l'interface utilisateur dans chaque scénario de test, les Page Objects encapsulent les sélecteurs d'éléments et les actions associées à une page spécifique de l'application web. Cela permet de centraliser la logique de localisation des éléments, rendant les tests plus robustes face aux changements de structure du site.
Playwright propose deux styles de Page Objects : un pour les suites de tests utilisant le runner intégré de Playwright, et un autre destiné à l'intégration dans des frameworks de test externes comme Jest ou Cucumber. Les deux approches s'appuient sur les concepts de fixtures de test, notamment la fixture Page qui fournit un objet pour interagir avec une seule page du navigateur et la notion de Locator pour trouver des éléments de manière fiable grâce aux mécanismes d'attente automatique de Playwright.
La mise en place d'un Page Object implique généralement d'importer les types Locator et Page de la bibliothèque Playwright Test. Ces objets fournissent des méthodes pour sélectionner et manipuler les éléments de l'interface, assurant que les tests sont moins susceptibles de devenir obsolètes en cas de modifications mineures du code HTML de l'application.
Pour mieux comprendre les systèmes complexes, l'auteur a développé une approche utilisant des agents d'IA pour agréger des connaissances réparties entre le code, la documentation et le savoir tacite des équipes. L'objectif est de supprimer la nécessité de réunir plusieurs personnes pour décortiquer le fonctionnement d'un système.
La première tentative consistait en un agent général connecté à des outils comme Notion et GitHub. Bien qu'utile pour des périmètres restreints, cette approche a montré ses limites en matière de fiabilité et de capacité à traverser les frontières des différents domaines d'expertise. Face à ces difficultés, l'auteur a décidé de construire une solution plus robuste et personnalisée.
La seconde tentative, nommée "ruche", implique la création d'un dépôt centralisé regroupant les dépôts de code pertinents via des sous-modules Git. Chaque sous-module est accompagné d'un fichier AGENTS.md fournissant un contexte, formant ainsi une "ruche" d'agents capables d'accéder et de traiter l'information de manière plus efficace.
L'hébergement de son propre serveur de messagerie est désormais réalisable, y compris depuis son domicile, malgré les réticences fréquentes liées aux problèmes de spam et de livraison. L'idée principale est de reprendre le contrôle de ses données et de favoriser la décentralisation d'Internet, en évitant que quelques grandes entreprises ne concentrent toutes les informations.
Pour un hébergement à domicile, certaines conditions techniques sont nécessaires : une adresse IP statique IPv4 non blacklistée, ne pas être derrière un CGNAT, pouvoir modifier le enregistrement PTR de son IP et ouvrir les ports couramment utilisés par les serveurs de messagerie. Les interruptions de service internet sont généralement bien gérées par le système de relai des e-mails, le destinataire ne perdant donc pas de messages lors de courtes indisponibilités.
Plusieurs solutions logicielles existent pour mettre en place un serveur de messagerie, comme docker-mailserver, Stalwart ou Mailcow, offrant différentes approches pour le déploiement. Il est également crucial de configurer correctement les enregistrements DNS (SPF, DKIM, DMARC, MX) de son domaine pour assurer une bonne délivrabilité des e-mails et prévenir le spoofing.
Cet article met en évidence la convergence architecturale entre des frameworks web populaires tels que Spring Boot (Java), Symfony et Laravel (PHP), ainsi que NestJS (Node.js). Malgré leurs langages distincts, ces outils partagent une philosophie commune visant à faciliter la maintenance des applications serveur sur le long terme. Ils s'appuient sur des concepts clés tels que l'injection de dépendances, le routage déclaratif, les patrons de conception de type "repository" et une gestion de configuration adaptable aux différents environnements.
L'auteur illustre cette similarité en comparant des exemples de contrôleurs dans chaque framework. Il observe que l'injection par constructeur, l'isolement des services métiers et la déclaration des routes directement dans le code de la méthode sont des pratiques récurrentes. Cette approche, notamment celle de Spring Boot avec ses "starters" qui simplifient la configuration initiale, rappelle des concepts déjà présents dans l'écosystème PHP, suggérant une influence mutuelle et une standardisation des solutions architecturales pour les applications web modernes.
Cet article relate le processus de migration d'un Fairphone 4 d'Android vers le système d'exploitation /e/OS. L'auteur, dans le cadre de son partenariat avec Commown, a rencontré plusieurs difficultés techniques lors de l'installation via l'installeur web, notamment des problèmes de connexion ADB et de verrouillage du bootloader. L'intervention du support technique de Commown a finalement permis de mener à bien l'installation en ligne de commande.
Ce récit détaille les étapes rencontrées lors de l'installation de /e/OS sur un Fairphone 4, incluant les défis liés à l'installeur web, aux messages d'erreur fréquents et à la nécessité d'une intervention manuelle via adb et fastboot. La collaboration avec le support Commown a été essentielle pour résoudre les blocages.
L'article révèle qu'une instance Yunohost initialement configurée pour être privée derrière une Freebox est devenue accessible publiquement sur Internet. Cette exposition inattendue n'était pas due à un bug des mises à jour de la Freebox ou à des problèmes de certificats.
La cause principale identifiée est l'activation du protocole UPnP IGD (Universal Plug and Play - Internet Gateway Device) sur la Freebox. Ce protocole, lorsqu'il est activé, permet aux appareils connectés d'ouvrir automatiquement les ports nécessaires, contournant ainsi les règles de NAT manuelles mises en place et rendant la machine Yunohost visible de tout Internet.
L'auteur a désactivé cette fonction UPnP IGD pour restaurer la restriction d'accès souhaitée. Il envisage désormais de placer sa machine Yunohost derrière un routeur dédié comme Pfsense ou Opnsense pour renforcer la sécurité.
L'article aborde le problème de la dépendance à des plateformes logicielles américaines comme GitHub, qui, au-delà de la simple gestion de code, représentent des réseaux sociaux et des usines logicielles. La concentration du marché, dominé par GitHub, soulève des questions de souveraineté et de sécurité des données, particulièrement à la lumière de lois américaines comme le Cloud Act et la FISA, qui peuvent contraindre ces plateformes à partager des informations sensibles avec les autorités américaines.
Face à ces risques, l'article explore les alternatives européennes. Il mentionne le self-hosting avec Forgejo, un fork de Gitea maintenu par l'organisation Codeberg, jugé comme la seule option viable dans ce domaine, bien que présentant des défis de maintenance. Pour les solutions hébergées, Codeberg.org est présenté comme une option pour les projets open source, tandis que Tangled.org est mentionné comme un projet prometteur s'appuyant sur ATProto.
En résumé, la dépendance vis-à-vis de GitHub pose des risques liés à la souveraineté des données et aux lois américaines. L'article propose des alternatives européennes comme Forgejo pour le self-hosting et explore des solutions hébergées, tout en soulignant leurs limitations actuelles pour les projets d'entreprise.
L'article explore le concept de "Agentic Coding" en comparant le développement de composants graphiques personnalisés à l'aide de primitives D3 et de la librairie Recharts. L'auteur a découvert que l'approche basée sur les primitives D3 a permis de satisfaire pleinement les exigences de conception complexes, y compris les animations et les comportements spécifiques, sans nécessiter de contournements coûteux.
En contraste, la librairie Recharts, bien que plus rapide pour les cas courants, a rapidement montré ses limites pour atteindre les 20% de personnalisation restants, obligeant à coder du SVG personnalisé et à désactiver des fonctionnalités comme les animations pour contourner des problèmes de compatibilité avec la pile React du projet.
L'auteur redéfinit l'abstraction non pas comme un coût nul, mais comme un travail d'implémentation pré-payé qui offre de la flexibilité en échange. L'histoire du développement web est vue comme une ascension progressive de cette échelle d'abstraction, où chaque étape convertit du travail humain coûteux en dépendances moins chères, mais où les besoins spécifiques finissent par révéler les contraintes de ces abstractions de haut niveau.
Dans une architecture CQRS, la synchronisation entre la base de données de lecture et celle d'écriture est un défi majeur pour éviter la présentation d'informations obsolètes. Une stratégie de synchronisation en deux étapes est nécessaire pour équilibrer la performance de la base de données de lecture et la cohérence de la base de données d'écriture.
Face à des volumes importants de données et à des besoins de recherche performante, comme dans le cas d'une recherche de disponibilités hôtelières, une base de données unique avec de nombreux index peut devenir inefficace. L'adoption d'une architecture CQRS, séparant la gestion des commandes et des requêtes, permet d'optimiser ces aspects en utilisant une base de données dédiée à la lecture, telle que MongoDB, enrichie d'index appropriés.
Pour maintenir la cohérence entre la base de données principale (PostgreSQL) et la base de données de recherche (MongoDB), une approche asynchrone est privilégiée. Les modifications apportées à PostgreSQL sont publiées sur un broker de messages, et MongoDB les traite lorsque sa charge de lecture le permet, garantissant ainsi que les opérations d'écriture restent rapides. Pour pallier les risques liés aux opérations asynchrones, des reconstructions planifiées de la base de données de lecture sont effectuées, généralement pendant les périodes de faible activité, afin d'assurer la mise à jour des données.
-
L'auteur décrit une expérimentation où il délègue la génération de code à des agents basés sur l'IA. Initialement, il agissait comme un intermédiaire, copiant-collant des tickets dans des sessions d'agents pour déclencher leur travail. Cette tâche répétitive l'a conduit à réaliser que la partie réellement créative et intéressante du processus de développement se situait en amont, lors de la spécification des tickets.
Cette évolution s'inscrit dans une progression sur plusieurs années, passant de la complétion de code (Copilot) au dialogue avec les modèles (chat), puis à l'agentique où les IA peuvent modifier des fichiers et exécuter des commandes sous supervision. L'étape actuelle consiste à retirer l'humain de la boucle de déclenchement des agents, transformant son rôle.
Le changement majeur est passé de l'écriture directe de code à la spécification détaillée de ce qui doit être codé. L'expérimentation actuelle vise à pousser cette idée plus loin en retirant l'humain de la seule action de lancer les agents, le rôle du développeur se concentrant désormais sur la définition précise des tâches à accomplir par l'IA.
Ce tutoriel explique comment configurer Fail2ban pour sécuriser Nginx Proxy Manager (NPM) dans un environnement Docker. L'objectif est de bloquer les tentatives d'accès non autorisés, notamment les attaques par force brute sur l'authentification Basic Auth, sans modifier l'image Docker de NPM ni ajouter de conteneur supplémentaire.
La méthode préconisée repose sur l'analyse des logs d'accès de NPM, qui enregistrent les échecs d'authentification HTTP 401. Fail2ban, exécuté sur l'hôte Docker, surveille ces logs pour identifier les adresses IP suspectes et les bannir temporairement des ports 80 et 443. L'approche vise à rester simple (KISS) en utilisant les journaux natifs de NPM et en s'appuyant sur la configuration existante de Fail2ban sur l'hôte.
La procédure implique de localiser le fichier journal d'accès pertinent pour le Proxy Host ciblé, de créer un filtre Fail2ban spécifique pour reconnaître les échecs d'authentification 401 et d'inclure l'adresse IP du client (
Nuxt offre deux approches principales pour optimiser la performance des composants : Lazy et ClientOnly. L'utilisation de <LazyMonComposant /> permet le "code-splitting" automatique, isolant le composant dans un fichier séparé. Cela allège le bundle JavaScript initial, accélérant le téléchargement et l'analyse par le navigateur, et le code n'est chargé que lorsque le composant est nécessaire.
L'encadrement d'un composant par <ClientOnly> désactive son rendu côté serveur (SSR). Bien que son code reste inclus dans le bundle JavaScript, cette méthode réduit la charge du serveur et prévient les erreurs d'hydratation si le composant utilise des API spécifiques au navigateur. Cependant, le contenu n'est pas présent dans le HTML initial, ce qui peut entraîner des décalages visuels et impacter le référencement naturel.
La combinaison de Lazy et ClientOnly offre un gain de performance optimal en différant à la fois le SSR et le chargement du JavaScript. Cette approche est idéale pour les composants complexes et interactifs non essentiels au SEO, permettant au serveur de répondre rapidement et à la page de s'afficher sans délai avec un minimum de code, le composant se chargeant ensuite en arrière-plan sur le client.
L'écriture de qualité ne réside pas dans l'originalité, mais dans la capacité à exprimer des vérités évidentes de manière claire et perspicace. Chercher constamment la nouveauté peut mener à des sujets insignifiants, car les idées importantes ont généralement déjà été explorées par des esprits brillants à travers les générations. La difficulté réside dans l'articulation de ces évidences, souvent enfouies sous la familiarité.
Se concentrer sur ce qui est manifestement vrai oblige à examiner la réalité en profondeur et à affiner sa propre compréhension. C'est en explorant ces fondations personnelles que l'on peut aider autrui à examiner les leurs. L'exemple du succès de l'auteur avec son article sur la gestion de projets illustre comment une définition fondamentale, si évidente qu'elle était difficile à cerner, a permis de structurer des conseils pratiques.
La recherche de l'originalité peut s'avérer contre-productive, menant à des tentatives forcées et répétitives. Au contraire, s'attacher à exprimer des évidences puise dans l'expérience personnelle, offrant une richesse et une authenticité qui sonnent véritablement original aux yeux du lecteur.
Graft est un outil open-source conçu pour améliorer les performances des agents de codage tels que Claude Code, Cursor, Codex et Gemini. Il vise à les rendre plus rapides, moins coûteux et à améliorer leur compréhension contextuelle de votre base de code, permettant ainsi des économies significatives en temps et en coût, tout en améliorant parfois la précision des résultats.
L'outil fonctionne en créant un graphe de votre base de code. Ce graphe permet aux agents d'accéder à des informations contextuelles pertinentes, réduisant ainsi le besoin de traiter l'intégralité du code à chaque requête. Graft s'intègre en douceur, notamment avec Claude Code, en ajoutant automatiquement des hooks et en gérant la génération du graphe en arrière-plan, rendant ainsi l'amélioration transparente pour l'utilisateur.
Une fonctionnalité notable de Graft est son application GitHub qui analyse automatiquement les pull requests, offrant des revues de code plus efficaces. Il supporte également une variété de langages de programmation et offre des outils en ligne de commande pour la recherche, la cartographie et la visualisation du graphe de code.
Pi est un "agent harness" minimal conçu pour s'adapter aux flux de travail de l'utilisateur plutôt que l'inverse. Il permet la personnalisation via des extensions, des compétences, des modèles de prompts et des thèmes, qui peuvent être packagés et partagés via npm ou git. Pi se distingue par sa flexibilité et sa légèreté, offrant quatre modes d'utilisation : interactif, impression/JSON, RPC et SDK, tout en évitant des fonctionnalités complexes comme les sous-agents ou le mode plan par défaut.
La recherche dans des colonnes chiffrées sans les déchiffrer est rendue possible grâce à un "blind index". Contrairement à un chiffrement classique non déterministe qui génère un nouveau texte chiffré pour chaque même donnée, le blind index utilise une fonction cryptographique déterministe et secrète (comme HMAC-SHA256) sur la donnée normalisée. Ce mécanisme permet de créer un index sur cette valeur générée, autorisant ainsi les requêtes d'égalité.
L'implémentation dans Symfony/Doctrine consiste à ajouter une colonne supplémentaire à la base de données pour stocker ce blind index, aux côtés du champ chiffré. Lors d'une recherche, le système interroge d'abord la colonne du blind index. Comme la fonction de hachage est déterministe, la même valeur en clair produira toujours le même index. Cependant, en raison de la troncature délibérée de cet index, des collisions sont possibles.
Pour pallier ces collisions et garantir l'exactitude, une étape de vérification est indispensable après avoir récupéré les candidats via le blind index. Le système déchiffre alors le contenu réel de la colonne chiffrée pour les enregistrements correspondants et le compare à la valeur recherchée. Cette approche permet de maintenir la confidentialité tout en autorisant des requêtes efficaces sur les données sensibles.
Le bundle symfony-precognition permet de valider une requête HTTP sans exécuter le code du contrôleur, offrant ainsi une validation de formulaire en temps réel. L'idée principale est de conserver les règles de validation côté serveur, au lieu de les dupliquer côté client, évitant ainsi les incohérences entre les deux implémentations.
Pour ce faire, une requête normale est enrichie d'un en-tête Precognition: true. Le serveur analyse et valide les arguments du contrôleur, mais s'arrête avant l'exécution du code principal. Aucune modification n'est effectuée sur les données ou le système, le client reçoit uniquement un retour sur la validité potentielle de la requête.
Il est possible de limiter les validations retournées à des champs spécifiques grâce à l'en-tête Precognition-Validate-Only, utile pour ne signaler des erreurs que lorsque l'utilisateur a terminé de saisir un champ particulier.
La distinction entre les "sub-agents" et le "Master Control Panel" (MCP) est cruciale pour l'architecture des systèmes d'IA. Historiquement, la confusion a conduit à mélanger la fonction de raisonnement ("qui pense") et celle d'exécution ("qui agit"), entraînant des problèmes de gouvernance, de traçabilité et de permissions.
Un sub-agent est conçu pour un rôle cognitif spécialisé, recevant un prompt, un périmètre et des règles pour produire une sortie structurée et utile. Il se concentre sur la pensée critique et la formulation. À l'inverse, un serveur MCP est une infrastructure dont le rôle est d'exécuter des actions de manière contrôlée, en exposant des capacités et des données avec des contrats clairs et une traçabilité.
Cette séparation est particulièrement pertinente lors de la gestion d'incidents. Dans un modèle bien conçu, un orchestrateur délègue des tâches à des sub-agents spécialisés (diagnostic, mitigation), qui formulent des hypothèses et proposent des actions. L'exécution réelle de ces actions est ensuite gérée par les serveurs MCP appropriés, laissant une trace écrite et permettant de comprendre précisément qui a décidé quoi et pourquoi.
MicroLighter est une bibliothèque de coloration syntaxique légère et sans dépendances, conçue pour être rapide et facile à intégrer. Elle ne génère pas de <span> superflus dans le code, ce qui contribue à sa performance. Les grammaires, au format TextMate utilisé par VS Code, peuvent être chargées de manière asynchrone pour optimiser le temps de chargement.
L'installation de MicroLighter se fait simplement via npm. Il suffit d'importer la fonction highlightAll et un thème CSS, puis d'ajouter la classe language-* aux blocs de code. Une option existe pour un chargement automatique immédiat, ainsi qu'un bundle pour utiliser des éléments personnalisés offrant des fonctionnalités comme la copie ou la numérotation des lignes.
MicroLighter prend en charge plusieurs langages de programmation, tels que JavaScript, CSS, HTML, Ruby, Python, SQL et C++. La librairie est pensée pour une utilisation efficace et moderne du code dans les projets web.
Les agents autonomes, malgré leur intégration à diverses sources d'information, peuvent rencontrer des problèmes de pertinence en utilisant des données obsolètes ou en étant submergés par un trop-plein de contexte. La recherche classique, qu'elle soit basée sur des mots-clés (BM25) ou sémantique (vectorielle), ne suffit pas toujours à distinguer les informations véritablement utiles des autres, car elle se concentre sur la ressemblance plutôt que sur la connexion entre les données.
Pour pallier ces limitations, l'article propose de distinguer clairement la "connaissance" (données stables et périssables) du "contexte" (informations temporaires pour une tâche spécifique). Une approche plus avancée consiste à utiliser une ontologie pour modéliser les liens entre les entités. Cette méthode permet de construire un contexte pertinent en naviguant à travers les relations entre les éléments, plutôt qu'en se basant uniquement sur la similarité des textes.
L'article mentionne l'outil Codebase Memory MCP comme un exemple d'application de cette approche, où les éléments de code et leurs interdépendances sont représentés sous forme de graphes. Cela permet de suivre des chaînes de dépendances pour retrouver des informations contextuelles précises, par exemple en explorant les appelants et les dépendances d'une fonction spécifique.
L'auteur a réussi à redonner vie à sa tablette Lenovo Tab P11 Pro, qui était inutilisable suite à une tentative d'installation de ROM Treble. Après huit mois de silence, le problème initial venait d'une batterie en décharge profonde, empêchant toute communication USB. Une fois la batterie rechargée avec un chargeur mural, la tablette a affiché des messages du bootloader, confirmant que le SoC était fonctionnel mais ne parvenait pas à charger un système valide.
La récupération a impliqué l'utilisation du mode EDL (Emergency Download), un mode de secours pour les appareils Qualcomm. Après plusieurs manipulations, la tablette a enfin été reconnue par l'ordinateur en mode EDL, permettant une communication avec le SoC. Le succès dépendait alors de la trouvaille du bon firmware, du bon loader et du bon outil pour le processus de reflashage.
Le processus a également mis en évidence l'importance du "Secure Boot" activé sur l'appareil, limitant le type de chargeurs et de firmwares acceptés par le système, ce qui complique les opérations de débrickage. L'auteur a ainsi dû naviguer parmi les différents firmwares proposés par Lenovo, en commençant par un package SVC (Service) qui contenait les fichiers nécessaires pour le reflashage.
L'article décrit comment modifier la taille du bloc d'adresses IP alloué à chaque nœud (PodCIDR) dans un cluster Kubernetes utilisant Cilium en mode cluster-pool pour la gestion des adresses IP. L'objectif est d'augmenter la capacité de planification de nouveaux pods sur des nœuds performants qui atteignent rapidement la limite de 254 adresses par défaut (/24).
La procédure implique la modification de la configuration de Cilium pour définir un masque de sous-réseau plus large (par exemple, /22) via les valeurs Helm, puis une réallocation manuelle du PodCIDR pour chaque nœud. Cela se fait en supprimant l'entrée actuelle du CIDR du nœud dans l'objet CiliumNode, ce qui déclenche l'opérateur Cilium pour en attribuer un nouveau selon la nouvelle configuration.
Le processus de rollout s'effectue nœud par nœud, en s'assurant que le cluster reste opérationnel. Il faut drainer le nœud, patcher l'objet CiliumNode pour forcer la réallocation, supprimer le pod Cilium et les pods résiduels utilisant l'ancien bloc d'adresses, puis désactiver le draining du nœud. Un script est fourni pour automatiser cette opération sur chaque nœud.
L'auteur présente sa structure HTML de base actuelle, expliquant les choix derrière chaque élément. L'idée principale est de fournir une base solide et bien pensée pour tout projet web, allant au-delà d'un simple copier-coller de modèles existants. Parmi les détails importants, il met en avant l'importance de la déclaration <!DOCTYPE html>, de l'attribut lang pour l'accessibilité et le SEO, ainsi que la gestion de l'encodage des caractères avec <meta charset="UTF-8">. L'utilisation d'une classe no-js sur la balise <html> est également soulignée pour permettre une gestion conditionnelle du JavaScript.
La balise <meta name="viewport"> est essentielle pour assurer un affichage correct et responsive sur les différents appareils mobiles. L'article détaille également la configuration des métadonnées pour l'optimisation des moteurs de recherche (SEO) et le partage sur les réseaux sociaux, incluant des éléments comme la description, le titre, les images et les URL canoniques. Des optimisations pour les icônes de favoris (favicon) et la gestion de la couleur de thème pour les applications web progressives (PWA) sont aussi mentionnées.
Enfin, l'auteur explique l'intégration de feuilles de style, y compris une version spécifique pour l'impression (media="print"), et l'inclusion de scripts JavaScript. L'utilisation de nomodule pour les polyfills JavaScript destinés aux anciens navigateurs et de type="module" pour les scripts modernes est expliquée, démontrant une approche soignée de la compatibilité et des performances.
Une guitare électrique fonctionne différemment d'une guitare acoustique, car elle ne repose pas sur une caisse de résonance pour amplifier le son. Au lieu de cela, elle utilise des cordes métalliques ferromagnétiques qui interagissent avec des capteurs électromagnétiques, appelés micros. Ces micros, composés d'une bobine de cuivre et d'un aimant permanent, transforment les vibrations des cordes en un signal électrique.
Lorsque la corde ferromagnétique, elle-même magnétisée par le champ de l'aimant du micro, vibre, son champ magnétique oscille. Cette oscillation magnétique est alors convertie en un signal électrique par la bobine du micro. C'est ce signal électrique qui est ensuite envoyé vers un amplificateur et un haut-parleur pour produire le son entendu.
Le corps de la guitare électrique joue un rôle principalement esthétique et n'a pas la fonction acoustique amplificatrice des guitares acoustiques. La variété des formes et des matériaux des corps de guitares électriques contribue à l'esthétique de l'instrument, plutôt qu'à la génération acoustique du son.
Après plusieurs fuites de données touchant des services de l’État en 2026 (DGFiP, France Titres, Éducation nationale), il est recommandé de vérifier si son identité a déjà été utilisée frauduleusement : consulter l’historique de ses connexions FranceConnect, demander la liste des comptes bancaires ouverts à son nom via FICOBA, vérifier auprès de la Banque de France une éventuelle inscription aux fichiers FCC/FICP et rechercher les sociétés dont on apparaîtrait comme dirigeant via MonIdenum ou l’Annuaire des entreprises. En cas d’anomalie, il faut contacter l’organisme concerné et déposer plainte ; en prévention, l’article recommande notamment l’authentification multifacteur, des mots de passe uniques et l’utilisation de documents d’identité filigranés ou de justificatifs à usage unique via France Identité.
L'article de Mike Fisher illustre l'importance cruciale des "load-bearing people" (personnes essentielles) à travers l'exemple d'Azer Koçulu et son package left-pad sur npm. En 2016, la suppression de ces onze lignes de code a paralysé des géants comme Facebook ou Netflix, révélant leur dépendance invisible à un seul développeur. L'épisode souligne comment des systèmes entiers reposent sur des éléments apparemment mineurs, souvent maintenus par une seule personne sans que leur rôle ne soit documenté ou partagé.
L'auteur étend cette métaphore à toutes les organisations, où des rôles clés (finance, ventes, opérations, etc.) reposent sur des individus détenant des connaissances non documentées. Ces "load-bearing people" deviennent des points de défaillance critiques, leur absence pouvant paralyser des processus entiers. Leur importance reste masquée jusqu'à ce qu'un incident survienne, mettant en lumière leur rôle indispensable.
Enfin, Fisher explique pourquoi ces risques persistent : les systèmes de reconnaissance valorisent les interventions d'urgence plutôt que la prévention, encourageant la concentration des savoirs plutôt que leur diffusion. Les organisations, en récompensant les "héros" plutôt que les processus robustes, maintiennent involontairement cette dépendance aux individus, malgré les dangers qu'elle représente.
Face à l’augmentation des bots malveillants exploitant l’IA pour scraper des sites ou chercher des failles, l’auteur propose Nginx botcheck, un outil simple pour les bloquer via Nginx. Contrairement à des solutions comme Fail2ban ou des blocages par pays, cette méthode évite les faux positifs tout en restant légère, sans nécessiter de service externe. Elle s’intègre directement dans la configuration de Nginx via son module Lua, avec une activation aussi simple qu’un include dans le fichier de virtualhost.
L’outil se distingue par sa simplicité de configuration, permettant d’ajouter des règles personnalisées via des maps Nginx pour autoriser ou bloquer certains flux. Contrairement à des alternatives complexes comme Anubis, Nginx botcheck reste accessible et modifiable, tout en offrant une protection efficace contre les bots agressifs. Le code est conçu pour être lisible et adaptable, répondant ainsi aux besoins des administrateurs système.
L'auteur a profité de deux semaines de congé pour moderniser son projet personnel Gifty Weddings, un registre de cadeaux de mariage devenu un constructeur de sites web, tout en apprenant à coder avec des outils d'IA. Il a utilisé principalement Claude Code avec le modèle Opus 5 pour le développement, complété par Pi pour les tâches mineures, tout en conservant un rôle actif dans la revue et l'orientation du code.
Malgré ses réticences initiales envers l'IA, nourries par des expériences décevantes en 2024, l'auteur a constaté des progrès significatifs dans l'efficacité des outils, notamment pour générer du CSS ou corriger des bugs complexes. Son approche itérative, combinant des bases existantes (code Go, schéma SQL) et une supervision humaine constante, a permis d'équilibrer automatisation et qualité, bien que certains compromis aient été nécessaires sur le style ou les tests.
L'expérience a révélé des limites, comme la verbosité des commentaires générés par l'IA ou la nécessité de guider activement le processus pour éviter des résultats médiocres. L'auteur souligne l'importance de l'expérience humaine pour distinguer un travail de qualité d'une production superficielle, tout en reconnaissant le gain de temps et d'inspiration apporté par ces outils.
Ce billet explique comment optimiser l'hébergement d'un grand modèle de langage (LLM) en détaillant le mécanisme du KV Cache, essentiel pour gérer l'attention dans les transformers. L'auteur revient sur le fonctionnement des matrices Query, Key et Value (QKV), qui permettent de calculer les relations entre tokens et d'ajuster leur représentation contextuelle. Le KV Cache stocke les vecteurs Key et Value des tokens actifs, réduisant ainsi la charge computationnelle lors des inférences, mais nécessitant une mémoire GPU significative, comme illustré par les 20,77 GiB utilisés pour 209 456 tokens.
L'article aborde ensuite les solutions techniques comme vLLM et KServe, conçues pour améliorer l'efficacité des LLM en production. Ces outils optimisent la gestion des ressources, notamment via des techniques comme le Grouped Query Attention (utilisé par Mistral), qui réduit la redondance des calculs. L'objectif est de concilier performance et scalabilité, permettant aux entreprises de déployer des modèles toujours plus grands tout en maintenant des temps de réponse acceptables pour un grand nombre d'utilisateurs.
Léa Verou défend l’idée que la plupart des sites web n’ont pas besoin d’un bouton de basculement entre les modes clair et sombre. Selon elle, cette fonctionnalité ajoute une complexité inutile pour les utilisateurs, car le mode système (déterminé par l’OS) suffit généralement. Elle explique que les rares cas où un utilisateur souhaite forcer un mode spécifique sont marginaux et que la solution par défaut est souvent plus adaptée.
Elle revient également sur son précédent article recommandant un bouton à deux états (système vs. mode opposé) plutôt qu’à trois états, tout en précisant que cette solution ne répond pas à la question de l’utilité même du bouton. Son analyse s’appuie sur des principes d’expérience utilisateur (UX) et de charge cognitive, soulignant que la simplicité d’implémentation ne rime pas toujours avec facilité d’utilisation.
Enfin, elle mentionne les réactions suscitées par son premier article, partagé massivement, et les objections de Bramus, qui maintient que le contrôle manuel reste pertinent dans certains scénarios. Verou reconnaît que ses arguments n’ont pas convaincu son interlocuteur, mais réaffirme sa position en faveur d’une approche minimaliste.
Le billet explore la disparité entre le style d'écriture public d'Anthropic et celui de son modèle Claude. Ce dernier se distingue par des phrases courtes et percutantes, ainsi que des tournures stylistiques reconnaissables, largement imitées par d'autres modèles dérivés. Pourtant, les publications officielles d'Anthropic, comme les documents de recherche ou les prises de position, adoptent un ton plus classique et conversationnel, sans trace de ce style distinctif.
L'auteur émet plusieurs hypothèses pour expliquer cette différence, allant de préférences personnelles (comme le style d'écriture de Dario Amodei) à des considérations stratégiques ou de marque. Une piste suggère que les équipes en charge des contenus publics évitent délibérément d'associer la voix de Claude à des documents importants, afin de préserver l'image d'un contrôle humain sur les prises de position de l'entreprise.
Enfin, le texte soulève la question de l'utilité du style de Claude pour des audiences exigeantes, suggérant que le marché pourrait inciter Anthropic à atténuer cette particularité. L'auteur note d'ailleurs une évolution progressive chez certains modèles récents, comme Fable, qui semblent moins marqués par ce style.
L’article remet en question l’idée reçue selon laquelle l’utilisation de microservices serait un signe de compétence avancée en ingénierie logicielle. L’auteur, Devrim Ozcay, souligne que la complexité n’est pas une preuve de qualité, mais plutôt un choix facile à faire, souvent au détriment de la maintenabilité et de la fiabilité. Il explique que les microservices, bien qu’utiles dans certains cas, génèrent des coûts opérationnels et techniques importants, comme des problèmes de réseau, de duplication de requêtes ou de gestion de dépendances, transformant des opérations simples en défis de systèmes distribués.
L’auteur critique l’"Arms Race" (course à l’armement) architecturale, où les équipes adoptent des microservices par mimétisme (ex. : "Netflix le fait") sans évaluer si cette solution répond à un besoin réel. Il insiste sur la nécessité de se demander quel problème les microservices résoudront mieux qu’une architecture monolithique bien conçue, laquelle peut offrir des avantages comme une cohérence transactionnelle, un déploiement simplifié et une complexité opérationnelle réduite. Un monolithe modulaire, avec des frontières de domaine claires, peut ainsi servir de base solide avant toute éventuelle décomposition.
Enfin, l’article rappelle que la maîtrise des systèmes distribués, et non leur simple utilisation, distingue les ingénieurs expérimentés. L’auteur met en garde contre la tentation de créer de la complexité artificielle, soulignant que la véritable compétence réside dans la capacité à évaluer quand une solution simple (comme un monolithe) est préférable, et à anticiper les problèmes inhérents aux architectures distribuées, comme les pannes de réseau, les données obsolètes ou les comportements inattendus des consommateurs.
L’article de Dmitry Zakharov critique l’usage de JSON.stringify en JavaScript, qu’il considère comme une mauvaise pratique à proscrire au profit d’outils d’encodage dédiés. Il souligne que cette fonction native, souvent utilisée par défaut, présente des risques majeurs : elle retourne undefined pour certains types (fonctions, undefined), génère des erreurs non explicites (comme pour les BigInt ou les structures circulaires), et surtout, elle corrompt silencieusement les données en les transformant en null ou en les omettant (par exemple, Infinity devient null, ou les clés avec undefined disparaissent).
L’auteur propose une alternative radicale : remplacer JSON.stringify par des encodeurs spécialisés, comme sa propre bibliothèque Sury, conçue pour éviter ces écueils. Il compare cette approche à la philosophie "Parse, don’t validate" de 2019, suggérant qu’elle pourrait devenir une norme dans l’écosystème JavaScript. Bien que JSON.stringify reste utile en interne pour certains encodeurs, Zakharov insiste sur le fait qu’elle ne devrait jamais apparaître directement dans le code applicatif.