Ce tutoriel présente la mise en place d'un système de synthèse vocale sous Linux, principalement destiné aux utilisateurs d'Archlinux mais adaptable à d'autres distributions. L'objectif est de permettre la lecture de textes par des logiciels, notamment les lecteurs d'écran comme Orca ou la fonction "Mode Lecture" de Firefox. La configuration proposée utilise Speech-Dispatcher comme interface centrale pour gérer les différentes voix et moteurs de synthèse.
L'installation repose sur deux composants principaux : Speech-Dispatcher, l'outil d'interfaçage, et un moteur de synthèse vocale. L'auteur recommande Piper-TTS et détaille l'installation des paquets nécessaires via l'AUR, incluant les voix françaises. La configuration de Speech-Dispatcher implique la génération d'un fichier de configuration initial puis son édition pour spécifier l'utilisation du module générique "piper", le réglage de la langue par défaut en français et l'utilisation de Pipewire pour la sortie audio.
La configuration spécifique de Piper-TTS se fait dans un fichier piper.conf qui définit comment Speech-Dispatcher doit appeler le moteur pour générer la voix. Cela inclut la sélection de la voix souhaitée, le réglage du débit et la gestion des paramètres de sortie. Après chaque modification des fichiers de configuration, le service Speech-Dispatcher doit être relancé pour que les changements prennent effet, et des tests peuvent être effectués avec la commande spd-say.
Cet article explique comment configurer une intégration continue (CI) sur Codeberg en utilisant Forgejo Actions, sans nécessiter de services externes ou d'administration d'infrastructure. Le cas pratique abordé est la construction et la publication d'un site statique généré avec Hugo.
Pour qu'un workflow de CI soit détecté par Codeberg, le fichier de configuration YAML doit impérativement être placé dans le répertoire .forgejo/workflows/ du dépôt. Dès qu'un fichier valide est présent à cet emplacement et qu'une modification est poussée, la CI s'exécute automatiquement selon les événements déclencheurs définis.
Le document présente un exemple de workflow nommé "Build Hugo site" qui se déclenche à chaque push sur la branche main et lors des pull requests. Ce workflow utilise un job unique s'exécutant sur un runner Linux fourni par Codeberg, avec une étape initiale de récupération du code source du dépôt.
Une requête d'effacement GDPR, telle que traitée dans une application Symfony/Doctrine, est présentée comme un processus de longue durée et partiellement asynchrone, et non comme une simple opération CRUD. Cette distinction est cruciale car l'effacement des données doit s'étendre à diverses sources, y compris les index de recherche, les caches, et les systèmes externes, qui ne partagent pas une transaction commune avec la base de données principale.
L'approche proposée modélise la requête d'effacement comme une entité de première classe, un "cas" doté d'un cycle de vie. Ce cas suit la progression des différentes étapes d'effacement, chacune étant marquée comme terminée individuellement. L'état de complétion global est déterminé par la vérification que toutes les étapes requises ont été explicitement achevées.
Pour gérer la communication entre la base de données Doctrine et d'autres systèmes, une approche utilisant une machine à états explicite et un mécanisme "Outbox" est recommandée. Cela permet une orchestration fiable, incluant l'idempotence pour chaque étape et une API de statut qui reflète précisément l'état réel du processus, évitant ainsi de signaler une complétion prématurée.
Pour respecter le Règlement Général sur la Protection des Données (RGPD), il est crucial de gérer les requêtes d'effacement des données personnelles avec une extrême prudence. L'envoi d'informations personnelles identifiables (PII) directement dans les messages déclenchant ces requêtes, même avec de bonnes intentions, crée des copies non désirées de ces données. Ces copies peuvent persister dans divers systèmes tels que les brokers de messages, les tables d'envoi, les files de nouvelle tentative, les files de messages échoués, et même dans les journaux, contredisant ainsi l'objectif d'effacement.
La solution proposée consiste à distinguer clairement les différents types de messages impliqués dans le processus d'effacement. Il faut différencier une commande interne, un événement de domaine interne, et un événement d'intégration public. Seul cet événement d'intégration, destiné à être consommé par d'autres services, est le point où les données traversent les frontières du système et doivent être traitées avec le plus de rigueur.
L'approche recommandée est de ne jamais inclure directement les PII dans l'événement d'intégration public. Cet événement ne devrait contenir qu'un identifiant unique du sujet de l'effacement. Les détails des données à effacer doivent être gérés en interne par le service initiateur, sans être exposés dans le message qui voyage à travers différents systèmes, garantissant ainsi que le processus d'effacement ne laisse pas de traces de données personnelles là où elles ne devraient pas être.
Le pattern "Transactional Outbox" vise à résoudre le problème de la double écriture entre une base de données relationnelle et un système de messagerie comme RabbitMQ dans les applications événementielles Symfony. Ce problème survient lorsque la persistance des données dans la base de données et l'envoi d'un événement correspondant à un autre système ne sont pas atomiques, entraînant des incohérences si l'un des deux processus échoue.
Ce pattern garantit l'atomicité en écrivant l'événement dans une table dédiée de la base de données, la table "outbox_message", au sein de la même transaction que les données métier. Ainsi, soit les données métier et l'enregistrement de l'événement sont persistés ensemble, soit aucun des deux n'est enregistré.
Un processus séparé, l'"Outbox Relay", est ensuite responsable de lire les messages non publiés de cette table, de les envoyer à RabbitMQ, puis de marquer ces messages comme publiés. Cette approche garantit qu'un événement est soit bien enregistré dans la base de données et envoyé au système de messagerie, soit ni l'un ni l'autre, résolvant ainsi les échecs critiques qui pourraient survenir entre les deux écritures indépendantes.
L'article décrit la construction de PABLO, un orchestrateur développé en Symfony, visant à automatiser les tâches répétitives et à réduire les changements de contexte pour les développeurs. PABLO s'appuie sur une machine à états pour gérer le cycle de vie des tâches, allant de la compréhension initiale à la mise en production.
Avant PABLO, l'auteur utilisait un environnement de développement basé sur des agents capables de comprendre les tickets et le code associé. Cependant, la phase post-développement, impliquant les revues, les tests QA et la surveillance de la CI/CD, restait un processus manuel coûteux en changements de contexte et en temps.
PABLO a été créé pour combler ce fossé, en centralisant la gestion de ces différentes étapes. Son objectif est de décharger le développeur des corvées d'attente et de vérification, lui permettant de se concentrer sur l'écriture de code et l'innovation, tout en maintenant une vision claire de l'état d'avancement des projets.
Cloudflare Quick Tunnels permet de rendre accessible une application locale sur Internet via une URL publique et chiffrée. L'outil, accessible via une simple commande cloudflared tunnel --url <votre_url_locale>, ne requiert aucune configuration DNS, ouverture de ports ou création de compte. Il établit une connexion sortante sécurisée vers le réseau Cloudflare, protégeant ainsi l'adresse IP de l'utilisateur tout en offrant une protection DDoS et une connectivité globale.
Cette solution est particulièrement adaptée aux développeurs pour le partage d'aperçus en temps réel, la réception de webhooks ou les tests de navigateurs. L'architecture "outbound-only" garantit que votre machine reste privée, le trafic ne passant que par les connexions initiées par cloudflared vers le réseau Cloudflare. Les requêtes entrantes sont relayées à travers cette connexion sécurisée, sans jamais exposer de ports sur votre routeur.
L'utilisation de Quick Tunnels est simplifiée en trois étapes : installer l'agent cloudflared, lancer votre application locale, puis exécuter la commande pour créer le tunnel. Le résultat est une URL éphémère prête à être partagée, pouvant également être formatée en JSON pour les scripts ou les agents de codage.
La "Cheat Sheet" d'Interfaces.dev propose des conseils pratiques pour améliorer l'expérience utilisateur en matière d'interfaces graphiques. Elle met l'accent sur l'importance de l'alignement optique plutôt que géométrique, et recommande l'utilisation d'ombres projetées en couches pour créer de la profondeur, évitant ainsi les bordures qui peuvent parfois nuire à l'esthétique.
Concernant les animations, la charte suggère que les éléments doivent s'animer à partir de leur point de déclenchement et que les animations de sortie devraient être plus subtiles que celles d'entrée. Pour les transitions, il est conseillé de nommer explicitement les propriétés à animer plutôt que d'utiliser "all", et d'appliquer des transformations légères comme une légère mise à l'échelle pour les interactions comme l'appui sur un bouton.
Enfin, pour l'apparence et la typographie, il est recommandé d'utiliser des formats de police .woff2 pour le web, de s'assurer d'une largeur de ligne appropriée pour les textes longs afin d'en faciliter la lecture, et d'utiliser des propriétés comme font-variant-numeric: tabular-nums pour maintenir une largeur de chiffre constante dans les éléments numériques afin d'éviter les décalages de mise en page.
Excalidraw est un tableau blanc virtuel open-source conçu pour créer des diagrammes au style dessiné à la main. Il offre une multitude de fonctionnalités pour la conception de wireframes et de schémas, incluant un large éventail d'outils (rectangles, cercles, lignes, dessin à main levée, etc.), le support d'images et de bibliothèques de formes.
Le projet met l'accent sur l'exportation des créations dans des formats variés tels que PNG, SVG, ou sous forme de fichier JSON .excalidraw propriétaire, permettant une réutilisation et une édition ultérieures. L'application web hébergée sur excalidraw.com, faisant partie du même dépôt, démontre ces capacités avec des fonctionnalités supplémentaires comme la collaboration en temps réel et le chiffrement de bout en bout.
Excalidraw se distingue par son style visuel distinctif qui imite des dessins faits à la main, offrant ainsi une alternative plus humaine aux diagrammes numériques traditionnels. Il est entièrement gratuit et personnalisable, le rendant accessible pour divers besoins créatifs et de documentation.
Ce projet fournit une compétence pour des agents de codage afin de réaliser des audits de sécurité multi-phases. Il automatise le processus d'identification et de vérification des vulnérabilités en orchestrant plusieurs agents à travers des étapes distinctes.
Le processus d'audit comprend six phases : la reconnaissance pour cartographier l'architecture, la chasse basée sur la couverture pour identifier les lacunes, la validation des candidats par des agents indépendants, la structuration des résultats avec des verdicts clairs (confirmé, à valider, rejeté), une vérification finale des sources indépendantes et enfin, la génération de rapports neutres pour la cible.
Cette compétence est conçue pour être additive lors d'exécutions multiples, permettant de cibler de nouvelles lacunes, de revalider les modifications et de conserver les preuves existantes sans considérer le travail non résolu comme couvert. Les résultats sont exportés dans des formats lisibles par machine, tels que findings.json, et des rapports synthétiques sont générés pour faciliter la compréhension.
Le modèle "Chief of Staff" propose une approche d'orchestration pour les agents d'IA de codage, visant à pallier les limitations des sessions uniques et de longue durée. L'idée principale est de séparer clairement les tâches de coordination et d'exécution. Une session dédiée agit comme coordinatrice, responsable de la rédaction des instructions, de la vérification des résultats et de la maintenance de l'état global, tandis que d'autres sessions plus courtes sont chargées de l'implémentation effective du code.
Cette architecture résout les problèmes inhérents aux sessions d'IA prolongées, notamment la perte d'informations contextuelles due à la compaction et la dérive entre les auto-rapports des agents et la réalité du code. En externalisant l'état sur une plateforme durable, comme un tableau de bord ou un système de gestion de tâches, les informations importantes survivent aux interruptions de session et sont accessibles aux futures opérations. Chaque rapport d'agent est traité comme une preuve à vérifier plutôt qu'une instruction à suivre aveuglément, renforçant ainsi la fiabilité du processus.
La structure du "Chief of Staff" s'inspire des modèles organisationnels humains, où un individu peut superviser sans nécessairement réaliser le travail lui-même. C'est une adaptation du pattern orchestrateur-worker ou coordinateur-implémenteur-vérificateur, garantissant que le travail effectif est réexécuté et validé avant d'être considéré comme accompli. Ce modèle vise à améliorer la robustesse et la fiabilité des tâches de codage complexes effectuées par des agents IA sur de longs horizons.
Le concept de "senior engineer death spiral" décrit une dynamique négative qui peut affecter les ingénieurs, en particulier lorsqu'ils abordent de nouveaux rôles ou projets ambitieux. Ce phénomène débute souvent par un sentiment de syndrome de l'imposteur, poussant l'ingénieur à vouloir prouver sa valeur en entreprenant des tâches complexes, voire démesurées, sans communication adéquate.
Cette approche conduit à un isolement progressif, marqué par des périodes d'absence et des mises à jour superficielles lors des réunions d'équipe. L'ingénieur, conscient de son manque de progrès concret, tente alors de compenser par un surcroît de travail, négligeant son bien-être et ses relations. Ce cycle peut mener à l'épuisement professionnel, des dépressions, et ultimement, à des conséquences professionnelles graves comme des licenciements.
Face à cette spirale, la solution proposée est contre-intuitive : il s'agit de réduire la pression auto-imposée et de se concentrer sur la collaboration. Plutôt que de viser le statut d'ingénieur senior par un effort isolé, il est conseillé de devenir un membre d'équipe particulièrement soutenant. Cette stratégie, basée sur la confiance et l'ouverture, permet de rétablir la visibilité sur son travail et de solliciter l'aide de ses pairs, tout en préservant son équilibre.
L'article présente le projet Meshtastic, une initiative visant à créer un réseau de communication décentralisé basé sur la technologie LoRa. L'objectif est de proposer une alternative indépendante des réseaux cellulaires traditionnels, principalement pour la transmission de textes bas débit, utilisable en cas de pannes ou d'événements extrêmes, mais aussi comme un projet technique ludique.
Ce réseau maillé repose sur l'utilisation bénévole d'équipements qui se relaient les messages. La technologie LoRa est choisie pour sa capacité à transmettre des signaux sur de longues distances et à travers des obstacles, avec une consommation d'énergie réduite.
L'auteur aborde également les notions techniques de base relatives aux ondes électromagnétiques, expliquant leur propagation et les concepts de fréquence et de puissance en dBm pour caractériser la force des signaux radio.
L'exploitation des vulnérabilités applicatives est devenue le principal vecteur d'atteinte à la sécurité, surpassant le vol d'identifiants. Ces vulnérabilités résultent souvent de lignes de code qui n'ont pas été écrites avec la sécurité en tête dès le départ, soulignant que la sécurité logicielle est une composante de la qualité, au même titre que la performance ou la maintenabilité. L'article identifie six pièges récurrents chez les clients, la première étant l'injection SQL.
L'injection SQL permet à un attaquant d'exécuter des commandes SQL arbitraires en manipulant les données d'entrée. Un exemple concret est la brèche TalkTalk en 2015, causée par une injection SQL sur des pages web héritées, entraînant une amende record pour l'entreprise. La remédiation passe par l'utilisation de requêtes paramétrées, qui séparent clairement la requête SQL des données, empêchant l'interprétation malveillante des entrées.
L'utilisation d'ORM ou d'annotations Java spécifiques, comme celles de Spring Data JPA, peut empêcher structurellement les injections SQL, car les valeurs des annotations doivent être des expressions constantes évaluables à la compilation. L'impact métier de telles vulnérabilités inclut l'accès non autorisé aux données, des répercussions directes sur les clients et des problèmes de conformité, notamment avec le RGPD.
L'article met en évidence une préoccupation croissante face à la prolifération d'outils basés sur l'intelligence artificielle qui semblent manquer de fondement réel et d'utilité pratique. L'auteur cite l'exemple d'une application censée aider à survivre à la canicule, dont le fonctionnement est basé sur une logique évidente et qui, de surcroît, a été développée par quelqu'un sans compétences techniques et sans compréhension de ses propres créations, suggérant ainsi que l'application ne fonctionne pas réellement.
Le texte poursuit en décrivant comment les chatbots, en générant du contenu sans nécessiter de validation scientifique ou de compétences réelles, permettent de concrétiser des idées potentiellement stupides sans aucun contrôle. L'auteur se réfère à Cory Doctorow pour souligner que les dirigeants apprécient les chatbots pour leur docilité plutôt que pour leur capacité à effectuer un travail productif, ce qui conduit à un manque de réflexion critique sur les idées générées.
En conclusion, l'article suggère que l'impact réel des chatbots sur le monde du travail et la société est limité, contrairement à l'impact potentiel d'une indisponibilité d'outils de communication essentiels. Contrairement à la bulle Internet, où l'adoption venait des employés cherchant l'efficacité, la bulle IA semble être imposée par la direction, soulevant des doutes sur sa durabilité et sa valeur intrinsèque.
L'article soutient qu'il est plus avantageux de se concentrer sur la compréhension des principes fondamentaux plutôt que sur l'accumulation de conseils pratiques. Ces principes, situés à la base de l'arbre de la connaissance, sont les plus universels et les moins dépendants des contextes spécifiques. Contrairement aux conseils pratiques qui représentent les feuilles de cet arbre et ne s'appliquent qu'à des situations très précises, les principes permettent une meilleure adaptabilité et une compréhension plus large.
En se focalisant sur les principes de base, on acquiert une capacité plus grande à naviguer dans diverses situations, même celles qui s'éloignent des exemples initiaux. Par exemple, comprendre la physiologie et le métabolisme énergétique est plus utile pour rester en forme que de suivre aveuglément un plan d'entraînement spécifique, surtout si celui-ci n'est pas adapté à sa propre condition. De même, pour la création d'une entreprise, la compréhension des principes économiques et de gestion est préférable à la simple adoption de tactiques marketing ponctuelles.
En résumé, investir du temps dans l'apprentissage des fondements d'un domaine permet de développer une expertise plus robuste et adaptable. Cette approche permet de dériver des solutions pertinentes pour un plus grand nombre de scénarios concrets, au lieu de se limiter à l'application de conseils qui peuvent rapidement devenir obsolètes ou inapplicables dès que les circonstances changent.
Le numérique, bien qu'il ne soit pas intrinsèquement mauvais, a été rendu nocif à de nombreux niveaux. Il est devenu physiquement inconfortable, psychologiquement addictif et économiquement contraignant, nous privant du contrôle sur nos appareils qui sont fréquemment remplacés. Cette obsolescence programmée et la dépendance envers les fabricants nous poussent à renouveler nos équipements sans cesse, renforçant une forme de passivité et d'obéissance aux grandes entreprises.
Face à cette situation, certains se tournent vers la "fuite" numérique, explorant des alternatives comme le rétrocomputing et le technopunk. Cette approche privilégie la simplicité et la fonctionnalité, rejetant les impératifs de mise à l'échelle et de profit au profit de solutions durables et centrées sur l'utilisateur, même si elles ne supportent pas les technologies modernes les plus complexes.
La méfiance s'étend également aux réseaux sociaux, qui, malgré leur potentiel à connecter des individus aux intérêts communs, peuvent paradoxalement éloigner les proches et enfermer les communautés dans des dynamiques consuméristes. L'article suggère ainsi que se détourner de certaines plateformes peut être une étape nécessaire pour retrouver une connexion plus authentique.
Pour améliorer l'efficacité des agents de code, il est essentiel de distinguer clairement le rôle des instructions et des skills. Les instructions définissent le contexte global du projet, tels que la stack technologique, les patterns d'architecture, les conventions de nommage, les consignes de sécurité, la gestion des erreurs et les standards de documentation. Elles sont appliquées silencieusement et peuvent cibler l'ensemble du dépôt ou des chemins de fichiers spécifiques.
Les skills, quant à eux, sont conçus pour exécuter des tâches individuelles et réutilisables, déclenchées explicitement par l'utilisateur. Contrairement aux instructions qui sont spécifiques au produit, les skills visent une applicabilité plus large. Un skill est décrit par un fichier SKILL.md contenant ses métadonnées et ses instructions, et peut être accompagné de scripts, de références ou d'autres ressources pour une exécution complète.
La bonne structuration de ces éléments permet aux agents de code de mieux comprendre les attentes. Les instructions conditionnent le comportement général de l'IA, tandis que les skills agissent comme des outils programmables pour des actions précises, garantissant ainsi une génération de code plus cohérente et performante.
TinyJS permet de créer des applications de bureau pour macOS, Windows et Linux avec une taille de fichier minimale d'environ 6 Mo. Il utilise un backend JavaScript exécuté sur txiki.js pour un accès complet au système et une fenêtre native (WebView) déjà présente sur le système d'exploitation, évitant ainsi l'embarquement de navigateurs lourds comme Electron.
La plateforme offre un accès système complet via RPC sur un socket Unix, des mises à jour à chaud sans étape de compilation pour le développement, et l'intégration d'éléments d'interface natifs comme les menus ou les boîtes de dialogue. TinyJS se distingue par sa légèreté et son approche minimaliste par rapport à des solutions comme Electron ou Tauri, tout en offrant la possibilité d'intégrer facilement du HTML, CSS et JavaScript existant.
L'utilisation de AbortController en JavaScript permet de gérer les requêtes API afin d'éviter la réception de données obsolètes. Dans les interfaces utilisateur dynamiques, comme les champs de recherche ou les filtres, plusieurs requêtes peuvent être lancées rapidement, et leur ordre d'arrivée peut ne pas correspondre à leur ordre d'envoi. Cela peut entraîner une "condition de concurrence" où une réponse plus ancienne écrase des résultats plus récents et pertinents.
Pour pallier ce problème, un AbortController peut être instancié pour chaque nouvelle requête. En passant son signal à la fonction fetch, il devient possible d'annuler explicitement la requête précédente avant d'en lancer une nouvelle. L'appel à la méthode abort() du contrôleur signale aux API compatibles d'interrompre leur opération.
Il est essentiel de distinguer l'annulation d'une requête des erreurs réseau. L'annulation déclenche un rejet de promesse spécifique qui ne doit pas être traité comme une erreur standard. En gérant ces annulations correctement, les applications peuvent garantir que seules les données les plus récentes sont affichées, améliorant ainsi l'expérience utilisateur.
Résumé pour Shaarli:
L'article explique comment prévenir les réponses obsolètes des API en utilisant AbortController. Cela est particulièrement utile pour les interfaces dynamiques où plusieurs requêtes peuvent être envoyées rapidement, créant un risque que des réponses plus anciennes arrivent après des plus récentes. AbortController permet d'annuler les requêtes en cours avant d'en lancer de nouvelles, garantissant ainsi que seules les données les plus à jour sont utilisées.