logo hsb.horse

Blog

Blog

Une liste d’articles regroupant des notes techniques et des retours d’expérience de développement.

Tags du blog
  1. Politique de base lors de la mise en œuvre d'un serveur API avec Golang

    J'ai organisé mes propres politiques de base lors de l'écriture d'un serveur API dans Go, y compris un binaire unique + cobra, la concentration sur les opérations, la séparation HTTP/CLI, la gestion sécurisée des erreurs et l'arrêt progressif.

  2. Guide de conception pour créer une application iOS d’autocontrôle avec l’API Screen Time

    Des pièges de NEDNSProxyProvider à l’architecture FamilyControls + ManagedSettings, aux deux Shield Extensions, au handoff de déverrouillage via App Group et aux limites du Personal Team. Voici une vue d’ensemble de la création d’une app iOS de blocage avec l’API Screen Time.

  3. Morceaux K-POP que les ingénieurs IT devraient écouter

    5 titres K-POP à découvrir avec des termes informatiques et des concepts cyber. Le métaverse d'aespa, le glitch de NCT DREAM, le « GPT » de STAYC — de la musique où la technologie se ressent visuellement et soniquement.

  4. TypeScript Monorepo Organiser la solution optimale édition 2026

    Nous avons organisé les rôles de l'espace de travail pnpm, Turborepo, TypeScript Project References, Biome et WXT, et avons résumé la solution simple à usage général et la solution pratique avec une structure en 4 packages.

  5. Implémenter le déverrouillage depuis Shield Extension vers l’app principale via App Group

    Il est impossible de lancer directement l’app principale depuis ShieldActionDelegate. Voici un modèle de handoff où l’extension écrit une demande de déverrouillage dans le stockage partagé App Group et où l’app la lit ensuite.

  6. Concevez des blocs auto-limitants pour iOS avec FamilyControls + ManagedSettings

    Comment les trois éléments AuthorizationCenter, FamilyActivityPicker et ManagedSettings sont combinés. Nous avons organisé les raisons pour lesquelles une conception basée sur des jetons devrait être utilisée à la place d'une saisie de domaine en texte libre et le cadre de sa mise en œuvre.

  7. Ne sélectionnez pas NEDNSProxyProvider lors de la création d'un bloc de site sur iOS

    Nous avons enregistré une enquête sur les problèmes techniques et politiques liés à l'utilisation de NEDNSProxyProvider dans les applications iOS d'autocontrôle distribuées sur l'App Store, ce qui a conduit à la décision de migrer vers l'API Screen Time.

  8. Avec Personal Team, il est impossible de tester Family Controls sur un vrai appareil

    Un compte Personal Team gratuit ne peut pas obtenir l’entitlement Family Controls Development. Voici pourquoi l’adhésion à l’Apple Developer Program devient une condition pour tester sur appareil réel et ce qui est concerné.

  9. L’interface Shield iOS nécessite deux extensions, pas une

    L’écran Shield affiché par ManagedSettings repose sur deux cibles distinctes : une Action Extension et une Configuration Extension. Voici les bons NSExtensionPointIdentifier et les classes principales à utiliser.

  10. J'ai publié les bonnes pratiques SolidJS en tant que skill sur skills.sh

    Un compte-rendu de la publication des bonnes pratiques SolidJS sur skills.sh en utilisant la fonctionnalité skill de Claude Code. J'y aborde comment la précision de la description détermine la précision du déclenchement, et le processus de vérification des différences par des tests with/without.

  11. Configuration du M4 Mac mini

    J'ai fini par acheter un M4 Mac mini trouvé à prix cassé lors d'une étrange promo Amazon, avec encore plus de réduction grâce à mes points. Voici mes notes de configuration, en gardant en tête une future gestion basée sur NixOS.

  12. Tout ce qui a bloqué lors de la publication de @hsblabs/web-stream-extras sur npm

    Récit chronologique des erreurs rencontrées en passant d'une publication manuelle à GitHub Actions + npm Trusted Publisher. Le 422 de provenance, l'ordre des tags et la validation avant publication.

  13. Publication de @hsblabs/web-stream-extras

    Une petite bibliothèque utilitaire TypeScript pour manipuler ReadableStream<Uint8Array> dans le navigateur et dans Node.js, avec helpers de conversion d'octets, transform streams et chiffrement de flux via Web Crypto API.

  14. Chiffrer des flux d'octets dans le navigateur avec Web Crypto

    Web Crypto fournit de puissantes primitives de chiffrement, mais pas d'interface orientée flux. Voici comment chiffrer un ReadableStream<Uint8Array> avec le sous-chemin encryption de @hsblabs/web-stream-extras — chiffrement de fichiers, gestion de clés par flux et composition dans des pipelines.

  15. J'en avais assez de réécrire le même boilerplate Web Streams

    Pourquoi j'ai fini par regrouper des utilitaires ReadableStream<Uint8Array> dans @hsblabs/web-stream-extras. Les trois motifs qui revenaient sans cesse, la classe de base ByteTransformStream et le chiffrement de flux avec Web Crypto.

  16. Échec du VPC Peering AWS Cross-Région

    Bloqué lors de la configuration du VPC peering entre Osaka et Tokyo. Oubli de --peer-region, état failed, impossible à supprimer.

  17. Mes notes sur `Cache-Control: max-age=3, must-revalidate`

    Une mise au clair du comportement d’une configuration Cache-Control dite de micro-caching. Cet article explique ce que produit réellement la combinaison `max-age=3` + `must-revalidate`, son déroulé dans le temps et des cas d’usage concrets.

  18. Implémenter un éditeur Live réservé au développement dans les projets Astro

    Comment implémenter un éditeur basé sur navigateur limité au mode développement dans Astro. Utiliser le middleware Vite et React pour rendre la gestion de contenu en développement confortable sans affecter les builds de production.

  19. Configuration d'applications mobiles du point de vue d'un ingénieur web : approche de récupération des métadonnées au démarrage

    Organisation des défis de gestion de domaine et de versioning des applications mobiles à partir de l'expérience du frontend web et de l'infrastructure. Proposition d'une approche de récupération des métadonnées au démarrage via CloudFront et S3, avec comparaisons avec les solutions existantes comme Firebase Remote Config.

  20. Cause et résolution d’un 404 sur /blog avec Astro + bun dev

    Comment isoler un 404 sur /blog avec Astro + bun dev en vérifiant les liens, la génération des routes puis le chemin de livraison. Inclut le correctif de collision de répertoire.

  21. Corriger le verrouillage de version mise qui ne fonctionne pas sur Codex Cloud

    mise install bun réussit mais bun renvoie command not found sur Codex Cloud. Cause et solution avec setup.sh, mise use -g et mise activate.

  22. Procédure d'adoption de lefthook: exécuter Biome automatiquement en pre-commit et pre-push

    Procédure concrète pour configurer lefthook et exécuter automatiquement le formatage et le lint Biome au commit et au push. Le guide couvre l'ADR, la configuration, l'installation et la vérification.

  23. Analyser les dépendances incluses dans un artefact de build

    Les binaires compilés avec Go embarquent des informations sur les dépendances utilisées et les paramètres de build.

  24. J’ai créé personality-analyzer, un skill d’analyse de personnalité pour Claude

    Journal de développement d’un skill qui produit des scores HEXACO et MBTI au format YAML à partir des échanges avec Claude. Une tentative de quantifier les traits de personnalité depuis des conversations avec une IA.

  25. Automatiser des sauvegardes chiffrées par répertoire avec age et tar

    Un script shell qui combine age et tar pour créer une archive chiffrée pour chaque sous-répertoire. Il conserve des noms de fichiers compatibles CLI, même avec des dossiers en japonais.

  26. Guide d'implémentation de l'UUID v7 : Créer avec JavaScript, Go et Shell

    La structure binaire de l'UUID v7, les paramètres binaires de la version/variante, l'implémentation minimale dans JavaScript, Go et Shell, les éléments de vérification lors de l'implémentation et les références RFC sont organisés sur une seule page. Un guide pratique qui résume les points à vérifier dans la logique de génération pour les développeurs qui souhaitent introduire en toute sécurité des identifiants faciles à trier en séries temporelles. Il peut être utilisé pour confirmation avant la mise en œuvre.

  27. Clarifier la différence entre Glossary et Dictionary

    Comparaison entre Glossary et Dictionary du point de vue du périmètre, de l’objectif, des mots inclus et de l’auteur.

  28. Supprimer les commentaires de licence du JS bundle avec esbuild/Vite

    Réduire légèrement la taille du bundle en supprimant les commentaires de licence des fichiers générés par esbuild ou Vite.

  29. Activer React Compiler dans WXT

    Les étapes de configuration pour activer React Compiler dans WXT. Inclut l'installation de babel-plugin-react-compiler et son ajout à la config.

  30. Comment configurer le routage des sous-répertoires avec Cloudflare Workers

    Étapes de configuration pour déployer un projet Astro sous un sous-répertoire avec Cloudflare Workers. Organisé comment ajuster wrangler.json et astro.config.

  31. Comportement de sh -c et règles de lecture des fichiers de configuration zsh

    Organisé le comportement de la commande sh -c, les règles d'héritage des variables d'environnement, la validité de shebang et la manière dont les fichiers de configuration zsh (.zshrc, .zshenv, etc.) sont lus lors de l'exécution des scripts.

  32. Implémentation du hachage CRC32 dans TypeScript

    Étapes pour implémenter l'algorithme de hachage CRC32 dans TypeScript. Organise les techniques d'accélération à l'aide de tables de recherche et d'exemples d'utilisation réelle.

  33. Désactiver les avertissements Biome sur les variables inutilisées dans les fichiers Astro/Vue/Svelte

    Comment désactiver les avertissements Biome sur les imports et variables inutilisés dans les fichiers Astro, Vue et Svelte avec la configuration overrides.

  34. Notes de configuration Go : framework web et outils de développement

    Notes sur le framework web et les outils de développement étudiés lors de la mise en place d’un environnement Go. Résumé rapide de Echo et Air.

  35. Convertir des images en AVIF avec libavif

    Installer libavif avec Homebrew puis convertir des JPEG/PNG en AVIF. Fonctionne pour une conversion unitaire comme pour un traitement par lot.

  36. Exécutez un script d'exécution périodique avec macOS Launchd

    Comment créer un script qui s'exécute toutes les minutes comme Cron sur macOS Launchd. Instructions de configuration qui évitent les problèmes de variables d'environnement et incluent la gestion des journaux.

  37. Commencer l’expansion d’abréviations shell avec zabrze : une alternative plus simple à zsh-abbr

    Installation et utilisation de zabrze, un outil d’expansion d’abréviations shell. Une alternative plus simple à zsh-abbr pour saisir les commandes plus efficacement.

  38. Implémenter un découpage de texte ligne par ligne avec TransformStream : LineSplitTransform

    Une implémentation TransformStream qui découpe les données binaires d'un flux en lignes. Pratique pour traiter progressivement des logs et des flux texte.

  39. Mettre en place un traitement d’image avec OffscreenCanvas et Web Worker

    Comment traiter des images avec Web Worker et OffscreenCanvas sans bloquer le thread principal. L’article s’appuie sur un exemple concret de conversion en WebP.

  40. Une fonction utilitaire TypeScript pour convertir des valeurs en ReadableStream

    Une fonction utilitaire qui convertit des chaînes, objets et autres valeurs en ReadableStream. Une façon de manipuler des flux typés sans passer par Blob.

  41. Implémentation de la détermination de l'adresse IP de la plage CIDR avec TypeScript

    Pour les environnements dans lesquels des modules externes tels que CloudFront Function ne peuvent pas être utilisés, nous avons implémenté notre propre détermination d'adresse IP dans la plage CIDR. Organisé l'implémentation de la syntaxe de classe à l'aide d'opérations au niveau du bit.

  42. Comment exécuter un serveur API construit avec Bun+Hono sur AWS Lambda

    Étapes pour exécuter le serveur API Hono sur AWS Lambda avec le runtime Bun. Explique la configuration pour compiler en tant qu'exécutable à fichier unique et l'exécuter avec Lambda Web Adapter.

  43. Réécrire generate-project-summary.py avec Bun + TypeScript

    Réimplémentation en Bun + TypeScript d'un script Python de résumé de projet. Retour sur la création d'un binaire portable pour faire lire un dépôt entier à un LLM.

  44. Implémentation TypeScript pour trier des fichiers média par résolution

    Une implémentation TypeScript concise pour trier vidéos ou images par résolution (largeur × hauteur). Utile pour ordonner des médias Twitter.

  45. Un script de déploiement pour servir une SPA avec CloudFront + S3

    Un script de déploiement concret pour servir une SPA hébergée sur S3 derrière CloudFront. Cet article récapitule les réglages de cache-control, une structure de déploiement de type blue-green et la procédure de rollback.

  46. Supprimer une base de données non vide dans AWS Athena

    Que faire lorsqu’une tentative de suppression d’une base non vide dans AWS Athena échoue. Une note rapide sur l’utilisation de DROP DATABASE CASCADE.

  47. Générer des numéros de Lotto 6 et Lotto 7 en TypeScript

    Une implémentation TypeScript qui génère des numéros de Lotto 6 et Lotto 7 avec le Mersenne Twister. Un exemple pratique de générateur pseudo-aléatoire.

  48. Envoyer une requête TypeScript vers un API Gateway protégé par IAM

    Implémentation TypeScript pour appeler depuis un environnement local un API Gateway protégé par IAM en utilisant SigV4 du SDK AWS pour JavaScript.

  49. Synchroniser du Markdown vers Confluence avec markdown-confluence CLI

    Comment introduire et exploiter `@markdown-confluence/cli` pour synchroniser des documents Markdown stockés dans un dépôt Git vers Confluence. Cet article organise un flux de partage pour des ADR et d’autres documents.

  50. Vue Composable pour gérer l'état global sans Pinia

    Une méthode d'implémentation légère pour réaliser une gestion globale de l'état à l'aide des réactifs et toRefs de Vue sans utiliser Pinia.

  51. Considérez les modèles de stratégie lorsque les branches v-if augmentent dans Vue

    Lorsqu'il existe au moins trois modèles de branchement conditionnel utilisant v-if, envisagez de mettre en œuvre un modèle de stratégie pour changer dynamiquement de composants. Lisibilité et maintenabilité améliorées.

  52. Implémentation de TypeScript pour générer des images à partir de HTMLVideoElement

    Une implémentation TypeScript qui utilise Canvas et VideoElement pour extraire l'image actuelle d'une vidéo sous forme d'image. Organisé la méthode de génération de blobs basée sur des promesses.

  53. Créer un job Cron avec PM2 : comme alternative à launchd

    Comment créer un job planifié avec PM2 sur macOS au lieu de launchd. Résumé du fichier de configuration et exemple d’exécution périodique avec Bun.

  54. Ma première implémentation de plugin Vite : générer automatiquement des métadonnées de build

    Comment brancher un traitement personnalisé dans le cycle de build de Vite avec l’API de plugin. Un exemple à partir d’un plugin qui génère une version sémantique basée sur le temps.

  55. Changez la destination de la copie Vault en racine avec le plugin starlight-obsidian

    Comment changer le comportement par défaut du plugin starlight-obsidian et copier Obsidian Vault directement sous src/content/docs. Implémentation organisée pour résoudre les différences dans la structure hiérarchique de la barre latérale.

  56. Implémentation TypeScript de la stéganographie à l'aide de sélecteurs de variantes

    Une implémentation TypeScript d'une méthode de stéganographie qui exploite le sélecteur de variantes d'Unicode pour intégrer des chaînes cachées et invisibles dans le texte.

  57. Implémentation TypeScript pour extraire la taille depuis une URL vidéo Twitter

    Une implémentation TypeScript qui extrait la résolution contenue dans une URL vidéo Twitter (X) avec une expression régulière. Résumé du motif d’URL et de la méthode.

  58. Notes sur les tentatives infructueuses de récupération de fichiers WOFF à partir de Google Fonts dans le navigateur

    Un enregistrement d'essais et d'erreurs essayant d'obtenir des fichiers ttf/otf/woff de Google Fonts côté client et de les utiliser avec @vercel/satori. Correction des limitations de l'en-tête User-Agent et des problèmes de non-compatibilité woff2.

  59. Configuration pour exécuter Yarn v4 (mode PnP) dans Bitbucket Pipelines

    Comment construire un projet utilisant Yarn v4 en mode PnP dans Bitbucket Pipelines. Résumé de la configuration du cache et de l’activation de corepack.

  60. Pourquoi la recherche Pagefind ne fonctionnait plus sur Cloudflare Pages : Rocket Loader était en cause

    Cause racine et solution pour une recherche Astro + Pagefind qui marchait en local mais tombait en panne après déploiement sur Cloudflare Pages.

  61. Ce que j'ai ressenti après avoir acheté l'application de gestion d'images Eagle

    Raisons de l’achat d’Eagle, une application unique de gestion d’images, et avis. Présentation de la compatibilité Mac/Win, de la gestion des bibliothèques et de la convivialité des extensions de navigateur.

  62. Créer une web app Google Apps Script riche avec Svelte

    Comment combiner la publication d’une web app Google Apps Script avec Svelte pour construire une SPA riche dont la base de données est une feuille de calcul.