\n \n\n\n```\n\n### `manifest.webmanifest`\n\n```json\n{\n \"name\": \"Ma Progressive Web App\",\n \"short_name\": \"MaPWA\",\n \"description\": \"Démonstration minimale d'une PWA.\",\n \"start_url\": \"/\",\n \"scope\": \"/\",\n \"display\": \"standalone\",\n \"orientation\": \"portrait\",\n \"background_color\": \"#ffffff\",\n \"theme_color\": \"#0066cc\",\n \"icons\": [\n {\n \"src\": \"/icons/icon-192.png\",\n \"sizes\": \"192x192\",\n \"type\": \"image/png\",\n \"purpose\": \"any maskable\"\n },\n {\n \"src\": \"/icons/icon-512.png\",\n \"sizes\": \"512x512\",\n \"type\": \"image/png\",\n \"purpose\": \"any maskable\"\n }\n ]\n}\n```\n\n### `sw.js`\n\n```javascript\nconst CACHE_NAME = 'mapwa-v1';\nconst PRECACHE = [\n '/',\n '/index.html',\n '/manifest.webmanifest',\n '/icons/icon-192.png',\n '/icons/icon-512.png'\n];\n\nself.addEventListener('install', (event) => {\n event.waitUntil(\n caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE))\n );\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(\n caches.keys().then((keys) =>\n Promise.all(\n keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))\n )\n )\n );\n self.clients.claim();\n});\n\nself.addEventListener('fetch', (event) => {\n // Stale-while-revalidate pour les navigations\n if (event.request.mode === 'navigate') {\n event.respondWith(\n caches.match(event.request).then((cached) => {\n const fresh = fetch(event.request).then((response) => {\n caches.open(CACHE_NAME).then((c) => c.put(event.request, response.clone()));\n return response;\n }).catch(() => cached);\n return cached || fresh;\n })\n );\n return;\n }\n // Cache-first pour le reste\n event.respondWith(\n caches.match(event.request).then((cached) => cached || fetch(event.request))\n );\n});\n```\n\n### Icônes\n\nDeux fichiers PNG : `icons/icon-192.png` (192×192) et `icons/icon-512.png` (512×512). L'attribut `purpose: \"any maskable\"` permet à Android de découper l'icône selon la forme système (cercle, squircle, etc.).\n\n**Servir le tout en HTTPS** (obligatoire en production ; `localhost` fonctionne en dev). Configuration nginx/Apache : s'assurer que `manifest.webmanifest` est servi avec le content-type `application/manifest+json` et que `sw.js` n'est jamais mis en cache HTTP côté navigateur (sinon les mises à jour ne se propagent pas).\n\n```nginx\nlocation = /sw.js {\n add_header Cache-Control \"no-store, no-cache, must-revalidate\";\n expires off;\n}\n\nlocation = /manifest.webmanifest {\n add_header Content-Type \"application/manifest+json\";\n}\n```\n\n**Tester avec Lighthouse** (intégré à Chrome DevTools, onglet *Lighthouse* puis catégorie *Progressive Web App*) — fournit un score, identifie les manques, propose des corrections.\n\n## 9. Outils et frameworks\n\n**Workbox** (Google) — la bibliothèque de référence pour les service workers. Génère du SW à partir de configurations déclaratives, gère les stratégies de cache, le préchargement, la mise à jour. Souvent utilisée via un plugin de bundler.\n\n**Vite PWA Plugin** (`vite-plugin-pwa`) — l'option la plus simple pour un projet moderne basé sur Vite. Wrap Workbox, génère manifest et SW automatiquement.\n\n**Next.js** — supporte les PWA via `next-pwa` (basé sur Workbox).\n\n**Nuxt** — `@vite-pwa/nuxt` officiel.\n\n**Angular, Vue, Svelte** — tous disposent d'intégrations PWA officielles ou bien maintenues.\n\n**PWA Builder** (Microsoft) — outil web qui audit un site et génère le packaging pour les stores (MSIX pour Microsoft, TWA pour Play Store).\n\n**Lighthouse** — audit intégré à Chrome DevTools. Standard de fait pour vérifier la conformité PWA.\n\n**Côté PHP (pertinent au regard du contexte de cette doc)** — Symfony et Laravel n'ont pas d'extension PWA officielle, mais l'intégration est triviale puisqu'une PWA n'exige côté serveur que de servir correctement quelques fichiers statiques en HTTPS. Bundles comme `friendsofsymfony/elastica-bundle` ne couvrent pas le sujet ; c'est plutôt à l'asset pipeline (Webpack Encore, Vite) de gérer la génération du service worker.\n\n## 10. Pièges fréquents et bonnes pratiques\n\n**Le service worker piégé en cache** — `sw.js` lui-même ne doit jamais être mis en cache HTTP, sinon les utilisateurs restent bloqués sur une ancienne version. `Cache-Control: no-store` strict côté serveur.\n\n**Versionner le cache** — toujours inclure une version dans le nom du cache (`mapwa-v1`, `mapwa-v2`...) et purger les anciens à l'activation. Sans cela, des assets périmés peuvent persister indéfiniment.\n\n**Ne pas tout cacher** — précharger uniquement le strict nécessaire au shell de l'application. Le reste doit être mis en cache à la demande, avec une stratégie adaptée.\n\n**Tester hors ligne** — Chrome DevTools propose un mode *Offline* dans l'onglet *Network*. C'est le seul moyen de vérifier que les stratégies de cache fonctionnent.\n\n**Gérer la mise à jour** — quand un nouveau service worker est détecté, il s'installe mais n'est actif qu'après fermeture de tous les onglets de la PWA. Soit forcer via `skipWaiting()` + `clients.claim()` (rapide mais peut casser une session en cours), soit afficher à l'utilisateur une bannière « nouvelle version disponible ».\n\n**Détection de feature, jamais détection de navigateur** — `if ('serviceWorker' in navigator)`, `if ('PushManager' in window)`. Ne jamais sniffer `userAgent`.\n\n**Tester sur iOS réel** — l'émulateur Safari ne reproduit pas toutes les limitations. Un iPhone physique est indispensable pour valider l'expérience.\n\n**HTTPS impératif** — même en pré-prod. Les certificats Let's Encrypt sont gratuits ; un reverse proxy bien configuré (Caddy, nginx, Traefik) suffit. *NB : ce point recoupe directement la configuration habituelle d'un homelab avec reverse proxy.*\n\n**Manifest et icônes adaptatives** — utiliser `purpose: \"maskable\"` avec des icônes ayant une zone de sécurité de ~10 % autour du contenu, sinon Android va découper dans le visuel.\n\n**Pas de prompt d'installation intrusif** — Chrome déclenche automatiquement un mini-info-bar quand les critères PWA sont remplis. Si on veut un prompt personnalisé, intercepter l'événement `beforeinstallprompt` et le déclencher au moment opportun (jamais au premier chargement).\n\n```javascript\nlet deferredPrompt;\nwindow.addEventListener('beforeinstallprompt', (e) => {\n e.preventDefault();\n deferredPrompt = e;\n // Afficher un bouton « Installer » dans l'UI\n document.querySelector('#install-btn').hidden = false;\n});\n\ndocument.querySelector('#install-btn').addEventListener('click', async () => {\n if (!deferredPrompt) return;\n deferredPrompt.prompt();\n const { outcome } = await deferredPrompt.userChoice;\n console.log('Choix utilisateur :', outcome);\n deferredPrompt = null;\n});\n```\n\n## 11. Ressources\n\n**Documentation officielle**\n\n- web.dev — section *Progressive Web Apps* : https://web.dev/explore/progressive-web-apps\n- MDN Web Docs — *Progressive web apps* : https://developer.mozilla.org/fr/docs/Web/Progressive_web_apps\n- Apple Developer — *Sending web push notifications* : https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers\n- Microsoft Edge — *PWA on Windows* : https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/\n\n**Outils**\n\n- Workbox : https://developer.chrome.com/docs/workbox\n- PWA Builder : https://www.pwabuilder.com/\n- Lighthouse : intégré à Chrome DevTools, ou via CLI `npm i -g @lhci/cli`\n\n**Veille**\n\n- *Web Almanac* (HTTP Archive) — rapport annuel sur l'état du web, chapitre PWA.\n- *Can I Use* : https://caniuse.com/ — compatibilité navigateur pour chaque API.\n\n**Études de cas**\n\n- web.dev cases : https://web.dev/case-studies\n\n\n---\n\n*Document de référence — état au 13 mai 2026. À revoir tous les 6 à 12 mois, l'écosystème évoluant rapidement (notamment côté Apple).*","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2.json b/_cache/articles/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2.json
deleted file mode 100644
index a6fb46b..0000000
--- a/_cache/articles/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a55aeefd-28ae-4c3f-bfc1-c0400c3877c2","slug":"pourquoi-les-operateurs-brident-ils-la-3g","title":"Pourquoi les opérateurs brident-ils la 3G ?","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-05 08:41:22","created_at":"2025-11-05 08:41:22","updated_at":"2025-11-05 08:41:22","revisions":[],"cover":"","category":"télécom","content":"# Pourquoi les opérateurs brident-ils la 3G ?\n\n## Explications scientifiques et économiques\n\nLa migration des utilisateurs de la 3G vers la 4G et la 5G ne se limite pas à une simple volonté commerciale. Plusieurs facteurs techniques et économiques expliquent pourquoi les opérateurs limitent progressivement les performances des anciennes générations.\n\n---\n\n### 1. Refarming du spectre\n\nLe **refarming** consiste à **réaffecter les fréquences radio utilisées par la 3G (900 MHz, 1800 MHz, 2100 MHz)** pour la 4G et désormais la 5G.\n\n* **Objectif :** optimiser l’utilisation du spectre radio limité et très convoité.\n* **Conséquence pour la 3G :** réduction des capacités réseau et baisse effective des débits.\n* **Avantage pour la 4G/5G :** meilleure couverture et débits accrus, tout en utilisant les bandes déjà déployées.\n\n---\n\n### 2. Coût d’entretien élevé des infrastructures 3G\n\nMaintenir un réseau 3G opérationnel est **coûteux** :\n\n* Les équipements (antennes, contrôleurs RNC, stations de base) vieillissent et nécessitent maintenance et mises à jour régulières.\n* Les coûts énergétiques et opérationnels sont proportionnellement plus élevés par bit transmis comparé à la 4G ou la 5G.\n* En parallèle, le nombre d’utilisateurs actifs sur la 3G diminue, ce qui réduit la rentabilité.\n\n> Le ratio coût par bit est donc nettement moins favorable pour la 3G : pour un flux de données équivalent, un opérateur dépense plus en 3G qu’en 4G ou 5G.\n\n---\n\n### 3. Incitation à la migration via bridage\n\nPour accélérer la transition vers les nouvelles générations :\n\n* Les opérateurs **brident les débits 3G** (exemple concret : Free Mobile en itinérance sur Orange).\n* Les utilisateurs rencontrent des **limitations visibles** : ralentissements web, streaming limité, visioconférence dégradée.\n* Cette stratégie crée une motivation implicite à souscrire à des forfaits 4G ou 5G, sans intervention directe sur les tarifs.\n\n---\n\n### Évolution des débits bridés sur 3G Free/Orange (2016–2020)\n\n| Année | Débit descendant | Débit montant |\n| ----- | ---------------- | ------------- |\n| 2016 | ~5 Mbit/s | 0,5–1 Mbit/s |\n| 2017 | ~1 Mbit/s | 0,5 Mbit/s |\n| 2019 | 768 kbit/s | 384 kbit/s |\n| 2020 | 384 kbit/s | 384 kbit/s |\n\n> Ce tableau illustre la **réduction progressive des performances**, transformant un réseau encore fonctionnel en service à très faible débit, pour encourager la migration vers la 4G/5G.\n\n---\n\n### Schéma suggéré : flux de données et coût par bit (3G vs 4G)\n\n```mermaid\nflowchart LR\n A[Utilisateur 3G] -->|Faible débit| B[Flux de données]\n B -->|Coût élevé par bit| C[Opérateur]\n \n D[Utilisateur 4G] -->|Débit élevé| E[Flux de données]\n E -->|Coût faible par bit| C[Opérateur]\n \n style A fill:#f9f,stroke:#333,stroke-width:1px\n style D fill:#9f9,stroke:#333,stroke-width:1px\n```\n\n* **Lecture du schéma :** la 3G transmet moins de données à un coût plus élevé pour l’opérateur. La 4G/5G, avec des débits supérieurs et un coût par bit réduit, devient nettement plus rentable.\n\n---\n\nLa dégradation volontaire des performances 3G s’explique par un **mix de contraintes techniques, économiques et stratégiques** :\n\n1. Libérer les fréquences pour les nouvelles générations (refarming).\n2. Réduire les coûts d’entretien des infrastructures obsolètes.\n3. Inciter les utilisateurs à migrer vers la 4G et la 5G, plus rentables et performantes.\n\n> Ce processus est récurrent : chaque génération prépare progressivement l’abandon de la précédente, toujours sous couvert d’optimisation technique et économique.\n","featured":false,"files_meta":[],"external_links":[],"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/a9474a83-43b3-484c-950e-37a27ff663fe.json b/_cache/articles/a9474a83-43b3-484c-950e-37a27ff663fe.json
deleted file mode 100644
index adb187d..0000000
--- a/_cache/articles/a9474a83-43b3-484c-950e-37a27ff663fe.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"a9474a83-43b3-484c-950e-37a27ff663fe","slug":"game-watch-diy-fabrication","title":"Gawfgbsdfg","author":"cedric@abonnel.fr","published":false,"featured":false,"published_at":"2026-05-13 18:08","created_at":"2026-05-13 18:12:54","updated_at":"2026-05-15 22:57:05","revisions":[{"n":1,"date":"2026-05-15 22:57:05","comment":"Titre modifié, contenu modifié","title":"Game & Watch DIY — Fabrication"}],"cover":"","files_meta":{"9ae9bc58c13ca70c-56046.jpg":{"author":"","source_url":"https://images.freeimages.com/images/previews/9df/nature-1370816.jpg"}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"fablab","tags":[],"content":"# Gawfgbsdfg\n\n> Document de travail consolidant le prototypage Arduino, la conception du PCB sous KiCad, les règles de conception et la préparation des fichiers pour la CNC.\n\n---\n\n## 1. Rappel : prototypage\n\n### 1.1 Liste du matériel\n\n- 1 × Arduino Uno\n- 1 × écran LCD 16 broches (non I²C)\n- 3 × boutons poussoirs\n- 1 × buzzer\n- 1 × résistance 220 Ω\n- 1 × potentiomètre 10 kΩ *(facultatif — voir remarque ci-dessous)*\n\n### 1.2 Câblage\n\n**Écran LCD** — câblage identique au projet n° 11 du livre de référence ; consulter les pages 116 et 117 pour le détail des broches.\n\nUne variante sans potentiomètre a été testée (LCD branché directement à la masse) mais elle a été abandonnée.\n\n**Boutons poussoirs** — montés en pull-up interne :\n\n```\nGND → Poussoir → broches 7, 8, 9 (avec INPUT_PULLUP dans le code)\n```\n\nPour comprendre le principe du montage pull-up : \n\n**Buzzer** — deux broches : l'une à la masse, l'autre sur la broche 6 (qui assure également l'alimentation lors du pilotage par `tone()`). Voir notamment le projet n° 6, p. 71.\n\n### 1.3 Type de jeu\n\nJeu d'arcade type *Asteroids*.\n\n### 1.4 Code de référence\n\n```cpp\n#include \nLiquidCrystal lcd(12, 11, 5, 4, 3, 2);\n\n// ---- Buzzer ----\nconst int PIN_BUZZER = 6;\ninline void beepShoot() { tone(PIN_BUZZER, 2000, 40); } // court\ninline void beepHit() { tone(PIN_BUZZER, 1200, 80); } // moyen\ninline void beepOver() { tone(PIN_BUZZER, 400, 600); } // long\n\n// ---- Boutons ----\nconst int boutonTir = 7;\nconst int boutonHaut = 8;\nconst int boutonBas = 9;\n\n// ---- Affichage ----\nbyte CH_VAISSEAU[8] = {\n B00100, B01110, B11111, B11111, B01110, B00100, B00100, B00000\n};\nbyte CH_MISSILE[8] = {\n B00100, B00100, B00100, B11111, B00100, B00100, B00100, B00000\n};\nbyte CH_ENNEMI[8] = {\n B11111, B10101, B11111, B01010, B11111, B10101, B11111, B00000\n};\n\nint vaisseauLigne = 1; // 0..1\n\nstruct Ennemi { int colonne; int ligne; bool actif; };\nconst int MAX_ENNEMIS = 3;\nEnnemi ennemis[MAX_ENNEMIS];\n\nstruct Projectile { int colonne; int ligne; bool actif; };\nconst int MAX_TIRS = 6;\nProjectile tirs[MAX_TIRS];\n\nunsigned long dernierDeplacement = 0;\nunsigned long intervalDeplacement = 500;\n\nunsigned long dernierTir = 0;\nconst unsigned long delaiTir = 180;\n\nint score = 0;\n\nvoid setup() {\n pinMode(boutonTir, INPUT_PULLUP);\n pinMode(boutonHaut, INPUT_PULLUP);\n pinMode(boutonBas, INPUT_PULLUP);\n pinMode(PIN_BUZZER, OUTPUT);\n\n lcd.begin(16, 2);\n lcd.createChar(0, CH_VAISSEAU);\n lcd.createChar(1, CH_MISSILE);\n lcd.createChar(2, CH_ENNEMI);\n lcd.print(\"Vaisseau Pret!\");\n delay(600);\n lcd.clear();\n\n randomSeed(analogRead(A0));\n for (int i = 0; i < MAX_ENNEMIS; i++) ennemis[i].actif = false;\n for (int i = 0; i < MAX_TIRS; i++) tirs[i].actif = false;\n}\n\nvoid loop() {\n unsigned long now = millis();\n\n if (digitalRead(boutonHaut) == LOW) vaisseauLigne = 0;\n else if (digitalRead(boutonBas) == LOW) vaisseauLigne = 1;\n\n // Tir multi-missiles + bip\n if (digitalRead(boutonTir) == LOW && now - dernierTir >= delaiTir) {\n int idx = slotTirLibre();\n if (idx >= 0) {\n tirs[idx].actif = true;\n tirs[idx].colonne = 1;\n tirs[idx].ligne = vaisseauLigne;\n dernierTir = now;\n beepShoot();\n }\n }\n\n if (now - dernierDeplacement > intervalDeplacement) {\n dernierDeplacement = now;\n\n // Déplacer les tirs\n for (int t = 0; t < MAX_TIRS; t++) {\n if (!tirs[t].actif) continue;\n tirs[t].colonne++;\n if (tirs[t].colonne > 15) tirs[t].actif = false;\n }\n\n // Déplacer les ennemis + détection des collisions\n for (int i = 0; i < MAX_ENNEMIS; i++) {\n if (!ennemis[i].actif) continue;\n ennemis[i].colonne--;\n\n for (int t = 0; t < MAX_TIRS; t++) {\n if (!tirs[t].actif) continue;\n if (ennemis[i].colonne == tirs[t].colonne\n && ennemis[i].ligne == tirs[t].ligne) {\n ennemis[i].actif = false;\n tirs[t].actif = false;\n score++;\n beepHit();\n break;\n }\n }\n\n if (ennemis[i].colonne <= 0) {\n beepOver();\n gameOver();\n }\n }\n\n // Apparition d'ennemis\n int actifs = 0;\n for (int i = 0; i < MAX_ENNEMIS; i++) if (ennemis[i].actif) actifs++;\n if (actifs < MAX_ENNEMIS && random(0, 10) > 7) {\n for (int i = 0; i < MAX_ENNEMIS; i++) if (!ennemis[i].actif) {\n ennemis[i].actif = true;\n ennemis[i].colonne = 15;\n ennemis[i].ligne = random(0, 2);\n break;\n }\n }\n\n updateLCD();\n }\n}\n\nint slotTirLibre() {\n for (int i = 0; i < MAX_TIRS; i++) if (!tirs[i].actif) return i;\n return -1;\n}\n\nstatic inline void printIfOnScreen(int col, int row, uint8_t ch) {\n if (col >= 0 && col <= 15 && row >= 0 && row <= 1) {\n lcd.setCursor(col, row);\n lcd.write(ch);\n }\n}\n\nvoid updateLCD() {\n lcd.clear();\n lcd.setCursor(10, 0); lcd.print(\"S:\"); lcd.print(score);\n\n printIfOnScreen(0, vaisseauLigne, 0); // vaisseau\n\n // Tirs\n for (int t = 0; t < MAX_TIRS; t++) {\n if (!tirs[t].actif) continue;\n if (tirs[t].colonne >= 0 && tirs[t].colonne <= 15) {\n lcd.setCursor(tirs[t].colonne, tirs[t].ligne);\n lcd.write((uint8_t)1); // missile\n }\n }\n\n // Ennemis\n for (int i = 0; i < MAX_ENNEMIS; i++) {\n if (!ennemis[i].actif) continue;\n if (ennemis[i].colonne >= 0 && ennemis[i].colonne <= 15) {\n lcd.setCursor(ennemis[i].colonne, ennemis[i].ligne);\n lcd.write((uint8_t)2); // ennemi\n }\n }\n}\n\nvoid gameOver() {\n lcd.clear();\n lcd.setCursor(3, 0); lcd.print(\"GAME OVER\");\n lcd.setCursor(4, 1); lcd.print(\"Score:\"); lcd.print(score);\n while (true) {}\n}\n```\n\n---\n\n## 2. Tutoriel : préparation sous KiCad\n\n### 2.1 Atelier — KiCad → PCB → CNC\n\n> ⚠️ Tutoriel expérimental : à revérifier, tester et adapter au besoin.\n\nSite officiel : — éditeur de PCB libre et gratuit.\n\n### 2.2 Création du projet\n\nDeux possibilités :\n\n- **Projet vierge** : *Fichier → Nouveau projet*\n- **Projet « shield Arduino »** : *Fichier → Nouveau projet à partir d'un modèle → Arduino UNO Shield*\n\nL'exemple suivant porte sur la création d'un shield Arduino Uno comportant 3 LED, 3 résistances de 220 Ω et 3 boutons.\n\nEnregistrer le projet dans un dossier dédié (ici, `shieldDynalab`). Il contient deux fichiers principaux :\n\n- `*.kicad_sch` — conception du circuit électronique (schéma)\n- `*.kicad_pcb` — agencement des composants sur le circuit imprimé et dessin des pistes\n\nOuvrir le fichier `.kicad_sch`. Le modèle Arduino Uno Shield contient déjà les broches correspondant aux pins de l'Arduino.\n\n### 2.3 Ajout des composants\n\nCliquer sur le bouton **Ajouter un symbole** (barre d'outils de droite, en haut). Dans le champ de recherche, saisir le nom du composant *en anglais* (par exemple `led`).\n\nSélectionner le composant dans la liste : son symbole électrique s'affiche dans le volet de droite. Puis, via le menu déroulant **Pas d'empreinte par défaut**, sélectionner l'empreinte qui correspond au composant physique (par exemple via la référence constructeur ou les dimensions).\n\n> **Empreinte** : espace physique occupé par le composant sur le PCB ainsi que la position de ses broches.\n\n- **SMD** *(Surface Mount Device)* — composant monté en surface\n- **THT** *(Through-Hole Technology)* — composant traversant\n\nVérifier que l'empreinte qui s'affiche en dessous semble cohérente, valider, puis poursuivre avec les autres composants (par exemple une résistance 220 Ω).\n\nSi une empreinte n'est pas trouvée dans la liste déroulante, ce n'est pas grave : il sera possible de l'attribuer plus tard, par exemple pour le bouton poussoir.\n\n### 2.4 Attribution des empreintes a posteriori\n\nPour attribuer une empreinte aux composants qui n'en ont pas encore, utiliser le bouton **Assigner des empreintes**. Une fenêtre liste tous les composants du projet ; il devient possible :\n\n- de modifier les empreintes déjà attribuées,\n- d'en attribuer de nouvelles depuis la liste à droite (recherche par mot-clé ou référence, en anglais ; double-clic pour valider).\n\nEn cas de doute, faire un *clic droit* sur le nom de l'empreinte → **Affichage de l'empreinte sélectionnée**, pour vérifier visuellement la cohérence.\n\nSi un composant n'existe pas dans la bibliothèque, il est possible de fabriquer une empreinte personnalisée à partir de zéro.\n\n### 2.5 Conception du circuit\n\nDans l'espace de travail, survoler un composant et utiliser les raccourcis suivants :\n\n| Touche | Action |\n|---|---|\n| `M` | *Move* — déplacer le composant |\n| `R` | *Rotate* — pivoter le composant |\n| `Ctrl + D` | *Duplicate* — dupliquer le composant (cliquer ailleurs pour le poser) |\n\nLe bouton **Ajouter un fil** (barre d'outils de droite) permet de relier les broches entre elles.\n\nSurvoler les noms des broches de l'Arduino et faire `Ctrl + D` pour les dupliquer à proximité du module en cours de conception (par exemple le module LED). Procéder de même pour la masse (GND).\n\nLe bouton **Annotation de la schématique** renomme automatiquement les composants pour éviter les conflits.\n\nAjouter des **indicateurs de non-connexion** sur toutes les broches qui ne seront reliées à rien : cela évite les erreurs lors du contrôle des règles électriques (ERC).\n\n> *Point à vérifier* : sur quelles broches exactement faut-il placer ces indicateurs ?\n\nIl est possible de sélectionner plusieurs composants à la fois pour les dupliquer en bloc (utile lorsqu'un même sous-module se répète sur le circuit).\n\n### 2.6 Passage à l'éditeur de PCB\n\nUne fois le schéma terminé : **sauvegarder**, puis cliquer sur **Commuter vers l'éditeur de PCB** (barre d'outils en haut). Cela ouvre le fichier `.kicad_pcb`.\n\nAu départ, l'éditeur ne contient pas encore les composants du schéma. Pour les importer : **Outils → Mettre à jour le PCB depuis le schéma**.\n\nLes composants apparaissent à l'écran, reliés par des « chevelus » aux broches correspondantes. Reste à les positionner, les orienter et les router de manière à éviter les croisements de pistes (le casse-tête commence ici).\n\n### 2.7 Paramétrage des contraintes (CNC)\n\nAvant de tracer les pistes, paramétrer les contraintes liées à la CNC : **Options du CI → Contraintes**.\n\nModifier les valeurs minimales pour permettre le passage de la fraise lors de l'isolation des pistes. Se baser sur les diamètres de fraises disponibles.\n\n### 2.8 Tracé des pistes\n\nLe bouton de tracé de piste permet de dessiner les connexions. Au clic sur une broche, l'écran s'assombrit et seules les broches reliées électriquement restent éclairées, ce qui facilite l'identification des connexions à réaliser.\n\n- **Trait rouge** : la piste elle-même\n- **Contour gris** : la zone d'isolation minimum\n\nKiCad maintient automatiquement la distance minimale par rapport aux autres broches et pistes.\n\n**Choix de la couche** — bien sélectionner la couche dans la liste de droite *avant* de tracer :\n\n- `F.Cu` *(front)* — pistes en cuivre côté composants\n- `B.Cu` *(back)* — pistes en cuivre côté soudure\n\nVérifier le rendu via **Affichage → Visualisation 3D** pour s'assurer que le résultat est physiquement réalisable et cohérent.\n\n> 💡 **Cas de la gravure CNC** : le cuivre ne traverse pas la plaque au niveau des perçages. Les pistes doivent donc être placées de l'autre côté par rapport aux composants. On travaille donc sur la couche `B.Cu`.\n>\n> Faire les pistes sur `F.Cu` donne certes un rendu plus clair, mais ne permet pas de souder les composants une fois la plaque gravée à la CNC.\n\n### 2.9 Export des fichiers de fabrication\n\n**Pistes (Gerber)** : *Fichier → Fichier de fabrication → Gerber `.gbr`*. Sélectionner les couches concernées, tracer ; la fenêtre du bas confirme l'enregistrement.\n\n**Perçages (Excellon)** : *Fichier → Fichier de fabrication → Fichier de perçage `.drl`*. Créer le fichier de perçage ET le plan de perçage.\n\n### 2.10 Conversion Gerber → SVG\n\nUtiliser **FlatCam** : il permet d'ouvrir des fichiers Gerber, de définir le diamètre et le type de fraise utilisée, et de générer automatiquement le tracé vectoriel du chemin que la CNC empruntera. Il est également possible d'ajouter manuellement des traits si nécessaire.\n\nÉtapes :\n\n1. Import des fichiers Gerber\n2. Paramétrage de l'isolation\n3. Création de la géométrie\n4. Adaptation manuelle du tracé si besoin\n5. Géométrie sélectionnée → **Export SVG** ou **DXF**, ou bien génération directe du chemin CNC\n\nTutoriel vidéo : \n\n### 2.11 Ressources complémentaires\n\nDocumentation KiCad en français sur Fabmanager : \n\n---\n\n## 3. Atelier 2 — déroulé\n\n1. Retour sur les règles de conception\n2. Retour d'expérience sur le projet\n3. Préparation des fichiers pour la CNC\n4. Usinage sur CNC\n5. **Et après ?** Exposition, autres ateliers, création d'un club ?\n\n---\n\n## 4. Règles de conception du PCB\n\n### 4.1 Points abordés ensemble\n\n#### 1. Type de fabrication et couches utilisées\n\nPCB simple face : les pistes sont gravées sur la face cuivre inférieure, les composants traversants sont placés sur la face supérieure. Dans KiCad, router donc les pistes sur la couche `B.Cu`.\n\n#### 2. Types de composants électroniques\n\n- **CMS** (Composants Montés en Surface) = **SMD** (*Surface Mount Device*) : même chose, en français et en anglais.\n- **THT** (*Through-Hole Technology*) : composants traversants.\n\n#### 3. Outils de vérification dans KiCad\n\n- **DRC** (*Design Rule Check*) : contrôle du respect des règles de conception du PCB.\n- **ERC** (*Electrical Rule Check*) : contrôle de la cohérence électrique du schéma.\n\n#### 4. Gestion des entrées non connectées\n\nNe pas laisser d'entrée non connectée (dite « flottante ») : cela peut entraîner des comportements imprévisibles. Sur un microcontrôleur, une broche inutilisée peut rester non connectée à condition d'être correctement configurée par programmation (en sortie, ou avec un état défini par exemple en pull-up/pull-down interne).\n\n#### 5. Routage et angles des pistes\n\nÉviter les angles à 90°, privilégier les angles à 45°. Cela améliore la qualité de fabrication et limite les discontinuités électriques, particulièrement sur les signaux rapides.\n\n#### 6. Gestion des interférences\n\nÉloigner les éléments susceptibles de générer des interférences (liaisons USB, signaux rapides, lignes d'horloge) des entrées analogiques (notamment audio).\n\nRègle générale : plus un signal est rapide, plus il est susceptible de générer ou de subir des interférences. Dans ce cas, privilégier des pistes courtes. À l'inverse, pour des signaux lents (bouton poussoir, LED, commande de relais, UART à faible débit), il est possible de déporter le composant avec des pistes plus longues sans risque significatif.\n\n#### 7. Notion de routage soigné\n\nUn routage soigné consiste à tracer les pistes de manière logique et maîtrisée :\n\n- privilégier des trajets courts et directs,\n- éviter les boucles inutiles,\n- limiter les croisements entre signaux sensibles et signaux bruyants,\n- conserver une proximité cohérente avec la masse pour assurer un bon retour de courant.\n\nUn tracé clair et structuré facilite également la lecture, la maintenance et le dépannage du circuit.\n\n#### 8. Routage des signaux USB\n\nLes lignes D+ et D− doivent avoir des longueurs identiques afin de préserver les caractéristiques du signal différentiel et maintenir une impédance cohérente.\n\n#### 9. Intérêt des PCB multicouches\n\nLorsque cela est possible, un PCB à quatre couches est une solution idéale : les couches internes dédiées à l'alimentation et à la masse améliorent la stabilité électrique et réduisent les interférences (notamment grâce à leur effet capacitif).\n\n#### 10. Prototypage avec Arduino et intégration\n\nUne carte Arduino Uno est un dispositif complet adapté au prototypage rapide.\n\nDans une mise en œuvre intégrée, il est possible de ne conserver que le microcontrôleur — par exemple l'ATmega328P — accompagné des éléments minimaux nécessaires à son fonctionnement :\n\n- un quartz (généralement 16 MHz) avec ses deux condensateurs associés,\n- une résistance de pull-up sur la broche `RESET`,\n- les condensateurs de découplage pour l'alimentation.\n\nPour faciliter l'usage, monter le microcontrôleur sur un support DIP (support tulipe) : cela permet de le retirer aisément pour le reprogrammer sur une carte Arduino.\n\n### 4.2 Bonnes pratiques supplémentaires (bonus à vérifier)\n\n#### 11. Découplage des alimentations\n\nChaque circuit intégré doit posséder un condensateur de découplage (typiquement 100 nF) placé au plus près de ses broches `VCC` et `GND`. Cela absorbe les variations rapides de courant, stabilise la tension et évite les comportements aléatoires difficiles à diagnostiquer. Pratique particulièrement importante pour les microcontrôleurs et les circuits logiques rapides.\n\n#### 12. Plan de masse (GND)\n\nPlutôt que de relier la masse uniquement par des pistes fines, utiliser une zone de cuivre continue. Cela réduit les interférences électromagnétiques, améliore le retour de courant et simplifie le routage.\n\nDans le cas d'une gravure CNC, cette pratique est facilement réalisable : le plan de masse correspond au reste de cuivre non gravé, isolé autour des pistes et pastilles. Dans KiCad, on peut remplir la carte avec un *copper pour* (zone cuivrée) affectée à `GND` et relier tous les points de masse.\n\n#### 13. Boucle de courant et retour de masse\n\nUn signal électrique forme toujours une boucle complète : aller + retour. Si le chemin de retour n'est pas proche de la piste du signal, le circuit peut capter ou émettre du bruit. Toujours garder un retour de masse continu et proche pour tous les signaux, en particulier les signaux rapides ou sensibles.\n\n#### 14. Largeur des pistes adaptée au courant\n\nToutes les pistes ne doivent pas avoir la même largeur :\n\n- les signaux logiques peuvent passer sur des pistes fines,\n- les pistes d'alimentation et celles transportant un courant important doivent être plus larges pour éviter surchauffe, chute de tension ou destruction de la piste.\n\nIl existe des calculateurs en ligne pour déterminer la largeur adaptée selon le courant et l'épaisseur du cuivre.\n\n#### 15. Points de test pour le débogage\n\nPrévoir sur le PCB des points de test accessibles pour mesurer rapidement la tension d'alimentation, vérifier les signaux critiques et suivre les lignes de communication importantes.\n\nConcrètement, ce sont de petites pastilles ou trous métallisés sur lesquels on peut poser la sonde d'un multimètre ou d'un oscilloscope. Cela facilite le dépannage sans avoir à dessouder des composants.\n\n#### 16. Dissipation thermique\n\nCertains composants génèrent de la chaleur (régulateurs de tension, transistors de puissance). Pour éviter la surchauffe et préserver la fiabilité du circuit, prévoir une surface de cuivre suffisante pour dissiper cette chaleur :\n\n- pistes plus larges connectées aux broches concernées,\n- raccordement de ces broches à des zones de cuivre étendues qui agissent comme dissipateurs thermiques.\n\nL'objectif est d'offrir un chemin efficace d'évacuation de la chaleur vers le PCB.\n\n#### 17. Séparation des alimentations\n\nSi le circuit comporte des parties analogiques, numériques et de puissance, séparer les plans ou pistes d'alimentation pour chaque domaine. Par exemple, les moteurs et autres charges fortes peuvent disposer de leur propre piste, tandis que la logique numérique et l'analogique sensible utilisent des pistes ou zones distinctes.\n\nMême si toutes les alimentations proviennent de la même source, cette séparation physique sur le PCB limite les interférences et améliore la stabilité du circuit.\n\n---\n\n## 5. Application au projet\n\n### 5.1 Processus itératif (retour d'expérience)\n\n#### Conception du PCB\n\n**#1 — Listing des composants**\n\nInventorier l'ensemble des composants nécessaires.\n\n**#2 — Premiers choix de conception**\n\n- forme globale du PCB,\n- composants accessibles ou non,\n- répartition face supérieure / face inférieure,\n- type d'alimentation (ne pas oublier la batterie !).\n\n**#3 — Test de positionnement et d'implantation réelle** *(si possible)*\n\n- repérer les conflits potentiels (ponts notamment),\n- prendre les mesures critiques,\n- définir la forme et la taille du PCB.\n\n**#4 — Schématisation sous KiCad**\n\n> 💡 Travailler si possible sur un double écran.\n\n- positionner et anticiper a minima l'implantation des éléments ;\n- l'objectif n'est pas nécessairement de produire un schéma facilement lisible, mais un schéma exploitable pour le routage ;\n- éviter au maximum les croisements ;\n- relier directement les composants à la broche source (ne pas chercher à les relier entre eux dans un premier temps) ;\n- si besoin, utiliser l'empreinte d'un autre composant (exemple : une batterie peut être représentée par l'empreinte d'une résistance).\n\nÀ explorer : sous KiCad, les broches `GND` d'un Arduino ne sont pas reliées entre elles. Affecter un `GND` symbolique à chacune via des labels.\n\n**#5 — Routage sous KiCad (éditeur de PCB)**\n\nDernier moment pour vérifier les empreintes — vérifier notamment que le pas est bien un multiple de 2,54 mm.\n\n> ⚠️ Après création des pistes, déplacer un composant rompt les connexions. Implanter donc précisément les composants dès le départ (au besoin, double-clic + saisie des coordonnées).\n\nPour Arduino : supprimer si nécessaire les limites de la carte.\n\n- imaginer les premiers regroupements de pistes (vrai aussi pour la masse) et les ajuster progressivement sur le schéma ;\n- éviter les **prisons** (deux broches éloignées reliées par une boucle qui bloque l'accès aux autres broches) → privilégier les pistes en parallèle ;\n- pour le passage des pistes, modifier les empreintes si nécessaire (par exemple suppression d'un perçage) : *double-clic sur l'empreinte → Éditer l'empreinte → Créer une nouvelle bibliothèque personnalisée (la placer en favoris) → la modifier puis enregistrer sous cette nouvelle bibliothèque* ;\n- garder en tête qu'il est possible de faire passer des pistes **sous** les composants ;\n- dans certains cas, créer des ponts filaires (parfois inévitable).\n\n> **Important** : définir la couche `Edge.Cuts` (contour du PCB).\n\n**#6 — Réaffectation des broches**\n\nObjectif : faciliter le routage.\n\n- veiller à la capacité de chaque broche ;\n- bon à savoir : sur Arduino, les broches analogiques peuvent être réaffectées en numérique ;\n- noter toutes les modifications pour adapter le code en conséquence.\n\n**#7 — Modification du code**\n\nReporter les réaffectations de broches dans le code source.\n\n**#8 — Nouveau prototypage** *(facultatif)*\n\n#### Préparation des fichiers pour l'usinage\n\n**#9 — Export des fichiers Gerber et Excellon**\n\nExporter a minima : `B.Cu` + `Edge.Cuts` + `.drl`.\n\n**#10 — Traitement dans FlatCam**\n\nGénération des fichiers SVG.\n\n**#11 — Traitement dans Inkscape** *(facultatif)*\n\nFusionner les « combos », supprimer les contours superflus.\n\n### 5.2 Liste des équipements et positionnement\n\n- Shield Arduino custom avec PCB **débordant du form factor** standard.\n- L'écran déborde de **8 mm minimum vers le haut** ; les broches sont à **4 mm minimum** du bord de la carte.\n- **Pile 9 V** pour alimentation sur `Vin` (anticiper l'emplacement d'un futur interrupteur d'alimentation). Branchement filaire sur le PCB via une cosse de raccordement, à droite des broches de l'écran.\n- **Potentiomètre de contraste** : utile uniquement pour la mise au point, pas besoin d'être accessible une fois la carte dans son boîtier. Position classique conservée, mais il sera caché sous le capot.\n- **Port USB de l'Arduino** : accessible pour reprogrammation.\n- **Bouton reset** : ajout d'un bouton dédié pour relancer le jeu (ou aménager la forme du PCB pour conserver l'accès au bouton reset d'origine de l'Arduino).\n- **Buzzer** : monté en face arrière du PCB. Attention à :\n - ce que la position des mains lors du jeu ne bouche pas le son,\n - ce qu'il ne touche pas / ne court-circuite pas les broches en sous-face de l'écran (le centrer sur la hauteur, l'aligner à gauche sur le bord du module écran).\n\n#### Dimensions du PCB\n\n| | Hauteur | Largeur |\n|---|---|---|\n| Idéal | 78 mm | 80 mm |\n| Plaque à graver disponible | 70 mm | 100 mm |\n| **PCB final retenu** | **65 mm** | **80 mm** |\n\n### 5.3 Schéma KiCad — réaffectation des broches\n\n#### Boutons\n\n| Bouton | Broche Arduino | Rôle |\n|---|---|---|\n| SW1 | D12 (+ GND) | Bouton **haut** |\n| SW2 | D13 (broche 3 du SW2 sur GND, « 14 » à côté du 13) | Bouton **bas** |\n| SW3 | A0 (broches 1 et 3) + GND (broches 2 et 4, à côté du 5 V) | Bouton **tir** |\n\n#### Buzzer\n\n- Broche **D11** + GND.\n\n#### Écran LCD\n\n| Broche LCD | Broche Arduino |\n|---|---|\n| D7 | D10 |\n| D6 | D9 |\n| D5 | D8 |\n| D4 | D7 |\n| E | D5 |\n| RS | D6 |\n| RW | GND |\n\n#### Masses\n\n`VSS` du LCD, GND du buzzer, GND de SW1 et GND de SW2 sont tous reliés à la masse commune.\n\n> ⚠️ **Important** : sur l'écran LCD, il faudra **souder un pont** entre `R/W` et `VSS` pour relier `R/W` à la masse.\n\n---\n\n## 6. Tutoriel : préparation pour la CNC\n\n### 6.1 Création d'un PCB à la CNC (gravure « à l'anglaise »)\n\n**Logiciels utilisés :**\n\n- KiCad — version 9.0\n- FlatCam — version bêta 8.994\n- Inkscape\n- Easel (pilotage de la CNC)\n\n### 6.2 Étapes dans KiCad\n\n#### Règles de conception → contraintes\n\nVérifier :\n\n- le **diamètre des pads** : 3 mm (double-clic sur les pads → *Propriétés*) ;\n- la **distance entre pads** : 2,54 mm.\n\n> Proposition : passer à 2,34 mm (= 2,54 − 2 × 0,1) pour ménager une marge ?\n\n#### Ajouter le contour du circuit\n\n- sélectionner la couche `Edge.Cuts`,\n- utiliser par exemple l'outil **Rectangle**, clic simple.\n\n#### Export des fichiers de fabrication\n\n*Fichier → Fichiers de fabrication → Gerber → Tracer*, puis créer les **fichiers de perçage** (Excellon).\n\n> ⚠️ Ne pas oublier d'exporter la couche `Edge.Cuts`.\n\n### 6.3 FlatCam\n\n**Téléchargement** : \n\n> En date du 01/04/2026, la version 8.994 est disponible avec un `.exe` pour Windows.\n\n#### 1. Ouvrir FlatCam\n\n#### 2. Charger les fichiers\n\n- **Open Gerber** pour le fichier de la face cuivre + `Edge.Cuts`,\n- **Open Excellon** pour les fichiers de perçage :\n - `PTH` → perçage des composants,\n - `NPTH` → autres perçages.\n\n#### 3. Convertir Gerber et Excellon en géométries\n\n- sélectionner les fichiers,\n- *Edit → Conversion → Convert Any to Geo*.\n\n#### 4. Joindre les contours aux géométries\n\n**Pour les pistes** : sélectionner `B.Cu` + `Edge.Cuts` → *Edit → Join Objects → Join Geo / Gerber / Excellon*. Cela génère une nouvelle géométrie « Combo… ».\n\n**Pour les perçages** : même opération avec `PTH.drl` + `Edge.Cuts`.\n\n> ⚠️ Il n'est *a priori* pas possible de joindre efficacement les géométries `PTH.drl` et `B.Cu` directement : le fichier de pistes efface / écrase le fichier de perçage.\n\n#### Variante (ancienne version)\n\nAjouter manuellement une forme contour sur toutes les géométries :\n\n1. sélectionner la géométrie → *Properties → Geometry Editor* ;\n2. choisir l'outil souhaité (par exemple **Rectangle**) ;\n3. dessiner le contour.\n\nToutes les géométries doivent partager le même contour pour garantir leur alignement par la suite.\n\n#### 5. Exporter les géométries « Combo » en SVG\n\nSélectionner chaque géométrie puis *File → Export → SVG* (autant de fichiers SVG que de géométries).\n\n### 6.4 Inkscape *(facultatif)*\n\n1. Ouvrir les fichiers SVG « Combo » et faire copier / coller.\n2. Appliquer un **effet miroir** si nécessaire (réfléchir au résultat attendu).\n3. Séparément, **dégrouper** puis **unir** les pistes d'un côté, les perçages de l'autre.\n4. Regrouper chacun avec son contour respectif.\n5. Aligner les deux fichiers via leurs contours.\n6. Supprimer les contours superflus pour n'en conserver qu'un seul.\n7. Enregistrer le tout dans un seul fichier SVG final.\n\n> Option : conserver 2 contours est possible mais sans réel intérêt.\n\n### 6.5 Easel — usinage CNC\n\n#### Préparation du projet\n\n1. *Nouveau projet* → donner un nom au projet (cliquer sur *Untitled*).\n2. Régler l'unité en **millimètres**.\n3. Spécifier le **matériau PCB** et ses dimensions — **surtout l'épaisseur** (PCB du Lab = **1,4 mm**).\n\n> ⚠️ Appliquer un **miroir** si nécessaire (réfléchir au résultat).\n>\n> Vérifier la bonne superposition des SVG si besoin.\n\n#### Gravure des pistes\n\n> ⚠️ Vérifier de nouveau l'effet miroir.\n>\n> Important : **monter la fraise** et faire un **homing**.\n\n**Fraise utilisée** : V-bits → *Other* → **pointe javelot 30°, 0,125 in (⅛ pouce)**.\n\n**Cut settings** *(onglet Manual)* :\n\n| Paramètre | Valeur |\n|---|---|\n| Feed rate | 60 mm/min |\n| Plunge rate | 60 mm/min |\n| Depth per pass | 0,05 mm |\n\n**Import du SVG** : *Project → Import SVG*. Le placer à l'origine via `Ctrl + A` puis position `X = 0`, `Y = 0` (veiller à avoir un remplissage interne sur la couche extérieure, ou équivalent).\n\nSupprimer le contour et, au besoin, les trous de perçage. Combiner les pistes : `Ctrl + A` puis *Edit → Combine*.\n\n**Définir la profondeur de passe et le mode** : `Ctrl + A` → *Cut* → `Depth = 0,1 mm` *(à vérifier — proposition : 0,2 mm ?)* → **Cut outside shape path**.\n\n#### Perçages\n\n> ⚠️ Vérifier l'effet miroir.\n>\n> 💡 Préparer le fichier pendant que la fraise refroidit !\n\n- monter la fraise et faire un homing ;\n- *Probe* → **Use Last XY Zero** ;\n- ré-importer le SVG, le placer à `(0, 0)` (ou `Ctrl + Z`), puis supprimer le contour et les pistes ;\n- au besoin, supprimer aussi tout reste de contour ou de pistes.\n\n**Fraise utilisée** : 1/32 in (0,03125 in).\n\n**Profondeur et mode** : `Ctrl + A` → *Cut* → `Depth = max` (+ ajouter `0,2 mm` via **Add depth**) → **Cut inside shape path**.\n\n**Cut settings** :\n\n| Paramètre | Valeur |\n|---|---|\n| Feed rate | 300 mm/min |\n| Plunge rate | 100 mm/min |\n| Depth per pass | 0,4 mm |\n\n#### Découpe du contour\n\n- **Work Zero** : *Manual* → **Use Last Position** ;\n- ré-importer le SVG à `(0, 0)`, supprimer perçages et pistes (ou tracer directement le contour avec les outils d'Easel).\n\n**Fraise utilisée** : 1/32 in.\n\n**Profondeur et mode** : `Ctrl + A` → *Cut* → `Depth = max` (+ `0,2 mm` supplémentaires) → **Cut outside shape path**.\n\n> Sans les **tabs** ?\n\n**Cut settings** :\n\n| Paramètre | Valeur |\n|---|---|\n| Feed rate | 300 mm/min |\n| Plunge rate | 100 mm/min |\n| Depth per pass | 0,4 mm |\n\n#### Fixation de la plaque PCB\n\n> 💡 Conseil : travailler **en bas à gauche** de la fraiseuse.\n\n---\n\n## 7. Et après ?\n\nÀ définir : exposition, autres ateliers, création d'un club, prolongements logiciels et matériels…\n\n---\n\n## Notes éditoriales (à traiter)\n\n- Harmoniser / reprendre la cohérence des notes encore en suspens.\n- Vérifier les points marqués `?` (notamment indicateurs de non-connexion, valeur de profondeur à 0,1 ou 0,2 mm, pas à 2,34 ou 2,54 mm).\n- Compléter la section « Et après ? ».\n- Réinsérer les illustrations du document original aux emplacements pertinents (KiCad, FlatCam, Easel)."}
\ No newline at end of file
diff --git a/_cache/articles/ab80312d-1483-4187-bbe6-54bcaed793a9.json b/_cache/articles/ab80312d-1483-4187-bbe6-54bcaed793a9.json
deleted file mode 100644
index 9c9f98c..0000000
--- a/_cache/articles/ab80312d-1483-4187-bbe6-54bcaed793a9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ab80312d-1483-4187-bbe6-54bcaed793a9","slug":"specifications-esp-01","title":"ESP-01 : présentation et premiers pas","author":"cedric@abonnel.fr","published":true,"published_at":"2022-01-28 10:03","created_at":"2022-01-28 10:03:16","updated_at":"2026-05-13 18:26:30","revisions":[{"n":1,"date":"2026-05-13 18:26:30","comment":"Contenu modifié","title":"ESP-01 : présentation et premiers pas"}],"cover":"","files_meta":{"20201207-233302.png":{"author":"","source_url":""},"20201209-085932.png":{"author":"","source_url":""},"20201212-183454.png":{"author":"","source_url":""},"20220128-103802.png":{"author":"","source_url":""},"20220128-110155.png":{"author":"","source_url":""},"esp01.pdf":{"author":"","source_url":""}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Électronique","content":"# ESP-01 : présentation et premiers pas\n\n\n\n## Présentation\n\nL'[ESP-01](https://amzn.to/3oAwIaR) est un module Wi-Fi compact construit autour du microcontrôleur **ESP8266EX** d'Espressif. Sur un PCB d'environ 24 × 14 mm, il rassemble :\n\n- un microcontrôleur **ESP8266EX** (cœur Tensilica L106 32 bits cadencé à 80/160 MHz) ;\n- une mémoire **SPI Flash** externe (généralement **1 Mo** sur les versions courantes, parfois jusqu'à 4 Mo) ;\n- une **antenne PCB** d'environ 2 dBi, gravée directement sur le circuit imprimé ;\n- un **connecteur 2 × 4 broches** au pas de 2,54 mm.\n\n> Lien d'achat : [ESP-01 basé sur ESP8266](https://amzn.to/3oAwIaR)\n\n### ESP8266EX vs ESP-01 : ne pas confondre\n\nUne confusion fréquente porte sur la dénomination du produit :\n\n- **ESP8266EX** désigne le **circuit intégré** (le SoC) produit par Espressif. C'est la puce qui contient le processeur, la radio Wi-Fi, la RAM et les périphériques.\n- **ESP-01** désigne un **module** : un petit PCB qui embarque l'ESP8266EX, sa mémoire flash, son antenne et un connecteur d'accès. Il est conçu et vendu par AI-Thinker, pas par Espressif.\n\nPlusieurs autres modules existent autour du même SoC (ESP-02, ESP-05, ESP-07, ESP-12, etc.). Ils diffèrent par le nombre de broches exposées, la taille de la flash, le type d'antenne et le facteur de forme. L'ESP-01 est le plus simple et le plus économique de la famille, mais aussi le plus contraint en nombre d'entrées/sorties accessibles.\n\n### Pourquoi un adaptateur USB est nécessaire\n\nL'ESP-01 n'expose qu'un port série UART à 3,3 V — pas d'interface USB, pas de régulateur, pas de bouton. Pour le programmer ou dialoguer avec lui depuis un ordinateur, il faut un **adaptateur USB-série** capable de :\n\n- convertir les niveaux USB en niveaux série logiques ;\n- fournir une alimentation **3,3 V** stable (l'ESP-01 ne tolère pas le 5 V).\n\nLes adaptateurs courants utilisent une puce **CH340**, **CP2102** ou **FT232**. Certains sont des dongles spécialement formés pour accueillir l'ESP-01 directement sur leur connecteur.\n\n> Attention : on lit parfois la référence « CH360 ». Il s'agit en réalité de la **CH340** (de WCH). Aucune puce « CH360 » n'existe dans cette gamme.\n\n## Brochage de l'ESP-01\n\n\n\nLe connecteur 8 broches est directement câblé sur les pins de l'ESP8266EX :\n\n| Broche | Nom | Rôle |\n|---|---|---|\n| 1 | **GND** | Masse |\n| 2 | **GPIO2** | E/S générique. Doit être à l'état haut (ou flottante) au démarrage pour booter normalement. |\n| 3 | **GPIO0** | E/S générique. **Forcée à GND au démarrage** pour entrer en mode programmation (flash). Laissée libre, elle permet un boot normal. |\n| 4 | **RX** | Réception série (UART0). À relier au TX de l'adaptateur USB-série. |\n| 5 | **TX** | Émission série (UART0). À relier au RX de l'adaptateur USB-série. |\n| 6 | **CH_PD** (aussi noté **EN**) | Chip enable. Doit être maintenue à **3,3 V** pour que le module fonctionne. |\n| 7 | **RST** | Reset, actif à l'état bas. |\n| 8 | **VCC** | Alimentation **3,3 V** uniquement. |\n\nPoints de vigilance :\n\n- l'alimentation **3,3 V** est impérative ; le 5 V détruit le SoC instantanément ;\n- les pics de courant en émission peuvent atteindre **300 mA**. Une alimentation sous-dimensionnée provoque des resets aléatoires ;\n- les niveaux logiques sont également à 3,3 V : interfacer un Arduino Uno (5 V) sans pont diviseur ou level shifter peut endommager l'ESP.\n\n### Branchement avec un adaptateur USB-CH340\n\n\n\nUne fois l'ESP-01 enfiché dans l'adaptateur, ce dernier joue le rôle de pont entre le port USB de l'ordinateur et l'UART de l'ESP8266EX :\n\n- l'ordinateur voit un port série virtuel (`/dev/ttyUSB0` sous Linux, `COMx` sous Windows) ;\n- l'adaptateur fournit le 3,3 V à l'ESP-01 et relaie les octets dans les deux sens ;\n- la plupart des adaptateurs d'entrée de gamme **ne gèrent pas le passage en mode flash** : voir l'article dédié à la [modification de l'adaptateur USB vers ESP-01](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation) pour ajouter un jumper GPIO0 / GND.\n\n## Datasheet\n\nLa documentation officielle est très succincte pour ce module. Les deux références utiles sont :\n\n- la **datasheet de l'ESP8266EX** (Espressif) — caractéristiques électriques, brochage du SoC, consommation : \n- la **datasheet AI-Thinker de l'ESP-01** (sommaire) — dimensions et brochage du module : disponible sur le mirroir du fabricant.\n\n\n\nLe fichier joint à cet article reprend la version condensée diffusée par AI-Thinker : [esp01.pdf](esp01.pdf)\n\n## Configurer l'IDE Arduino\n\n\n\nL'IDE Arduino ne sait pas, par défaut, compiler pour l'ESP8266. Il faut au préalable installer le **board package** correspondant.\n\n### 1. Ajouter l'URL du gestionnaire de cartes\n\nDans `Fichier → Préférences`, ajouter dans **URL de gestionnaire de cartes supplémentaires** :\n\n```\nhttps://arduino.esp8266.com/stable/package_esp8266com_index.json\n```\n\n### 2. Installer le support ESP8266\n\nOuvrir `Outils → Type de carte → Gestionnaire de cartes`, rechercher **esp8266** et installer le paquet *esp8266 by ESP8266 Community*.\n\n### 3. Sélectionner la carte et les paramètres\n\nPour un ESP-01, choisir `Outils → Type de carte → Generic ESP8266 Module`, puis vérifier les paramètres suivants :\n\n| Paramètre | Valeur recommandée pour ESP-01 |\n|---|---|\n| **Flash Size** | `1MB (FS:64KB OTA:~470KB)` pour les ESP-01 noirs ; `512KB` pour les anciens ESP-01 bleus |\n| **Flash Mode** | `DOUT` (compatible avec la majorité des modules ; éviter `QIO` qui plante au boot sur certains lots) |\n| **Flash Frequency** | `40 MHz` |\n| **CPU Frequency** | `80 MHz` |\n| **Upload Speed** | `115200` baud (vitesse fiable ; possible de monter à 230400 ou 460800 si l'adaptateur suit) |\n| **Reset Method** | `dtr (aka nodemcu)` si l'adaptateur câble DTR ; sinon `no dtr (aka ck)` (reset manuel) |\n| **Port** | port série de l'adaptateur (`/dev/ttyUSB0`, `COM3`…) |\n\nEn pratique, sur un ESP-01 récent acheté avec un adaptateur basique, seul le **port série** doit être ajusté. Les valeurs par défaut conviennent.\n\n### 4. Premier téléversement\n\nUn programme de test minimal pour valider la chaîne complète :\n\n```cpp\nvoid setup() {\n Serial.begin(115200);\n pinMode(LED_BUILTIN, OUTPUT);\n}\n\nvoid loop() {\n digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));\n Serial.println(\"Hello ESP-01\");\n delay(1000);\n}\n```\n\nAvant de lancer le téléversement :\n\n1. placer l'ESP-01 en **mode flash** (GPIO0 à GND au démarrage) ;\n2. brancher l'adaptateur sur le PC ;\n3. lancer le téléversement depuis l'IDE Arduino.\n\nSi l'opération échoue avec un message du type `Failed to connect to ESP8266: Timed out waiting for packet header`, c'est que la mise en mode flash n'a pas été effective. Voir là encore l'article sur la [modification de l'adaptateur](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation).\n\n## Pour aller plus loin\n\n- [Adaptateur USB vers ESP-01 : activer le mode programmation](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation)\n- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)\n- [Réinitialisation d'un ESP-01 : restauration du firmware AT](https://varlog.a5l.fr/post/esp8266ex-restore-commandes-at)\n```\n","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f.json b/_cache/articles/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f.json
deleted file mode 100644
index 13ffd10..0000000
--- a/_cache/articles/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f","slug":"esptool","title":"esptool","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-19 11:43:45","created_at":"2025-11-19 11:43:45","updated_at":"2025-11-19 11:43:45","revisions":[],"cover":"","files_meta":[],"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Électronique","content":"# esptool\n\n\n\n**esptool** est un outil en ligne de commande développé par Espressif (le fabricant des puces ESP32, ESP8266, etc.) qui sert à flasher, programmer et interagir avec les microcontrôleurs ESP via leur port série (UART).\n\n- Espressif recommande d’installer `esptool` via `pip` si possible. [^note: https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html]\n- Ils recommandent fortement d’utiliser un **virtual environment (venv)** pour éviter de polluer l’environnement Python système.\n\n# Installation\n1. Installer le package `python3-pip` et `python3-venv` si ce n’est pas déjà fait :\n\n```BASH\nsudo apt update\nsudo apt install python3-pip python3-venv\n```\n\n2. Crée un `venv` dans votre dossier (par exemple `esptoolenv`) :\n\n```BASH\npython3 -m venv ~/esptoolenv\n```\n\n# Utilisation\n1. Activer le `venv` :\n\n```BASH\nsource ~/esptoolenv/bin/activate\n```\n\n2. Installer `esptool` dans le `venv` :\n\n(si vous l'avez effectué dans une utilisation précédente, inutile de le refaire maintenant).\n\n```BASH\npip install esptool\n```\n\n3. Vérifier que ça marche :\n\n```BASH\nesptool version\n```\n\nCe qui donne le résultat suivant :\n\n```BASH\n(esptoolenv) cedric41a@cedric41a-MS-7C56:~$ esptool version\nesptool v5.1.0\n5.1.0\n```\n\n4. Quand vous avez fini d’utiliser `esptool`, vous pouvez désactiver le `venv` :\n\n```BASH\ndeactivate\n```","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/ac8515ca-400e-43dc-b5bb-08aa5e6689b5.json b/_cache/articles/ac8515ca-400e-43dc-b5bb-08aa5e6689b5.json
deleted file mode 100644
index 815e6fb..0000000
--- a/_cache/articles/ac8515ca-400e-43dc-b5bb-08aa5e6689b5.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ac8515ca-400e-43dc-b5bb-08aa5e6689b5","slug":"premier-programme-esp-01-afficher-les-informations-systeme","title":"Premier programme ESP-01 : afficher les informations système","author":"cedric@abonnel.fr","published":true,"published_at":"2020-12-12 22:28","created_at":"2020-12-12 22:28:56","updated_at":"2026-05-13 18:30:19","revisions":[{"n":1,"date":"2026-05-13 18:30:19","comment":"Titre modifié, contenu modifié","title":"Premier programme ESP-01"}],"cover":"","files_meta":{"dummy.png":{"author":"","source_url":""}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Électronique","content":"# Premier programme ESP-01 : afficher les informations système\n\n## Objectif\n\nLe sketch ci-dessous est un petit utilitaire de diagnostic : une fois téléversé sur un ESP-01, il publie toutes les dix secondes sur la console série un état détaillé du microcontrôleur — identifiant, fréquence, tension d'alimentation, version du SDK — ainsi qu'un état de la mémoire flash. C'est l'équivalent d'un `uname -a` couplé à un `df` pour l'ESP8266.\n\nCet exemple sert deux objectifs :\n\n- **valider la chaîne complète** (adaptateur, mode flash, IDE, board package) en réussissant un premier téléversement ;\n- **identifier précisément le module** en main : la flash réelle ne correspond pas toujours à ce qui est annoncé par le vendeur, et il peut être utile de le constater avant d'aller plus loin.\n\n> **Prérequis** : un ESP-01 programmable depuis l'IDE Arduino. Voir les articles dédiés à l'[adaptateur USB-série](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation) et à la [configuration de l'IDE pour l'ESP-01](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas).\n\n## Le programme\n\n```cpp\n// Demande au SDK de connecter l'ADC interne à la mesure de VCC\n// plutôt qu'à la broche TOUT. Doit être déclaré en dehors de setup()\n// pour être pris en compte au démarrage.\nADC_MODE(ADC_VCC);\n\nvoid setup() {\n Serial.begin(115200);\n delay(100); // petit délai pour stabiliser l'UART\n}\n\nvoid loop() {\n /* ----- ESP8266EX ----- */\n Serial.println(\"INFO ESP8266EX\");\n\n Serial.printf(\"Numéro de série de l'ESP8266EX .....: %u\\n\",\n ESP.getChipId());\n\n float frequenceCpu = float(ESP.getCpuFreqMHz());\n Serial.printf(\"Fréquence du CPU ...................: %4.1f MHz\\n\",\n frequenceCpu);\n\n // getVcc() renvoie la tension en millivolts\n float vcc = float(ESP.getVcc()) / 1000.0;\n Serial.printf(\"Alimentation .......................: %4.2f V\\n\", vcc);\n\n // La version du core Arduino-ESP8266 contient des underscores\n // (ex: 2_7_4) ; on les remplace par des points pour la lisibilité.\n String coreVersion = ESP.getCoreVersion();\n coreVersion.replace('_', '.');\n Serial.print(\"Version du gestionnaire de carte ...: \");\n Serial.println(coreVersion);\n\n Serial.printf(\"Version du SDK .....................: %s\\n\\n\",\n ESP.getSdkVersion());\n\n /* ----- Mémoire flash ----- */\n Serial.println(\"INFO FLASH\");\n\n Serial.printf(\"Numéro de série du chip ............: %u\\n\",\n ESP.getFlashChipId());\n\n float frequenceFlash = float(ESP.getFlashChipSpeed()) / 1000000.0;\n Serial.printf(\"Fréquence ..........................: %4.1f MHz\\n\",\n frequenceFlash);\n\n Serial.printf(\"Capacité effective .................: %u octets\\n\",\n ESP.getFlashChipRealSize());\n Serial.printf(\"Capacité paramétrée dans l'EDI .....: %u octets\\n\",\n ESP.getFlashChipSize());\n\n Serial.printf(\"Taille du sketch ...................: %u octets\\n\",\n ESP.getSketchSize());\n Serial.printf(\"Mémoire disponible .................: %u octets\\n\\n\\n\",\n ESP.getFreeSketchSpace());\n\n delay(10000);\n}\n```\n\n## Téléverser et lire la sortie\n\n1. Sélectionner `Outils → Type de carte → Generic ESP8266 Module`.\n2. Régler le port série sur celui de l'adaptateur.\n3. Placer l'ESP-01 en mode flash (jumper GPIO0 ↔ GND), téléverser, retirer le jumper, redémarrer.\n4. Ouvrir le moniteur série à **115200 bauds**, fin de ligne **NL & CR**.\n\nSortie attendue (les valeurs varient d'un module à l'autre) :\n\n```\nINFO ESP8266EX\nNuméro de série de l'ESP8266EX .....: 10106374\nFréquence du CPU ...................: 80.0 MHz\nAlimentation .......................: 3.47 V\nVersion du gestionnaire de carte ...: 2.7.4\nVersion du SDK .....................: 2.2.2-dev(38a443e)\n\nINFO FLASH\nNuméro de série du chip ............: 1327304\nFréquence ..........................: 40.0 MHz\nCapacité effective .................: 1048576 octets\nCapacité paramétrée dans l'EDI .....: 1048576 octets\nTaille du sketch ...................: 268288 octets\nMémoire disponible .................: 778240 octets\n```\n\n## Lecture des informations\n\n### Bloc ESP8266EX\n\n| Information | Méthode | Commentaire |\n|---|---|---|\n| Numéro de série du SoC | `ESP.getChipId()` | Entier 24 bits dérivé de l'adresse MAC du module. Identifie de manière unique un ESP8266 donné. |\n| Fréquence du CPU | `ESP.getCpuFreqMHz()` | 80 MHz par défaut, peut passer à 160 MHz avec `system_update_cpu_freq(160)` ou via les options de carte de l'IDE. |\n| Alimentation | `ESP.getVcc()` | Tension VCC en millivolts. Nécessite `ADC_MODE(ADC_VCC)` et que la broche TOUT (ADC0) soit laissée libre. |\n| Version du core | `ESP.getCoreVersion()` | Version du board package *esp8266 by ESP8266 Community*. C'est lui qui fournit l'API Arduino utilisée ici. |\n| Version du SDK | `ESP.getSdkVersion()` | Version du SDK NONOS d'Espressif, utilisé en interne par le core. Ne pas confondre avec la version du core. |\n\nLecture de la sortie d'exemple : le module est un ESP8266 cadencé à 80 MHz, alimenté à environ 3,47 V (légèrement au-dessus du nominal de 3,3 V, ce qui reste dans la plage tolérée 3,0–3,6 V), compilé avec le board package 2.7.4 (basé sur le SDK NONOS 2.2.2).\n\n### Bloc Flash\n\n| Information | Méthode | Commentaire |\n|---|---|---|\n| Numéro de série de la flash | `ESP.getFlashChipId()` | Concaténation du manufacturer ID et du device ID renvoyés par la commande JEDEC. Utile pour identifier la puce flash réellement soudée. |\n| Fréquence | `ESP.getFlashChipSpeed()` | Vitesse de l'horloge SPI en Hz. 40 MHz est la valeur standard ; 80 MHz est possible mais instable sur certains lots. |\n| Capacité effective | `ESP.getFlashChipRealSize()` | Taille **physique** de la puce flash, lue dans son JEDEC ID. C'est la vérité matérielle. |\n| Capacité paramétrée | `ESP.getFlashChipSize()` | Taille que l'IDE a annoncée au firmware (paramètre *Flash Size* dans `Outils`). Doit correspondre à la capacité effective. |\n| Taille du sketch | `ESP.getSketchSize()` | Place occupée par le programme actuel. |\n| Mémoire disponible | `ESP.getFreeSketchSpace()` | Place restante utilisable pour un téléversement OTA. **Pas** la RAM libre — pour cela utiliser `ESP.getFreeHeap()`. |\n\nDans la sortie d'exemple, la flash physique fait **1 Mo** (1 048 576 octets) et l'IDE a été paramétré avec la même valeur : c'est cohérent.\n\n> **Piège classique** : si `getFlashChipRealSize()` et `getFlashChipSize()` diffèrent, le module est mal configuré dans l'IDE. Les conséquences vont de plantages aléatoires au refus de monter le système de fichiers SPIFFS/LittleFS. C'est l'un des intérêts principaux de ce sketch : détecter ce désaccord avant d'investiguer un comportement étrange.\n\n## Variante : ajouter quelques infos utiles\n\nQuelques méthodes complémentaires qu'il peut être pertinent d'ajouter au programme selon les besoins :\n\n```cpp\nSerial.printf(\"RAM libre (heap) ...................: %u octets\\n\",\n ESP.getFreeHeap());\nSerial.printf(\"Fragmentation du heap ..............: %u %%\\n\",\n ESP.getHeapFragmentation());\nSerial.printf(\"Plus gros bloc libre ...............: %u octets\\n\",\n ESP.getMaxFreeBlockSize());\n\nSerial.printf(\"Adresse MAC ........................: %s\\n\",\n WiFi.macAddress().c_str()); // nécessite #include \nSerial.printf(\"Cause du dernier reset .............: %s\\n\",\n ESP.getResetReason().c_str());\n```\n\nCes valeurs sont particulièrement intéressantes pour diagnostiquer des plantages : `getResetReason()` indique si le module a redémarré sur un watchdog, un brown-out, un reset matériel ou une exception logicielle.\n\n## Pour aller plus loin\n\n- [L'ESP-01 : présentation et premiers pas](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas)\n- [Adaptateur USB vers ESP-01 : activer le mode programmation](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation)\n- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)\n- Documentation officielle de l'API `ESP` du core Arduino : \n```","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd.json b/_cache/articles/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd.json
deleted file mode 100644
index a34ced4..0000000
--- a/_cache/articles/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd","slug":"post-install","title":"Premiers pas DevOps : préparer un système Debian fraîchement installé","author":"cedric@abonnel.fr","published":true,"published_at":"2023-02-09 15:18","created_at":"2023-02-09 15:18:57","updated_at":"2026-05-12 22:57:49","revisions":[{"n":1,"date":"2026-05-12 22:57:49","comment":"Contenu modifié","title":"Premiers pas DevOps : préparer un système Debian fraîchement installé"}],"cover":"","files_meta":{"cover.jpg":{"author":"","source_url":"https://3.bp.blogspot.com/-WER6d6fmIXU/WD1K9pOVoQI/AAAAAAAAGt4/47YWFQ7r7HQs2HTlkoz9KRt-1SmBXXaWwCLcB/s320/debian-logo.jpg","title":"Logo Debian GNU Linux","meta":{"mime":"image/jpeg","size":12823,"width":320}}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Informatique","content":"# Premiers pas DevOps : préparer un système Debian fraîchement installé\n\nLorsqu'on vient de provisionner une machine Debian — que ce soit un conteneur LXC, une VM ou un serveur dédié — quelques étapes initiales sont incontournables avant de pouvoir vraiment travailler dessus. Ce petit guide reprend les gestes de base : passer en `root`, configurer les dépôts officiels, mettre le système à jour, installer `sudo`, et terminer par quelques réglages d'identification qui éviteront des surprises plus tard. Rien de sorcier, mais autant prendre de bonnes habitudes dès le départ.\n\n## Passer en utilisateur root\n\nLa première étape consiste à obtenir les droits administrateur. Sur une Debian fraîche, l'utilisateur `root` existe déjà et possède un mot de passe défini lors de l'installation. Pour ouvrir une session avec son environnement complet (variables, PATH, répertoire personnel), on utilise :\n\n```bash\nsu - root\n```\n\nLe tiret est important : sans lui, on hérite uniquement de l'UID de root sans charger son shell de connexion, ce qui peut donner lieu à des surprises (PATH incomplet, absence de `/sbin` dans la recherche des commandes, etc.).\n\nÀ noter que si `sudo` est déjà installé et que l'utilisateur courant fait partie du groupe `sudo`, on peut aussi écrire `sudo -i` pour obtenir le même résultat. Mais sur une Debian minimale tout juste installée, `sudo` n'est généralement pas présent — d'où la nécessité de passer par `su` dans un premier temps.\n\n## Configurer les dépôts officiels\n\nDebian s'appuie sur APT pour gérer ses paquets, et APT a besoin de savoir où les chercher. Cette configuration se trouve dans le fichier `/etc/apt/sources.list` (et, sur les versions récentes, éventuellement dans `/etc/apt/sources.list.d/` pour les dépôts additionnels).\n\nOn l'ouvre avec un éditeur de texte :\n\n```bash\nnano /etc/apt/sources.list\n```\n\nUn contenu typique pour Debian 12 (Bookworm) ressemble à ceci :\n\n```\ndeb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware\ndeb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware\ndeb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware\n```\n\nQuelques explications rapides sur les composants :\n\n- **main** contient les paquets libres officiellement supportés par Debian\n- **contrib** regroupe les paquets libres qui dépendent de logiciels non libres\n- **non-free** et **non-free-firmware** contiennent les paquets non libres (utiles notamment pour les pilotes matériels)\n\nLe dépôt `bookworm-updates` apporte les mises à jour stables non urgentes, tandis que `bookworm-security` fournit les correctifs de sécurité — celui-ci est essentiel et ne doit jamais être omis sur une machine connectée au réseau.\n\nPour une version différente de Debian, il suffit de remplacer `bookworm` par le nom de code correspondant (`bullseye`, `trixie`, etc.).\n\n## Mettre le système à jour\n\nUne fois les dépôts configurés, on récupère la liste des paquets disponibles puis on applique les mises à jour :\n\n```bash\napt update\napt upgrade\n```\n\nLa distinction entre les deux est importante :\n\n- `apt update` ne met rien à jour : la commande synchronise simplement l'index local des paquets avec ce que les dépôts annoncent. Sans cette étape, APT ignore l'existence des nouvelles versions.\n- `apt upgrade` installe effectivement les versions plus récentes des paquets déjà présents.\n\nPour les mises à jour plus profondes qui peuvent ajouter ou retirer des paquets (changement de dépendances, transitions majeures), il existe aussi `apt full-upgrade`. À utiliser avec un peu plus de précaution, mais c'est ce qu'il faut pour suivre l'évolution complète d'une distribution.\n\nSur un conteneur ou une VM fraîche, cette première mise à jour peut tirer un certain nombre de paquets. C'est normal : l'image de base est figée au moment de sa publication, et plusieurs mois de correctifs se sont souvent accumulés depuis.\n\nPetit conseil pour la suite, dès qu'on commencera à scripter ces opérations : préférer `apt-get` à `apt` dans les scripts, car son interface est garantie stable entre versions. Et pour éviter les questions interactives bloquantes lors d'installations automatisées, positionner `DEBIAN_FRONTEND=noninteractive` dans l'environnement.\n\n## Installer sudo\n\nPar défaut, Debian n'installe pas `sudo` sur un système minimal. Travailler en permanence en `root` n'est pourtant pas une bonne pratique : on perd la traçabilité des actions, et la moindre erreur de frappe peut avoir des conséquences sérieuses. L'idée derrière `sudo` est de déléguer ponctuellement des droits administrateur à un utilisateur normal, commande par commande, avec un journal des actions effectuées.\n\nL'installation se fait classiquement :\n\n```bash\napt install sudo\n```\n\nEnsuite, il faut ajouter son utilisateur (celui avec lequel on se connectera au quotidien) au groupe `sudo` :\n\n```bash\nusermod -aG sudo nom_utilisateur\n```\n\nLe drapeau `-a` (pour *append*) est crucial : sans lui, `usermod -G` remplacerait la liste des groupes secondaires de l'utilisateur au lieu d'y ajouter `sudo`, ce qui peut avoir des effets de bord désagréables.\n\nL'utilisateur doit ensuite se déconnecter puis se reconnecter pour que sa nouvelle appartenance au groupe soit prise en compte. À partir de là, il peut préfixer ses commandes par `sudo` pour les exécuter avec les droits administrateur, en saisissant son propre mot de passe (et non celui de root).\n\n## Régler l'identité et l'horloge de la machine\n\nDeux derniers détails de configuration qui paraissent anodins, mais qui simplifient grandement la vie sur un parc qui grandit.\n\nD'abord, fixer le nom de la machine. Sur une infrastructure organisée, le hostname et le FQDN suivent généralement une convention de nommage (par exemple `dafactures.acegrp.lan` pour un projet de facturation sur un réseau interne). La commande `hostnamectl` s'en charge proprement :\n\n```bash\nhostnamectl set-hostname dafactures.acegrp.lan\n```\n\nPenser à vérifier ensuite que `/etc/hosts` contient bien une ligne associant l'IP locale au FQDN, sous peine de voir certains services (Postfix notamment, ou des outils de log) se plaindre de ne pas résoudre leur propre nom.\n\nEnsuite, le fuseau horaire. Détail souvent négligé qui complique pourtant le débogage dès qu'on croise des logs entre plusieurs machines :\n\n```bash\ntimedatectl set-timezone Europe/Paris\n```\n\nLa synchronisation NTP est généralement déjà active via `systemd-timesyncd` sur les Debian récentes — un `timedatectl status` permet de le vérifier.\n\n## Et après ?\n\nUne fois ces étapes franchies, la machine est dans un état sain et utilisable. Les pistes naturelles pour la suite tournent autour du durcissement (configuration SSH avec authentification par clé et désactivation de la connexion root à distance, mise en place d'un pare-feu, installation de `unattended-upgrades` pour les correctifs de sécurité automatiques), puis de l'installation des outils métier proprement dits — serveur web, base de données, runtime applicatif.\n\nGarder en tête que ces gestes initiaux, aussi triviaux paraissent-ils, méritent d'être scriptés dès qu'on les répète plus de deux ou trois fois. C'est précisément là que la démarche DevOps prend tout son sens : transformer des manipulations manuelles en code reproductible, versionné et partageable.","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/b0b3ac59-87c5-4598-a549-f3168abb4429.json b/_cache/articles/b0b3ac59-87c5-4598-a549-f3168abb4429.json
deleted file mode 100644
index 079236f..0000000
--- a/_cache/articles/b0b3ac59-87c5-4598-a549-f3168abb4429.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"b0b3ac59-87c5-4598-a549-f3168abb4429","slug":"quand-les-conversations-sont-devenues-une-matiere-premiere","title":"Quand les conversations sont devenues une matière première","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-05 07:17","created_at":"2025-11-05 07:17:02","updated_at":"2026-05-12 01:49:27","revisions":[{"n":1,"date":"2026-05-12 01:49:27","comment":"","title":"Quand les conversations sont devenues une matière première"}],"cover":"","files_meta":[],"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"loisirs","content":"# Quand les conversations sont devenues une matière première\n\nEntre 2023 et 2024, quelque chose s'est rompu sur le web social. Pas un effondrement, pas une crise visible — plutôt un basculement discret, presque administratif, dans la manière dont les grandes plateformes ont commencé à regarder ce que produisaient leurs utilisateurs. Les messages, les fils de discussion, les commentaires sarcastiques sous une photo de chat, les longues confidences nocturnes sur Tumblr : tout cela, jusque-là considéré comme l'humus naturel des réseaux sociaux, est soudainement devenu autre chose. Une ressource. Un actif. Une matière brute.\n\nLe déclencheur s'appelle **Reddit**. Le 22 février 2024, le jour même où l'entreprise dépose son dossier d'introduction en Bourse, elle annonce un accord à 60 millions de dollars par an avec Google : le géant de la recherche pourra puiser dans les archives du forum, via son API, pour entraîner ses modèles d'intelligence artificielle. Quelques mois plus tard, OpenAI signe à son tour un accord similaire, estimé autour de 70 millions de dollars annuels par les analystes. Le message envoyé au marché est limpide : ces décennies de conversations humaines, agrégées par une communauté qui croyait simplement bavarder, valent désormais des centaines de millions de dollars. Steve Huffman, PDG de Reddit, vante un modèle économique enfin durable. Les analystes financiers, eux, parlent de mine d'or.\n\n**Tumblr** rejoint la danse une semaine plus tard, mais par effraction. Le 27 février 2024, le site spécialisé 404 Media révèle qu'Automattic — la maison mère de Tumblr et WordPress.com — finalise des accords avec OpenAI et Midjourney pour leur fournir l'accès aux contenus publiés sur ses plateformes. La fuite est embarrassante : des documents internes montrent qu'une première extraction de données a même ratissé trop large, embarquant par erreur des posts privés, des blogs supprimés et des contenus normalement exclus. Automattic publie en urgence un communiqué annonçant un système d'opt-out — la possibilité pour les utilisateurs de refuser, à condition de cocher la bonne case dans les bons paramètres. Mais la communauté Tumblr, refuge historique d'artistes, d'écrivains amateurs, de communautés queer et de fanfic, n'a pas attendu la procédure officielle pour réagir : la nouvelle déclenche une vague de fermetures de comptes et d'effacements rétroactifs.\n\n**X**, sous la direction d'Elon Musk, emprunte un chemin parallèle mais plus solitaire. Plutôt que de vendre l'accès à ses données à des concurrents, Musk a verrouillé son robinet dès 2023 — au point d'introduire des plafonds de consultation tellement absurdes que la plateforme en est devenue inutilisable pendant quelques jours — et a réservé sa matière première à xAI, sa propre société d'intelligence artificielle, pour alimenter le chatbot Grok. En octobre 2024, X annonce une refonte de ses conditions d'utilisation, effective le 15 novembre. Le nouveau texte est explicite : tout contenu publié sur la plateforme peut être utilisé pour entraîner ses modèles d'apprentissage automatique, ainsi que ceux de « partenaires tiers » non nommés. L'option qui permettait jusque-là aux utilisateurs européens de refuser que leurs posts servent à entraîner Grok est, dans la foulée, devenue inaccessible pour beaucoup. Le principe reste le même que chez Reddit — les mots des utilisateurs deviennent du carburant — mais sans le détour d'un contrat externe.\n\nCar ce qui frappe, ce n'est pas tant chaque accord pris isolément que la rapidité avec laquelle l'idée s'est imposée. En quelques mois, exploiter les mots de ses utilisateurs pour entraîner de l'IA est devenu non plus une stratégie audacieuse, mais une évidence de marché. **LinkedIn**, propriété de Microsoft — qui se trouve aussi être le principal investisseur d'OpenAI —, suit le mouvement avec une discrétion remarquable. Le 18 septembre 2024, une mise à jour silencieuse de sa politique de confidentialité révèle que la plateforme entraîne déjà ses propres modèles d'IA générative à partir des posts, articles et données de profil de ses membres, partout dans le monde — y compris au Royaume-Uni. Personne n'a été prévenu en bonne et due forme ; le paramètre permettant de refuser ne se déclenche pas par défaut.\n\nL'épisode tourne court. En 48 heures, l'Information Commissioner's Office britannique, le régulateur des données, exige un arrêt immédiat de la pratique sur le territoire. Stephen Almond, son directeur exécutif chargé des risques réglementaires, déclare publiquement que la confiance du public dans l'IA générative dépend précisément du respect des droits à la vie privée dès le départ. LinkedIn suspend le traitement au Royaume-Uni, dans l'Espace économique européen et en Suisse. Pour le reste du monde — les États-Unis, l'Asie, le Canada, l'Amérique latine —, la collecte continue, opt-out par défaut.\n\nMais quelque chose, du côté des utilisateurs, n'a pas suivi.\n\nSur Reddit, des modérateurs ferment leurs subreddits en protestation. D'autres remplacent leurs anciens posts par des chaînes de caractères absurdes — du sabotage de données, en somme, pour rendre leurs contributions inutilisables. Sur Tumblr, on voit ressurgir un vieux geste internet : des comptes entiers passent en privé, des années d'écriture s'effacent en quelques clics. Des forums spécialisés évoquent une « grève des données ». Une phrase circule, amère, sur plusieurs plateformes à la fois : *« Nos mots valent de l'or, mais pas pour nous. »*\n\nC'est sans doute le paradoxe le plus profond de cette séquence. Pendant deux décennies, les grandes plateformes avaient bâti leur valeur sur un contrat tacite : vous nous donnez votre temps et votre attention, nous vous offrons un espace pour exister et nous monétisons votre regard auprès des annonceurs. Le deal était imparfait, mais lisible. À partir de 2024, un second contrat se superpose au premier sans avoir été négocié : votre langage, vos conversations, vos archives intimes deviennent aussi une matière première vendable, à votre insu le plus souvent, pour entraîner des intelligences qui à terme produiront le même langage que vous — mais en série, à coût marginal nul, et au bénéfice d'autres.\n\nLe web social était entré dans une nouvelle ère. Celle où les conversations des uns sont devenues l'apprentissage des autres.\n\n---\n\n## Sources\nVoici la liste des sources utilisées pour la vérification, organisée par thème pour que tu puisses les citer ou les ajouter en fin d'article.\n\n### Reddit – Google et OpenAI\n\n- **CBS News** (23 février 2024) — Annonce de l'accord à 60 M$ entre Google et Reddit\nhttps://www.cbsnews.com/news/google-reddit-60-million-deal-ai-training/\n\n- **Lutzker & Lutzker** (18 mars 2024) — Analyse détaillée de l'accord et de l'usage de l'API Reddit\nhttps://www.lutzker.com/ip_bit_pieces/reddits-licensing-agreement-with-google/\n\n- **Columbia Journalism Review** — Analyse de la stratégie globale de Reddit (mention de l'accord OpenAI à ~70 M$/an)\nhttps://www.cjr.org/analysis/reddit-winning-ai-licensing-deals-openai-google-gemini-answers-rsl.php\n\n### Tumblr / Automattic – OpenAI et Midjourney\n\n- **404 Media** (27 février 2024) — Article source qui a révélé l'affaire\nhttps://www.404media.co/tumblr-and-wordpress-to-sell-users-data-to-train-ai-tools/\n\n- **Engadget** (27 février 2024) — Reprise détaillée avec la réponse officielle d'Automattic\nhttps://www.engadget.com/tumblr-and-wordpress-posts-will-reportedly-be-used-for-openai-and-midjourney-training-204425798.html\n\n- **WP Tavern** (28 février 2024) — Angle communauté WordPress et critique de la politique d'opt-out\nhttps://wptavern.com/automattic-faces-scrutiny-over-ai-access-policy\n\n- **Popular Science** (29 février 2024) — Mise en perspective sur l'inefficacité de l'opt-out\nhttps://www.popsci.com/technology/openai-wordpress-tumblr/\n\n### X (Twitter) – Conditions d'utilisation et entraînement de Grok\n\n- **Social Media Today** (17 octobre 2024) — Analyse des nouvelles conditions effectives le 15 novembre 2024\nhttps://www.socialmediatoday.com/news/x-formerly-twitter-updates-terms-service/730223/\n\n- **CNN Business** (21 octobre 2024) — Réaction des utilisateurs et flou sur l'opt-out\nhttps://www.cnn.com/2024/10/21/tech/x-twitter-terms-of-service\n\n- **Cybernews** (18 octobre 2024) — Sur la disparition de l'option d'opt-out\nhttps://cybernews.com/ai-news/updated-x-terms/\n\n- **Gigazine** — Déta#il des clauses ajoutées concernant les « partenaires tiers »\nhttps://gigazine.net/gsc_news/en/20241018-x-privacy-policy-ai-training/\n\n## LinkedIn – Intervention de l'ICO britannique\n\n- **TechCrunch** (20 septembre 2024) — LinkedIn suspend l'entraînement IA au Royaume-Uni\nhttps://techcrunch.com/2024/09/20/linkedin-has-stopped-grabbing-u-k-users-data-for-ai/\n\n- **The Record (Recorded Future News)** (20 septembre 2024) — Le rôle de l'ICO dans l'arrêt\nhttps://therecord.media/uk-regulator-stops-linkedin-ai-models\n\n- **The Hacker News** (22 septembre 2024) — Synthèse incluant la mention de Meta en parallèle\nhttps://thehackernews.com/2024/09/linkedin-halts-ai-data-processing-in-uk.html\n\n- **Legal IT Insider** (20 septembre 2024) — Citation complète de Stephen Almond (ICO)\nhttps://legaltechnology.com/2024/09/20/linkedin-suspends-opt-out-ai-model-training-for-uk-following-ico-concerns/","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/bea327e2-9d1c-4ff6-a5a5-26748c80018b.json b/_cache/articles/bea327e2-9d1c-4ff6-a5a5-26748c80018b.json
deleted file mode 100644
index 9612e5a..0000000
--- a/_cache/articles/bea327e2-9d1c-4ff6-a5a5-26748c80018b.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"bea327e2-9d1c-4ff6-a5a5-26748c80018b","slug":"anatomie-d-un-script-d-auto-deploiement-bash-fetch-scripts-sh","title":"Script Bash d'auto-déploiement : `fetch_scripts.sh`","author":"cedric@abonnel.fr","published":true,"published_at":"2026-05-04 07:04","created_at":"2026-05-12 10:55:39","updated_at":"2026-05-12 11:10:51","revisions":[{"n":1,"date":"2026-05-12 11:08:57","comment":"Catégorie modifiée, contenu modifié, article publié, couverture modifiée","title":"Script Bash d'auto-déploiement : `fetch_scripts.sh`"},{"n":2,"date":"2026-05-12 11:10:51","comment":"Contenu modifié : mention autocritique","title":"Script Bash d'auto-déploiement : `fetch_scripts.sh`"}],"cover":"cover.svg","files_meta":{"d6ea4554c9fbfc14-23663.svg":{"author":"","source_url":""},"cover.svg":{"author":"","source_url":""}},"external_links":[{"url":"https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/commit/18c6dd9e45e57d272659da6e2c53b79048985400/scripts/fetch_scripts.sh","name":"Script bash fetch_scripts.sh dans sa version 18c6dd9e45e57d272659da6e2c53b79048985400","added_at":"2026-05-12 11:07:42","meta":{"mime":"text/plain","size":4334}}],"seo_title":"","seo_description":"Auto analyse pédagogique et critique du script Bash d'auto-mise à jour qui synchronise des scripts depuis un dépôt Forgejo. Sept failles identifiées, sept correctifs à effectuer.","og_image":"https://varlog.a5l.fr/file?uuid=bea327e2-9d1c-4ff6-a5a5-26748c80018b&name=cover.svg","category":"informatique","content":"# > Comment un simple script Bash peut télécharger, mettre à jour et synchroniser une bibliothèque de scripts distants — et pourquoi il faut le lire avec un œil critique.\r\n\r\n[fetch_scripts.sh](https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/commit/18c6dd9e45e57d272659da6e2c53b79048985400/scripts/fetch_scripts.sh)\r\n\r\n> 📝 **Note** — Cet article est une autocritique. Le script `fetch_scripts.sh` analysé ici est de ma propre fabrication, déployé sur mes propres machines. L'exercice consiste à le relire avec la distance d'un reviewer extérieur, pour identifier ce qui tient la route et ce qui mériterait d'être repris.\r\n\r\n## Le contexte\r\n\r\nL'idée derrière ce script est élégante : centraliser une collection de scripts utilitaires dans un dépôt Git public (ici, une instance Forgejo auto-hébergée), puis fournir un **unique point d'entrée** que l'on télécharge sur n'importe quelle machine. Ce point d'entrée se met à jour tout seul, propose à l'opérateur de choisir quels sous-ensembles de scripts récupérer, et maintient une synchronisation locale du dépôt distant.\r\n\r\nC'est typiquement le genre d'outil qui se déploie en une ligne :\r\n\r\n```bash\r\nwget https://git.example.fr/.../fetch_scripts.sh && bash fetch_scripts.sh\r\n```\r\n\r\nDécortiquons ce qu'il fait, étape par étape, puis voyons où il faudrait taper.\r\n\r\n---\r\n\r\n## Étape 1 — L'auto-mise à jour\r\n\r\n```bash\r\nSCRIPT_URL=\"https://git.abonnel.fr/.../fetch_scripts.sh\"\r\nSCRIPT_NAME=$(basename \"$0\")\r\nTMP_SCRIPT=\"/tmp/$SCRIPT_NAME\"\r\n\r\nwget -q -O \"$TMP_SCRIPT\" \"$SCRIPT_URL\"\r\n\r\nif ! cmp -s \"$TMP_SCRIPT\" \"$0\"; then\r\n echo \"🔄 Mise à jour du script...\"\r\n mv \"$TMP_SCRIPT\" \"$0\"\r\n chmod +x \"$0\"\r\n exec \"$0\" \"$@\"\r\nfi\r\n```\r\n\r\n**Ce qui se passe :** le script télécharge sa propre version distante dans `/tmp`, la compare octet-à-octet avec lui-même (`cmp -s`), et si elle diffère, il s'écrase, se rend exécutable, et **se relance** via `exec` (qui remplace le processus courant — pas d'empilement de shells).\r\n\r\n**Pourquoi c'est malin :** ça garantit qu'à chaque exécution, l'opérateur travaille avec la version canonique du dépôt. Pas besoin de mécanisme de versioning, pas de vérification de hash, pas de paquet à publier.\r\n\r\n**Pourquoi c'est risqué :** on y reviendra dans la critique, mais en résumé — l'auto-mise à jour silencieuse depuis une URL en HTTPS sans signature est une porte d'entrée pour la chaîne d'approvisionnement.\r\n\r\n---\r\n\r\n## Étape 2 — Récupération du catalogue de dossiers\r\n\r\n```bash\r\nREPO_URL=\"https://git.abonnel.fr/.../scripts\"\r\nDIR_LIST_FILE=\".directories.txt\"\r\nMANDATORY_DIR=\"common\"\r\n\r\nTMP_DIR=$(mktemp -d)\r\nwget -q -O \"$TMP_DIR/$DIR_LIST_FILE\" \"$REPO_URL/$DIR_LIST_FILE\"\r\nmapfile -t AVAILABLE_DIRS < \"$TMP_DIR/$DIR_LIST_FILE\"\r\n```\r\n\r\nLe dépôt distant contient un fichier `.directories.txt` qui liste les catégories de scripts disponibles (par exemple : `common`, `proxmox`, `php`, `monitoring`…). Ce fichier est la **source de vérité** : ajouter une catégorie côté serveur la rend immédiatement disponible côté client.\r\n\r\n`mapfile` (alias `readarray`) lit le fichier ligne à ligne dans un tableau Bash. Plus propre qu'une boucle `while read`.\r\n\r\nUn dossier `common` est marqué comme obligatoire — il sera toujours téléchargé, sans demander à l'utilisateur.\r\n\r\n---\r\n\r\n## Étape 3 — Mémoire de la sélection précédente\r\n\r\n```bash\r\nSELECTED_DIRS_FILE=\".selected_dirs.txt\"\r\n\r\nif [ -f \"$SELECTED_DIRS_FILE\" ]; then\r\n mapfile -t PREVIOUS_SELECTION < \"$SELECTED_DIRS_FILE\"\r\nelse\r\n PREVIOUS_SELECTION=()\r\nfi\r\n```\r\n\r\nÀ chaque exécution, le script relit la sélection de la fois précédente. C'est ce qui permet à l'interface graphique (étape suivante) de **pré-cocher** les bons dossiers : on n'a pas à refaire son choix à chaque mise à jour.\r\n\r\n---\r\n\r\n## Étape 4 — L'interface `whiptail`\r\n\r\n```bash\r\nCHOICES=()\r\nfor dir in \"${AVAILABLE_DIRS[@]}\"; do\r\n if [ \"$dir\" == \"$MANDATORY_DIR\" ]; then\r\n continue\r\n fi\r\n if [[ \" ${PREVIOUS_SELECTION[*]} \" =~ \" $dir \" ]]; then\r\n CHOICES+=(\"$dir\" \"\" ON)\r\n else\r\n CHOICES+=(\"$dir\" \"\" OFF)\r\n fi\r\ndone\r\n\r\nSELECTED_DIRS=$(whiptail --title \"Sélection des dossiers\" --checklist \\\r\n \"Sélectionnez les dossiers à télécharger :\" 20 60 10 \\\r\n \"${CHOICES[@]}\" 3>&1 1>&2 2>&3)\r\n```\r\n\r\n`whiptail` est l'outil de dialogue ncurses standard sur Debian/Ubuntu — il affiche cette boîte bleue familière avec des cases à cocher, navigable au clavier. Idéal en SSH.\r\n\r\nLa gymnastique `3>&1 1>&2 2>&3` est un classique : `whiptail` écrit son interface sur stdout et sa réponse sur stderr. Il faut donc **échanger les deux** pour capturer la sélection dans `$SELECTED_DIRS` tout en laissant l'interface s'afficher.\r\n\r\nL'expression `[[ \" ${ARRAY[*]} \" =~ \" $dir \" ]]` est une astuce courante pour tester l'appartenance à un tableau Bash — on entoure d'espaces pour éviter les correspondances partielles (`web` qui matcherait `web-server`).\r\n\r\n---\r\n\r\n## Étape 5 — Synchronisation : ajouts et suppressions\r\n\r\n```bash\r\nSELECTED_DIRS_ARRAY=(\"$MANDATORY_DIR\" $(echo \"$SELECTED_DIRS\" | tr -d '\"'))\r\necho \"${SELECTED_DIRS_ARRAY[@]}\" > \"$SELECTED_DIRS_FILE\"\r\n\r\nfor dir in \"${PREVIOUS_SELECTION[@]}\"; do\r\n if [[ ! \" ${SELECTED_DIRS_ARRAY[*]} \" =~ \" $dir \" ]]; then\r\n echo \"🗑 Suppression du dossier $dir...\"\r\n rm -rf \"$dir\"\r\n fi\r\ndone\r\n```\r\n\r\nLogique de diff : tout ce qui était sélectionné avant et ne l'est plus est **supprimé du disque**. Ça maintient le répertoire local propre — pas de scripts orphelins qui traînent.\r\n\r\n`whiptail` renvoie la sélection sous forme de chaîne entre guillemets (`\"dir1\" \"dir2\"`), d'où le `tr -d '\"'` pour les retirer avant de constituer le tableau.\r\n\r\n---\r\n\r\n## Étape 6 — Téléchargement des fichiers de chaque dossier\r\n\r\n```bash\r\nfor TARGET_DIR in \"${SELECTED_DIRS_ARRAY[@]}\"; do\r\n wget -q -O \"$LIST_PATH\" \"$REPO_URL/$TARGET_DIR/.list_files.txt\"\r\n mkdir -p \"$TARGET_DIR\"\r\n\r\n while read -r file; do\r\n wget -q -O \"$TARGET_DIR/$(basename \"$file\")\" \"$REPO_URL/$TARGET_DIR/$file\"\r\n done < \"$LIST_PATH\"\r\n\r\n for existing_file in \"$TARGET_DIR\"/*; do\r\n if [ -f \"$existing_file\" ] && ! grep -qx \"$(basename \"$existing_file\")\" \"$LIST_PATH\"; then\r\n rm \"$existing_file\"\r\n fi\r\n done\r\n\r\n chmod +x \"$TARGET_DIR\"/*.sh\r\ndone\r\n```\r\n\r\nMême logique récursive d'un niveau plus bas : chaque dossier contient son propre `.list_files.txt` listant ses fichiers. On télécharge ceux qui y figurent, on supprime ceux qui n'y figurent plus, et on rend tout exécutable.\r\n\r\nC'est une forme de `rsync` artisanal, basé sur des manifestes plats. Ça fonctionne sans avoir à installer `git` sur la machine cible — seuls `wget` et `whiptail` sont requis.\r\n\r\n---\r\n\r\n## Critique : ce qui marche, ce qui inquiète\r\n\r\n### Les bons côtés\r\n\r\n**La logique d'idempotence** est solide. Le script peut tourner cent fois de suite, il convergera toujours vers le même état : les dossiers sélectionnés contiendront exactement les fichiers du manifeste, ni plus, ni moins. C'est le bon réflexe DevOps.\r\n\r\n**L'auto-bootstrap** est ergonomique. Une seule URL à retenir, tout le reste se télécharge tout seul. Pour une bibliothèque personnelle de scripts d'admin, c'est imbattable en simplicité.\r\n\r\n**Pas de dépendances exotiques.** `wget`, `whiptail`, `mapfile` : tout est disponible nativement sur Debian. Le script tourne aussi bien sur un conteneur LXC fraîchement provisionné que sur une machine établie.\r\n\r\n**Le manifeste séparé** (`.directories.txt` et `.list_files.txt`) découple la liste des fichiers de leur contenu. C'est plus simple qu'un parsing HTML de l'index Git, et ça reste sous contrôle éditorial.\r\n\r\n### Les angles morts\r\n\r\n#### 1. Aucune vérification d'intégrité\r\n\r\nC'est **le** point critique. Le script télécharge du code exécutable en HTTPS, sans vérifier :\r\n- ni signature GPG,\r\n- ni hash SHA256,\r\n- ni même que le serveur a bien répondu correctement.\r\n\r\n`wget -q` en mode silencieux **n'échoue pas visiblement** : si la requête renvoie une page d'erreur 404 ou une page de connexion captive Wi-Fi en HTML, elle sera écrite dans le fichier de destination. La vérification suivante (`cmp -s`) considérera ce HTML comme « différent », fera le `mv`, et au prochain `exec` le shell essaiera d'exécuter du HTML. Au mieux ça crashe, au pire ça exécute des balises interprétables.\r\n\r\n**Pire encore pour l'auto-update :** si quelqu'un compromet l'instance Forgejo (ou interpose un proxy malveillant capable de servir un certificat valide pour `git.abonnel.fr`), le prochain `fetch_scripts.sh` télécharge et exécute du code arbitraire avec les privilèges de l'utilisateur courant — souvent root pour ce genre d'outils d'admin.\r\n\r\n**Correctif minimal :** publier un fichier `.sha256sums` signé GPG dans le dépôt, le télécharger, vérifier sa signature avec une clé connue localement, puis valider chaque fichier téléchargé contre ce manifeste.\r\n\r\n#### 2. `wget` sans gestion d'erreur\r\n\r\n```bash\r\nwget -q -O \"$TMP_SCRIPT\" \"$SCRIPT_URL\"\r\nif ! cmp -s \"$TMP_SCRIPT\" \"$0\"; then\r\n```\r\n\r\nSi `wget` échoue (réseau coupé, DNS HS, certificat expiré), `$TMP_SCRIPT` sera soit vide soit absent. `cmp -s` retournera « différent », et le script **écrasera la version locale par un fichier vide**. À la prochaine exécution, plus rien ne fonctionne.\r\n\r\n**Correctif :** vérifier le code de retour de `wget`, vérifier que le fichier téléchargé n'est pas vide, et vérifier qu'il commence bien par `#!/bin/bash` avant d'écraser quoi que ce soit.\r\n\r\n```bash\r\nif ! wget -q -O \"$TMP_SCRIPT\" \"$SCRIPT_URL\"; then\r\n echo \"❌ Téléchargement échoué, on garde la version actuelle\"\r\nelif [ ! -s \"$TMP_SCRIPT\" ] || ! head -n1 \"$TMP_SCRIPT\" | grep -q \"^#!\"; then\r\n echo \"❌ Fichier téléchargé invalide\"\r\n rm -f \"$TMP_SCRIPT\"\r\nelif ! cmp -s \"$TMP_SCRIPT\" \"$0\"; then\r\n # ...\r\nfi\r\n```\r\n\r\n#### 3. Le `exec \"$0\" \"$@\"` perd les modifications de l'environnement\r\n\r\nSi le script a été lancé par `bash fetch_scripts.sh` (donc sans le bit exécutable, sans shebang utilisé), `$0` vaut `fetch_scripts.sh`. Après `mv`, on `exec` un fichier qui pourrait ne pas être dans le `$PATH`. En pratique ça marche parce qu'on est dans le bon répertoire, mais c'est fragile — un `cd` quelque part dans le script suffirait à le casser.\r\n\r\n#### 4. Injection via les noms de fichiers du manifeste\r\n\r\n```bash\r\nwhile read -r file; do\r\n wget -q -O \"$TARGET_DIR/$(basename \"$file\")\" \"$REPO_URL/$TARGET_DIR/$file\"\r\ndone < \"$LIST_PATH\"\r\n```\r\n\r\nLe contenu de `.list_files.txt` est utilisé directement dans une URL et dans un chemin de fichier local. Si quelqu'un peut écrire dans ce fichier manifeste (ce qui revient à pouvoir pousser sur le dépôt Forgejo), il peut y mettre des chemins comme `../../../etc/cron.d/backdoor` et écrire en dehors du répertoire prévu.\r\n\r\n`basename` neutralise partiellement la chose côté nom local, mais l'URL côté distant accepte n'importe quoi. C'est moins critique que la première faille, mais ça mérite un filtre regex (`[a-zA-Z0-9._-]+` uniquement).\r\n\r\n#### 5. `whiptail` et la sélection vide\r\n\r\nSi l'utilisateur ne coche rien et valide, `$SELECTED_DIRS` est vide. Le script continue avec seulement `common`, ce qui est probablement le comportement attendu. Mais si `whiptail` n'est pas installé (rare mais possible, par exemple sur Alpine ou un Debian minimal sans `whiptail`), le script échoue avec une erreur peu explicite. Un test préalable `command -v whiptail` éviterait la déconvenue.\r\n\r\n#### 6. Pas de log, pas de mode dry-run\r\n\r\nPour un outil qui supprime des fichiers (`rm -rf \"$dir\"`), l'absence d'option `--dry-run` qui afficherait ce qui *serait* fait sans rien toucher est gênante. Une frappe distraite sur la checklist, et un dossier entier disparaît sans warning.\r\n\r\n#### 7. Le verrou manquant\r\n\r\nRien n'empêche deux instances de `fetch_scripts.sh` de tourner en parallèle (par exemple via `cron` et un opérateur en interactif). Un `flock` sur un fichier de lock éviterait des courses sur les opérations de download/delete.\r\n\r\n---\r\n\r\n## Verdict\r\n\r\nC'est un script **utile, lisible, et bien construit pour un usage personnel** sur des machines de confiance. La logique de synchronisation est saine, l'ergonomie `whiptail` est appréciable, l'auto-bootstrap est élégant.\r\n\r\nMais dès qu'on franchit la frontière du « j'utilise ça sur mes propres machines avec mon propre dépôt », les manques se font sentir : **pas de vérification d'intégrité, pas de gestion d'erreur réseau, pas d'option de récupération**. Dans un contexte d'équipe ou de production, ces points sont bloquants.\r\n\r\n### Pistes d'évolution prioritaires\r\n\r\n1. **Signature ou checksum** : publier un `MANIFEST.sha256` signé GPG, le vérifier avant tout `mv` ou exécution.\r\n2. **`set -euo pipefail`** en tête de script pour faire échouer proprement à la première erreur.\r\n3. **Vérifier `wget`** : code de retour, fichier non vide, shebang présent.\r\n4. **Backup avant écrasement** : conserver la version précédente (`fetch_scripts.sh.bak`) pour pouvoir revenir en arrière.\r\n5. **Option `--dry-run`** pour visualiser sans appliquer.\r\n6. **Filtre regex** sur les noms de fichiers du manifeste pour éviter les traversées de chemin.\r\n7. **Lock file** via `flock` pour éviter les exécutions concurrentes.\r\n\r\nAvec ces ajouts, on passe d'un script « pratique » à un outil de déploiement digne de ce nom — sans rien perdre de sa simplicité initiale."}
\ No newline at end of file
diff --git a/_cache/articles/c8fa250e-d8b5-453a-a06a-799d53c3b6d1.json b/_cache/articles/c8fa250e-d8b5-453a-a06a-799d53c3b6d1.json
deleted file mode 100644
index fe3059c..0000000
--- a/_cache/articles/c8fa250e-d8b5-453a-a06a-799d53c3b6d1.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c8fa250e-d8b5-453a-a06a-799d53c3b6d1","slug":"la-smart-brick-de-lego-quand-la-brique-devient-intelligente","title":"LEGO : La brique qui répond","author":"cedric@abonnel.fr","published":true,"published_at":"2026-01-13 20:26","created_at":"2026-01-13 20:26:53","updated_at":"2026-05-11 22:45:23","revisions":[{"n":1,"date":"2026-05-11 21:54:06","comment":"","title":"LEGO : La brique qui répond"},{"n":2,"date":"2026-05-11 22:45:23","comment":"","title":"LEGO : La brique qui répond"}],"cover":"cover.jpg","files_meta":{"cover.jpg":{"author":"","source_url":"https://thegadgetflow.com/wp-content/uploads/2026/01/LEGO-Interactive-smart-brick-featured-image-1.jpg"},"_thumb_035b34dd014ac80f-635197.jpg":{"author":"","source_url":""},"_thumb_5913d9738c966833-30567.jpg":{"author":"","source_url":""},"_thumb_7d6ba93f6ce840e7-13566.webp":{"author":"","source_url":""},"_thumb_d5dde33b48cd2761-66620.jpg":{"author":"","source_url":""},"_thumb_e99b946f131256b8-49943.jpg":{"author":"","source_url":""},"_thumb_fb5a5b1ffa000d12-30780.png":{"author":"","source_url":""}},"external_links":[{"url":"https://www.begeek.fr/lego-smart-brick-les-briques-de-la-marque-danoise-deviennent-interactives-426477","name":"LEGO Smart Brick : les briques de la marque danoise deviennent interactives","added_at":"2026-05-11 21:47:32","meta":{"mime":"text/html","size":36385,"description":"Avec les Smart Bricks, LEGO transforme chaque construction en une expérience connectée grâce à des capteurs, haut-parleurs et LED intégrés.","og_image":"/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_5913d9738c966833-30567.jpg","site_name":"Begeek","og_type":"article","language":"fr_FR","date":"2026-01-07T13:00:51+00:00","canonical":"https://www.begeek.fr/lego-smart-brick-les-briques-de-la-marque-danoise-deviennent-interactives-426477"}},{"url":"https://www.mac4ever.com/divers/193948-lego-devoile-une-etonnante-brique-intelligente-au-ces-2026","name":"LEGO dévoile une étonnante brique intelligente au CES 2026","added_at":"2026-05-11 21:47:50","meta":{"mime":"text/html","size":121071,"description":"Pour sa première apparition au CES de Las Vegas, LEGO frappe fort avec Smart Play, une nouvelle plateforme qui intègre de l'électronique miniaturisée…","og_image":"/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_7d6ba93f6ce840e7-13566.webp","site_name":"Mac4Ever","og_type":"article","language":"fr_FR","date":"2026-01-06T09:36:39+01:00","canonical":"https://www.mac4ever.com/divers/193948-lego-devoile-une-etonnante-brique-intelligente-au-ces-2026"}},{"url":"https://www.clubic.com/actualite-593794-lego-devoile-smart-play-sa-plus-grosse-innovation-depuis-toujours.html","name":"LEGO dévoile Smart Play, sa plus grosse innovation \"depuis... toujours\" !","added_at":"2026-05-11 21:48:05","meta":{"mime":"text/html","size":251642,"description":"Dans les couloirs du CES de Las Vegas, la marque LEGO a tenu à dévoiler une toute nouvelle brique intelligente : Smart Brick. Une brique qui va se charger de réagir de manière intelligente (et autonome) à son environnement, sans la moindre application ou écran externe.","og_image":"/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_d5dde33b48cd2761-66620.jpg","site_name":"clubic.com","og_type":"article","language":"fr_FR","date":"2026-01-07T09:56:00+01:00","canonical":"https://www.clubic.com/actualite-593794-lego-devoile-smart-play-sa-plus-grosse-innovation-depuis-toujours.html"}},{"url":"https://www.solutions-magazine.com/lego-smart-brick/","name":"LEGO lance sa « smart brick » - Solutions Magazine","added_at":"2026-05-11 21:48:23","meta":{"mime":"text/html","size":582486,"description":"Au CES, Lego a dévoilé un ensemble de nouvelles technologies insérées dans ses futurs jouets. Notamment sa « smart brick »","og_image":"/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_e99b946f131256b8-49943.jpg","site_name":"Solutions Magazine","og_type":"article","language":"fr_FR","date":"2026-01-10T15:56:46+00:00","canonical":"https://www.solutions-magazine.com/lego-smart-brick/"}},{"url":"https://www.lesnumeriques.com/jouet/lego-smart-play-on-a-mis-nos-gros-doigts-sur-la-petite-brique-magique-et-c-est-bluffant-n249358.html","name":"Lego Smart Play : on a mis nos gros doigts sur la petite brique magique, et c'est bluffant ! - Les Numériques","added_at":"2026-05-11 21:48:38","meta":{"mime":"text/html","size":219016,"description":"Présentée il y a quelques jours au CES en exclusivité, la brique Lego connectée Smart Brick s'est dévoilée un peu plus à Paris. Après quelques minutes de démonstration, avouons-le : nous regrettons de ne plus avoir 8 ans pour jouer avec sans scrupule.","keywords":"lego","og_image":"/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_035b34dd014ac80f-635197.jpg","og_type":"article","date":"2026-01-11T06:00:00Z","canonical":"https://www.lesnumeriques.com/jouet/lego-smart-play-on-a-mis-nos-gros-doigts-sur-la-petite-brique-magique-et-c-est-bluffant-n249358.html"}},{"url":"https://www.lego.com/fr-fr/smart-play","name":"Système LEGO® SMART Play™ | Boutique LEGO® officielle FR","added_at":"2026-05-11 21:48:47","meta":{"mime":"text/html","size":1219325,"description":"Voici le système LEGO® SMART Play™, conçu pour stimuler la créativité des enfants. Découvrez cette évolution du jeu LEGO® qui vous répond à l’infini ! Plus d’informations ici","canonical":"https://www.lego.com/fr-fr/smart-play","og_image":"/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_fb5a5b1ffa000d12-30780.png"}}],"seo_title":"","seo_description":"","og_image":"","category":"loisirs","content":"# LEGO : La brique qui répond\n\n## La brique qui répond\n\nÀ première vue c'est une brique LEGO comme une autre. Un parallélépipède de plastique gris, le format classique, deux par quatre tenons sur le dessus. On pourrait la prendre, l'emboîter dans un mur, et ne rien remarquer. Sauf que celle-là parle. Elle fait du bruit, elle clignote, elle sait si vous la secouez ou si vous la posez à plat. À l'intérieur, LEGO a réussi à caser un accéléromètre, un capteur de lumière, un capteur de couleur, un haut-parleur miniature et une puce sur mesure plus petite qu'un seul tenon. C'est la **LEGO Smart Brick**, et elle est arrivée en boutique le 1ᵉʳ mars 2026.\n\nIl faut tout de suite tordre le cou à un malentendu. La Smart Brick, ce n'est pas un Mindstorms. Ce n'est pas du LEGO éducatif, ce n'est pas une plateforme pour apprendre à coder, et on ne programme rien du tout avec. C'est un objet beaucoup plus simple dans son intention : faire en sorte qu'un set LEGO réagisse quand on joue avec. Vous prenez le X-Wing de Luke Skywalker, vous le faites basculer pour décoller, le brique embarquée détecte le mouvement et joue le bruit du moteur. Vous posez la minifigurine de Dark Vador à côté, la brique la reconnaît grâce à un Smart Tag (une petite tuile codée), et elle déclenche la respiration emblématique du Seigneur Sith. C'est tout. Mais c'est déjà beaucoup.\n\nLEGO appelle cet écosystème **Smart Play**. Il repose sur trois éléments. La Smart Brick elle-même, qui est le cerveau et le haut-parleur. Les Smart Tags, des tuiles plates qu'on accroche aux constructions et qui disent à la brique ce qu'elle doit faire à cet endroit (« ici tu joues un bruit de tir laser », « ici tu fais le bruit du réacteur »). Et les Smart Minifigures, des figurines avec un identifiant intégré, que la brique détecte quand on les approche. Le tout communique en local, sans appli obligatoire, sans écran, via un système maison que LEGO a baptisé BrickNet. C'est important : le pari est explicitement de faire de la techno **invisible**, pas de coller un smartphone entre l'enfant et le jouet.\n\nCôté pratique, la brique se recharge sans fil. Elle tient environ deux heures et demie en jeu actif, se met en veille au bout de trois minutes d'inactivité et se réveille quand on la secoue. Au-delà d'une dizaine d'heures de veille, il faut la remettre sur son chargeur. Une application gratuite, **LEGO SMART Assist**, sert à régler le volume, donner un nom à ses briques, gérer plusieurs appareils, et surtout mettre à jour le firmware — parce que oui, une brique LEGO peut maintenant recevoir des mises à jour logicielles. On y est.\n\nPour le lancement, LEGO a choisi Star Wars, et l'offre est un peu plus subtile qu'il n'y paraît. **Huit sets** sortent le 1ᵉʳ mars, mais seulement **trois contiennent réellement une Smart Brick**. Ce sont les coffrets dits *All-In-One*, qui embarquent la brique, son chargeur, des tags et des figurines intelligentes :\n\n- **75421 — Chasseur TIE de Dark Vador** : 69,99 €, le ticket d'entrée.\n- **75423 — Le X-Wing rouge de Luke Skywalker** : 89,99 €.\n- **75427 — Duel dans la salle du trône & A-Wing** : 159,99 €, le plus gros, avec **deux** Smart Bricks.\n\nLes cinq autres sets — Millennium Falcon, Mos Eisley Cantina, AT-ST Endor, hutte de Yoda, Landspeeder de Luke — sont étiquetés Smart Play mais ne contiennent **pas** de brique. Ils embarquent juste des tags et des figurines compatibles. Pour qu'ils s'animent, il faut posséder une brique achetée dans l'un des trois coffrets *All-In-One*, et la déplacer d'un set à l'autre. C'est un choix commercial qu'on peut critiquer : un parent ou un grand-parent qui voit *Smart Play* sur la boîte de la Mos Eisley Cantina à 79,99 € a de quoi être surpris en rentrant à la maison.\n\nGéographiquement, le lancement est restreint. Six pays seulement à l'ouverture : États-Unis, Royaume-Uni, France, Allemagne, Pologne, Australie. Le reste du monde attendra.\n\nPourquoi est-ce intéressant au-delà du cas Star Wars ? Parce que LEGO ne fait pas ça pour vendre trois sets. La marque parle de **plus de vingt brevets** déposés sur la techno, et de la « plus grande évolution du système LEGO depuis l'introduction de la minifigurine en 1978 ». Le ton est ambitieux, et il y a déjà des rumeurs de déclinaisons sur les gammes Pokémon et Animal Crossing. Si le pari réussit, on parle d'une plateforme qui peut s'étendre à toute la production LEGO sur dix ou vingt ans. Si elle échoue, ce sera la deuxième tentative ratée après les Mindstorms et la gamme Boost, dans la longue liste des essais LEGO pour marier l'électronique au plastique.\n\nLe point qui me semble vraiment réussi, c'est la philosophie sans écran. Là où la plupart des jouets connectés exigent une tablette pour fonctionner, où l'enfant finit en pratique à regarder un iPad plutôt qu'à jouer avec l'objet physique, LEGO a fait le choix inverse : l'application existe mais elle est facultative, toute l'interaction se passe entre les mains et les briques. C'est moins spectaculaire dans une démo marketing, mais c'est probablement plus juste pour des gamins de huit ans.\n\nReste à voir ce que ça donne en vrai, sur le tapis du salon, après six mois d'utilisation, quand la batterie sera moins fringante et que la nouveauté se sera émoussée. C'est toujours là que se joue la vraie partie pour ce genre de produit. Mais sur le papier, et c'est rare, LEGO a sorti quelque chose qui ne ressemble à rien d'autre.","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/c9796eff-43b9-4e51-b613-8eec21a8c352.json b/_cache/articles/c9796eff-43b9-4e51-b613-8eec21a8c352.json
deleted file mode 100644
index cde33f7..0000000
--- a/_cache/articles/c9796eff-43b9-4e51-b613-8eec21a8c352.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"c9796eff-43b9-4e51-b613-8eec21a8c352","slug":"gitea-prerequis","title":"gitea, prérequis","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-07 10:57:33","created_at":"2025-11-07 10:57:33","updated_at":"2025-11-07 10:57:33","revisions":[],"cover":"","category":"informatique","content":"# gitea, prérequis\n\nVoici les **pré-requis système** (processeur, mémoire, etc.) pour installer **Gitea** sur une distribution **Debian**\n\n---\n\n### **1. Exigences minimales**\n\nCes valeurs sont suffisantes pour un petit déploiement personnel ou une petite équipe.\n\n| Ressource | Minimum recommandé | Détails |\n| ------------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------- |\n| **CPU** | 2+ vCPU / cœur | Gitea est léger, même un petit processeur type Atom ou 1 vCPU cloud suffit. |\n| **RAM** | 1 Go ou + | Le binaire Go est efficace. 1 Go est sûr pour un usage personnel. 2 Go ou plus (pour plusieurs utilisateurs) |\n| **Stockage** | ≥ 1 Go libre | Le binaire Gitea fait ~100 Mo, plus les dépôts Git (prévoir plus selon le nombre de projets). |\n| **OS** | Debian 12 (Bookworm) ou Debian 13 | Gitea fournit des binaires compatibles. |\n| **Base de données** | SQLite, MariaDB/MySQL, PostgreSQL | SQLite pour test/local, PostgreSQL ou MariaDB en prod. |\n| **Reverse proxy** | nginx, Caddy, Apache ... avec HTTPS |\n| **Utilisateur système** | `git` (non root) pour exécuter le service |\n\n---\n\n### **2. Vérification rapide des ressources**\n\nTu peux vérifier ta machine avec :\n\n```bash\nlscpu | grep \"Model name\"\nfree -h\ndf -h /\n```\n","featured":false,"files_meta":[],"external_links":[],"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/cb93c086-4b6f-4c32-82a5-208adb14d0bf.json b/_cache/articles/cb93c086-4b6f-4c32-82a5-208adb14d0bf.json
deleted file mode 100644
index 69cea1b..0000000
--- a/_cache/articles/cb93c086-4b6f-4c32-82a5-208adb14d0bf.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cb93c086-4b6f-4c32-82a5-208adb14d0bf","slug":"esp8266-panorama-du-soc-des-modules-et-des-cartes-de-developpement","title":"ESP8266 : panorama du SoC, des modules et des cartes de développement","author":"cedric@abonnel.fr","published":true,"published_at":"2022-01-28 10:47","created_at":"2022-01-28 10:47:26","updated_at":"2026-05-13 18:32:46","revisions":[{"n":1,"date":"2026-05-13 18:32:46","comment":"Titre modifié, contenu modifié","title":"Spécifications de l'ESP8266"}],"cover":"","files_meta":{"20220128-104522.png":{"author":"","source_url":""},"ai-thinker.png":{"author":"","source_url":""},"espressif-logo-pratik-panda-clients-2.png":{"author":"","source_url":""},"nodemcuv3.0-pinout.jpg":{"author":"","source_url":""}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Électronique","content":"# ESP8266 : panorama du SoC, des modules et des cartes de développement\n\n## Présentation\n\nL'**ESP8266** est un microcontrôleur économique intégrant nativement une interface **Wi-Fi 2,4 GHz** (IEEE 802.11 b/g/n) et une pile **TCP/IP**. Il est conçu et commercialisé par **Espressif Systems**, une société chinoise basée à Shanghai et présente à l'international (États-Unis, Inde, République tchèque, Brésil, Singapour).\n\nLancé fin **2014**, l'ESP8266 a connu un succès très rapide grâce à un rapport prix / fonctionnalités sans précédent : pour quelques euros, il met à disposition un microcontrôleur 32 bits cadencé à 80 MHz et une connectivité Wi-Fi complète. Sa version la plus connue, l'**ESP-01**, est devenue la porte d'entrée standard vers l'IoT pour le grand public.\n\nLe SoC a depuis été complété par la famille **ESP32** (cœur Xtensa LX6/LX7 dual-core, Bluetooth en plus du Wi-Fi), puis par les **ESP32-Cx / ESP32-Sx / ESP32-Hx**, mais l'ESP8266 reste massivement utilisé pour les projets simples et peu gourmands.\n\n## Trois niveaux à ne pas confondre\n\nAvant d'entrer dans les spécifications, une clarification utile sur le vocabulaire — fréquemment mélangé dans la documentation amateur :\n\n| Niveau | Définition | Exemples |\n|---|---|---|\n| **SoC** *(System on Chip)* | Le circuit intégré nu, vendu par Espressif. | ESP8266EX |\n| **Module** | Un petit PCB qui embarque le SoC, sa flash, son antenne et un brochage standardisé. | ESP-01, ESP-12E, ESP-WROOM-02 |\n| **Carte de développement** | Une carte plus large qui embarque un module + un USB-série + un régulateur + des boutons + des broches au pas standard. | NodeMCU, WeMos D1 mini, Adafruit HUZZAH |\n\nL'ESP-01 est donc un *module* (vendu par AI-Thinker), pas un SoC ni une carte de développement à proprement parler.\n\n## Spécifications techniques du SoC ESP8266EX\n\n### Processeur\n\n- cœur **Tensilica Xtensa LX106**, RISC 32 bits ;\n- cadencé à **80 MHz** par défaut, **160 MHz** en mode overclock logiciel.\n\n### Mémoire\n\n- **32 Kio** d'IRAM (instructions) ;\n- **32 Kio** de cache d'instructions ;\n- **80 Kio** de RAM utilisateur ;\n- **16 Kio** de RAM système réservée à l'ETS ;\n- pas de ROM ni de flash interne : le code est chargé depuis une **flash SPI externe** (QSPI) pouvant atteindre **16 Mio**, généralement comprise entre 512 Kio et 4 Mio sur les modules vendus.\n\n### Radio Wi-Fi\n\n- norme **IEEE 802.11 b/g/n** (2,4 GHz uniquement) ;\n- chiffrement **WEP, WPA, WPA2** (mais pas WPA3) ;\n- modes **station**, **point d'accès** et **mixte (STA+AP)** ;\n- bloc RF intégré (TR switch, balun, LNA, PA, matching network) — le module n'a besoin que de son antenne.\n\n### Périphériques\n\n- **17 GPIO** théoriques au niveau du SoC (mais beaucoup sont préemptées par la flash SPI ou non exposées sur les modules courants) ;\n- **SPI** matériel ;\n- **I²C** logiciel (bit-banging, pas de contrôleur dédié) ;\n- **I²S** avec DMA ;\n- **UART** matérielle complète sur des broches dédiées ; un second UART en émission seule peut être activé sur GPIO2 ;\n- un **ADC 10 bits** unique, par approximations successives, lisible sur la broche TOUT/ADC0.\n\n### Alimentation\n\n- tension d'alimentation **3,0 à 3,6 V** (nominal 3,3 V) ;\n- pics de courant pouvant atteindre **environ 300 mA** lors des émissions Wi-Fi.\n\n## Modules à base d'ESP8266\n\nDeux familles principales coexistent. AI-Thinker a inondé le marché avec la série « ESP-0x / ESP-1x », pendant qu'Espressif a publié sa propre gamme « ESP-WROOM » plus tardive.\n\n### Modules AI-Thinker\n\n\n\nAI-Thinker a produit une longue série de modules, qui se distinguent essentiellement par leur **facteur de forme**, leur **antenne** (PCB, céramique, IPEX), leur **nombre de broches exposées** et la **taille de la flash** soudée.\n\nLes plus connus :\n\n| Module | Particularités |\n|---|---|\n| **ESP-01** | Le plus compact, 8 broches, antenne PCB, 1 Mo de flash sur les versions noires. Le plus économique, mais GPIO très limités. |\n| **ESP-01S** | Version améliorée de l'ESP-01, généralement 1 Mo de flash et LED câblée différemment. |\n| **ESP-07** | 16 broches, antenne céramique + connecteur IPEX pour antenne externe, blindage RF. |\n| **ESP-12E / ESP-12F / ESP-12S** | Format SMD 22 broches, blindé, antenne PCB. Base de la quasi-totalité des cartes NodeMCU et WeMos. |\n\nLes autres références (ESP-02 à ESP-11, ESP-13, ESP-14) existent mais ont peu percé en pratique. La plupart sont aujourd'hui difficiles à trouver et n'ont pas d'intérêt particulier face aux ESP-12x.\n\n### Modules Espressif\n\n\n\nEspressif a publié sa propre gamme « WROOM » certifiée FCC/CE, souvent privilégiée pour les produits commerciaux :\n\n| Module | Antenne |\n|---|---|\n| **ESP-WROOM-02** | PCB |\n| **ESP-WROOM-02D** | PCB (version révisée) |\n| **ESP-WROOM-02U** | Connecteur U.FL pour antenne externe |\n| **ESP-WROOM-S2** | Variante avec SDIO |\n\nListe détaillée et historique des modules sur Wikipédia : \n\n## Cartes de développement\n\nLes cartes de développement embarquent un module ESP8266 et tout le nécessaire pour démarrer immédiatement : convertisseur USB-série, régulateur 3,3 V, boutons RESET et FLASH, broches au pas de 2,54 mm, parfois LED utilisateur.\n\n### NodeMCU\n\n\n\nLa carte la plus populaire de la famille. Elle existe en plusieurs révisions :\n\n- **v0.9** : module ESP-12, format « large » 47 mm de large ;\n- **v1.0** (DEVKIT v1.0) : module ESP-12E, USB-série CP2102, format normalisé ;\n- **v3** (« LoLin » et clones) : module ESP-12E ou ESP-12F, USB-série CH340. C'est la version la plus répandue, bien que la numérotation « v3 » soit purement commerciale (non officielle).\n\nLa carte expose la plupart des GPIO du module sous des noms **D0 à D8** propres à NodeMCU, qui ne correspondent **pas** directement aux numéros GPIO de l'ESP8266. Une table de correspondance est indispensable :\n\n| Étiquette NodeMCU | GPIO ESP8266 |\n|---|---|\n| D0 | GPIO16 |\n| D1 | GPIO5 |\n| D2 | GPIO4 |\n| D3 | GPIO0 |\n| D4 | GPIO2 (LED interne) |\n| D5 | GPIO14 |\n| D6 | GPIO12 |\n| D7 | GPIO13 |\n| D8 | GPIO15 |\n\n### WeMos D1 mini\n\nFormat compact (34 × 25 mm), module ESP-12F, USB-série CH340. Compatible mécaniquement avec un large écosystème de **shields** empilables (relais, OLED, batterie, capteur DHT…). C'est aujourd'hui la carte la plus utilisée pour des projets domotiques.\n\n### Adafruit HUZZAH\n\nCarte haut de gamme avec module ESP-12E, régulateur 500 mA, niveau logique compatible avec une logique 5 V via résistances de pull-up. Idéale pour prototyper de manière fiable, mais plus chère et nécessite un FTDI externe sur la version sans USB.\n\n### Espressif ESP-12E (module)\n\nLe module ESP-12E n'est pas une carte de développement à proprement parler : c'est le module SMD soudé sur la majorité des NodeMCU et WeMos. Son brochage est cependant utile à connaître lorsqu'on veut concevoir sa propre carte autour de lui.\n\n\n\n### DOIT ESP-12F\n\nCarte de prototypage à base de module ESP-12F, comparable à une NodeMCU v3, parfois vendue sous le nom **DOIT DevKit V1**.\n\n## Pour aller plus loin\n\n- [L'ESP-01 : présentation et premiers pas](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas)\n- [Premier programme ESP-01 : afficher les informations système](https://varlog.a5l.fr/post/esp-01-premier-programme)\n- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)\n- Documentation officielle Espressif : \n- Article Wikipédia (en anglais), plus complet : \n```\n","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18.json b/_cache/articles/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18.json
deleted file mode 100644
index 0b1e585..0000000
--- a/_cache/articles/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cd0a1ad7-7559-40e0-96b3-0bfbf4734d18","slug":"forum-alpinux","title":"Forum Alpinux","author":"cedric@abonnel.fr","published":true,"published_at":"2025-04-04 07:45","created_at":"2025-04-04 07:45:00","updated_at":"2026-05-12 09:42:07","revisions":[],"cover":"cover.png","files_meta":{"571f5db24ca3ff68-74792.png":{"author":"Alpinux","source_url":""}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"linux","content":"# Forum Alpinux\n\nHier soir se tenait le *Repair du Libre* et le *Forum Alpinux* à Chambéry.\n\nLors du *Repair du Libre*, une personne est venue pour faire diagnostiquer son ordinateur. Trois points ont été vérifiés : la batterie, le disque dur et l’espace de stockage. La batterie, âgée de plus de 4 ans, était hors service. En revanche, le disque dur était en bon état selon *SmartControl*, et l’espace disque disponible était suffisant.\n\nNous avons également tenté d’installer **Linux Mint 22.1** sur un PC sans UEFI, mais l’opération s’est révélée complexe. L’installateur *Ubiquity* prépare le disque en mode GPT, ce qui n’est pas compatible avec une machine équipée d’un BIOS classique, entraînant l’échec de l’installation.\n\nPar ailleurs, un autre ordinateur présentait un problème de connexion Wi-Fi : le pilote ne se chargeait pas à cause de *Secure Boot*. Une fois ce dernier désactivé, la connexion devrait fonctionner normalement.\n\nEnfin, avec l’aide de Brice, nous avons échangé autour d’*OpenStreetMap*, *StreetComplete* et *OSMAND~* pendant le *Forum Alpinux*. Une contribution collective via *StreetComplete* est prévue en juin par Alpinux à Chambéry.\n","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/cfe738e9-7ac2-4c7e-9205-dab4957835c6.json b/_cache/articles/cfe738e9-7ac2-4c7e-9205-dab4957835c6.json
deleted file mode 100644
index c4befc7..0000000
--- a/_cache/articles/cfe738e9-7ac2-4c7e-9205-dab4957835c6.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"cfe738e9-7ac2-4c7e-9205-dab4957835c6","slug":"preparation-du-raspberry-pi","title":"Décoder les infos de la TIC et les communiquer","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-19 06:48","created_at":"2025-11-19 06:48:01","updated_at":"2026-05-12 17:38:19","revisions":[{"n":1,"date":"2026-05-12 17:38:19","comment":"Contenu modifié","title":"Décoder les infos de la TIC et les communiquer"}],"cover":"","files_meta":{"dummy.png":{"author":"","source_url":""}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Électronique","content":"# Décoder les infos de la TIC et les communiquer\n\n## Choix du Raspberry Pi\n\nL'objectif est de récupérer automatiquement et à intervalles réguliers les informations émises par un compteur Linky, puis de les rendre accessibles depuis l'extérieur du Raspberry Pi.\n\nTrois prérequis matériels s'imposent donc :\n\n- une **connexion réseau**, pour exposer ou transmettre les données collectées ;\n- un **espace de stockage**, suffisant pour l'OS, les outils et l'historique des relevés ;\n- une **liaison série**, pour dialoguer avec la sortie TIC du compteur.\n\nLe choix s'est porté sur un **Raspberry Pi 3**, qui couvre ces trois besoins sans surcoût ni complexité supplémentaire. Le stockage est assuré par une carte SD, la liaison série est exposée sur le port GPIO, et la connectivité réseau bénéficie d'un atout pratique : l'armoire de brassage de la maison se trouve à quelques mètres du compteur électrique, ce qui permet d'envisager un raccordement filaire fiable plutôt qu'un lien sans fil.\n\nCôté logiciel, le système retenu est **Raspberry Pi OS** (anciennement Raspbian), recommandé par défaut sur cette plateforme. Cette distribution dérivée de Debian apporte tout l'écosystème GNU/Linux nécessaire : pile réseau TCP/IP, accès distant par SSH, synchronisation horaire NTP, gestion de bases de données, serveur web, interpréteurs PHP et Python. Autant de briques qui serviront aux étapes ultérieures du projet.\n\n## Câblage\n\nLe compteur Linky émet la trame TIC sous forme d'un **signal modulé en ASK** (Amplitude Shift Keying). Ce signal n'est pas directement exploitable par l'UART du Raspberry Pi, qui attend un niveau logique TTL stable.\n\nUn **démodulateur ASK** est donc intercalé entre le compteur et le Raspberry Pi. Son rôle est de récupérer la porteuse modulée et de restituer en sortie un signal binaire TTL propre, directement lisible par le port série.\n\nLa chaîne complète est la suivante :\n\n```\nCompteur Linky → Démodulateur ASK → UART du Raspberry Pi\n```\n\nLe câblage côté Raspberry Pi se résume à trois fils :\n\n| Broche | Signal | Rôle |\n|---|---|---|\n| Pin 1 | **3V3** | Alimentation du démodulateur |\n| Pin 6 | **GND** | Masse commune |\n| Pin 10 | **RX (GPIO15)** | Lecture de la sortie TTL du démodulateur |\n\n### Schéma de câblage\n\n```\n ┌─────────────────────────┐\n │ Compteur Linky │\n │ sortie TIC (ASK) │\n └───────────┬─────────────┘\n │ signal TIC modulé\n ▼\n ┌─────────────────────────┐\n │ Démodulateur ASK │\n │ │\n │ IN ← TIC data │\n │ GND ← TIC GND │\n │ │\n │ VCC ─────────────────────► Pin 1 (3V3)\n │ GND ─────────────────────► Pin 6 (GND)\n │ OUT ─────────────────────► Pin 10 (RX / GPIO15)\n └─────────────────────────┘ Raspberry Pi 3\n```\n\n## Installation de l'OS\n\nLe déploiement de Raspberry Pi OS sur la carte SD suit la procédure standard décrite dans l'article [à compléter]. Un point d'attention : **activer le service SSH** dès la préparation de l'image, faute de quoi aucun accès distant ne sera possible au premier démarrage.\n\nUne fois le Raspberry Pi mis sous tension et raccordé au réseau, son adresse IP n'est pas connue à l'avance. Un balayage du réseau local avec `nmap` permet de l'identifier :\n\n```bash\nnmap -sn 192.168.1.0/24\n```\n\n> Note : la cible passée à `nmap` est l'adresse du réseau (`.0/24`), pas celle de la passerelle. Le `/24` indique le masque de sous-réseau et délimite la plage scannée.\n\nUne fois l'adresse repérée, la connexion s'établit avec le compte `pi` et le mot de passe par défaut `raspberry` :\n\n```bash\nssh pi@192.168.1.68\n```\n\n> Premier réflexe sécurité : changer immédiatement le mot de passe du compte `pi` avec `passwd`, voire désactiver ce compte au profit d'un utilisateur dédié. Les identifiants par défaut sont connus de tous les scans automatisés.\n","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/d6571053-2261-4e6e-ab39-3c327ff2e8e4.json b/_cache/articles/d6571053-2261-4e6e-ab39-3c327ff2e8e4.json
deleted file mode 100644
index e4a9643..0000000
--- a/_cache/articles/d6571053-2261-4e6e-ab39-3c327ff2e8e4.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"d6571053-2261-4e6e-ab39-3c327ff2e8e4","slug":"les-strategies-de-migration-4g","title":"Les stratégies de migration 4G","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-05 08:43:31","created_at":"2025-11-05 08:43:31","updated_at":"2025-11-05 08:43:31","revisions":[],"cover":"","category":"télécom","content":"# Les stratégies de migration 4G\n\n### Pression progressive sur la 3G\n\nDepuis le déploiement massif de la 4G, les opérateurs français ont mis en place des **stratégies ciblées pour inciter les utilisateurs à migrer depuis la 3G**. Même lorsque la 3G suffisait pour des usages quotidiens (email, surf, visioconférence légère), plusieurs leviers ont été utilisés :\n\n* **Bridage progressif des débits 3G** : réduction systématique des vitesses en itinérance ou sur réseaux saturés.\n* **Promotion active de la 4G** : campagnes marketing, forfaits 4G plus attractifs.\n* **Optimisation du spectre** : récupération des fréquences 3G (900/1800/2100 MHz) pour augmenter la capacité 4G.\n* **Réduction du coût par bit** : la 4G transmet plus de données avec un coût énergétique et matériel inférieur à la 3G, incitant les opérateurs à concentrer les ressources sur la 4G.\n\nCes stratégies combinent aspects **techniques, économiques et commerciaux** pour rendre la migration quasi inévitable.\n\n---\n\n### Cas opérateurs : Free, Orange, SFR, Bouygues\n\n| Opérateur | 3G moyen (Mbit/s) | 4G moyen (Mbit/s) |\n| --------- | ----------------- | ----------------- |\n| Free | 0,384 | 50–150 |\n| Orange | 0,5–1 | 60–200 |\n| SFR | 0,5 | 50–150 |\n| Bouygues | 0,5 | 50–150 |\n\n* **Free Mobile** : itinérance 3G bridée à 384 kbit/s pour les abonnés hors 4G, couverture 4G déjà très étendue.\n* **Orange** : maintien de la 3G dans les zones rurales, mais réduction progressive des débits pour favoriser la 4G.\n* **SFR et Bouygues** : bridage partiel et incitations tarifaires à passer à la 4G.\n\n> Le tableau montre l’écart spectaculaire entre la 3G bridée et les débits moyens 4G, un argument indirect pour pousser les abonnés vers la nouvelle génération.\n\n---\n\n### Graphique suggéré : part des abonnés 4G vs 3G (2015–2025)\n\n```mermaid\n%% Simulation de la part des abonnés 3G vs 4G\n%% Remarque : données représentatives\npie\n title Part des abonnés 3G vs 4G (France)\n \"3G 2015\": 70\n \"4G 2015\": 30\n \"3G 2020\": 25\n \"4G 2020\": 75\n \"3G 2025\": 5\n \"4G 2025\": 95\n```\n\n* Ce graphique illustre la **migration progressive** : alors que la 3G dominait en 2015, elle devient marginale en 2025.\n* La stratégie opérateur a donc porté ses fruits : libération de spectre et concentration des ressources sur la 4G.\n\n---\n\n### Narratif\n\nMême si la 3G suffisait pour de nombreux usages quotidiens, **les opérateurs ont utilisé le bridage et la mise en avant de la 4G comme leviers indirects pour forcer la migration**.\n\n* **Libération du spectre** : les fréquences 3G peuvent être utilisées pour la 4G et préparer la 5G.\n* **Réduction des coûts** : maintenir la 3G est plus coûteux que concentrer les investissements sur la 4G.\n* **Pression subtile sur l’utilisateur** : le simple fait de ralentir la 3G encourage la migration sans hausse tarifaire directe.\n\n> En pratique, cela signifie que la 4G n’est pas seulement une amélioration technique, mais aussi un outil stratégique pour redéployer les ressources et moderniser le réseau.\n\n","featured":false,"files_meta":[],"external_links":[],"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/da1b3cec-980d-458c-9d2b-0c950d278f22.json b/_cache/articles/da1b3cec-980d-458c-9d2b-0c950d278f22.json
deleted file mode 100644
index 5ff7f6d..0000000
--- a/_cache/articles/da1b3cec-980d-458c-9d2b-0c950d278f22.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"da1b3cec-980d-458c-9d2b-0c950d278f22","slug":"domotique-les-vrais-problemes-en-domotique-zigbee-home-assistant","title":"Domotique : les vrais problèmes en domotique Zigbee & Home Assistant","author":"cedric@abonnel.fr","published":true,"published_at":"2026-05-22 18:00:00","created_at":"2026-05-22 18:00:00","updated_at":"2025-05-01 06:11:58","revisions":[],"cover":"","category":"domotique","content":"# Domotique : les vrais problèmes en domotique Zigbee & Home Assistant\n\nJe suis en train de préparer une vidéo un peu différente de celle que j’ai faite sur *Zigbee, Zigbee2MQTT et Home Assistant*. Cette fois, je veux parler des **problèmes concrets** que je rencontre **au quotidien**, dans une installation domotique qui fonctionne… mais pas toujours comme prévu.\n\nPar exemple, mon antenne Zigbee — une clé que j’utilise avec Zigbee2MQTT — se **déconnecte régulièrement**, toutes les 5 à 15 minutes. C’est intermittent, difficile à diagnostiquer, et surtout très frustrant. Parfois, elle réapparaît toute seule. D’autres fois, elle oblige à redémarrer le service ou la machine. Et évidemment, quand le Zigbee tombe, **toute la chaîne domotique en dépend** : capteurs inaccessibles, automatisations qui ne se déclenchent plus, etc.\n\nJe parlerai aussi des **problèmes côté serveur**, comme certaines **mises à jour** de Home Assistant ou d’addons qui ne se passent pas bien : dépendances cassées, redémarrages partiels, ou intégrations qui ne répondent plus comme avant. Ce sont des situations qu’on rencontre tôt ou tard quand on auto-héberge, surtout dans un système évolutif et modulaire comme Home Assistant.\n\nProblèmes coté objets connectés : \n* pile HS\n* valeurs incomplètes : il manque par exemple la puissance instantanée\n* valeurs incorrectes : la valeur retournée n'est plus du tout correcte (il fait 9°C dehors et la capteur indique -1°), l'energie totale consommée passe de 1234 kW à 950 kW\n* répondant de l'objet connecté : l'action n'est pas transmise ou avec avec beaucoup de retard à l'objet connecté quand l'objet de perd pas le réseau. Résolu avec la configuration de Zigbee2MQTT.\n* perte de réseau : peut poser des problème lorsqu'on pilote des radiateurs\n\nOutils nécessaires :\n* ssh\n* multimètre\n\nL’objectif de cette vidéo, ce n’est pas de me plaindre ni de critiquer les outils que j’utilise. Au contraire. J’ai choisi cette approche justement parce qu’elle me laisse la main. Mais je veux **montrer aussi la réalité terrain**, au-delà des démonstrations propres et des installations idéales. Parce que ce sont dans ces moments-là — quand on cherche, qu’on teste, qu’on tâtonne — qu’on apprend vraiment comment tout fonctionne.\n\nEt si je partage ça, c’est aussi pour que **d’autres qui rencontrent les mêmes soucis puissent comparer, proposer, ou tout simplement se rassurer**. Ce n’est pas parfait, mais ça tourne. Et parfois, savoir qu’on n’est pas seul à rencontrer un bug, c’est déjà beaucoup.","featured":false,"files_meta":[],"external_links":[],"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/da406813-bf15-4f4e-a700-2752550224bb.json b/_cache/articles/da406813-bf15-4f4e-a700-2752550224bb.json
deleted file mode 100644
index 704a3be..0000000
--- a/_cache/articles/da406813-bf15-4f4e-a700-2752550224bb.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"da406813-bf15-4f4e-a700-2752550224bb","slug":"quand-la-3g-suffisait-et-qu-on-vous-fait-basculer","title":"Quand la 3G suffisait… et qu’on vous fait basculer","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-05 08:38:25","created_at":"2025-11-05 08:38:25","updated_at":"2025-11-05 08:38:25","revisions":[],"cover":"","category":"télécom","content":"# Quand la 3G suffisait… et qu’on vous fait basculer\n\nUne plongée scientifique et technologique dans l’évolution des réseaux mobiles et la stratégie des opérateurs.\n\n---\n\n## Introduction\n\n> En 2015, votre 3G suffisait pour le télétravail, la visioconférence et le streaming léger. Aujourd’hui, même pour un simple email, certaines zones semblent plus lentes qu’avant.\n\nL’histoire des télécommunications mobiles est jalonnée de révolutions techniques. Chaque génération de réseau – de la 2G à la 5G – a apporté des débits supérieurs, des latences réduites et de nouveaux usages. Pourtant, derrière la façade technologique, une stratégie commerciale se dessine : la **migration forcée** des utilisateurs vers les nouvelles générations. Ce dossier examine comment la 3G, la 4G et la 5G se succèdent, comment les opérateurs orchestrent le passage d’une technologie à l’autre, et quels impacts cela a sur l’expérience utilisateur.\n\n---\n\n## La 3G : une technologie encore performante… bridée par les opérateurs\n\n### Définition et usages\n\nLa 3G (UMTS/HSPA) a marqué un saut qualitatif par rapport à la 2G. Développée à la fin des années 1990 et déployée massivement à partir de 2004, elle permettait :\n\n* des débits théoriques de 384 kbit/s jusqu’à 42 Mbit/s pour les variantes HSPA+ ;\n* des applications comme le surf web, la messagerie instantanée, les appels VoIP et la visioconférence légère ;\n* une latence moyenne de 150–200 ms, suffisante pour la plupart des usages bureautiques.\n\nPour l’utilisateur lambda, la 3G suffisait amplement. Pourtant, à partir de 2016–2017, certains opérateurs ont commencé à **réduire volontairement les performances**.\n\n### Exemple concret : Free Mobile\n\nFree Mobile, en itinérance sur le réseau Orange, a progressivement **bridé les débits 3G** :\n\n| Année | Débit descendant | Débit montant |\n| ----- | ---------------- | ------------- |\n| 2016 | ~5 Mbit/s | 0,5–1 Mbit/s |\n| 2017 | ~1 Mbit/s | 0,5 Mbit/s |\n| 2019 | 768 kbit/s | 384 kbit/s |\n| 2020 | 384 kbit/s | 384 kbit/s |\n\n> Source : [01net – Free Mobile et bridage 3G](https://www.01net.com/actualites/free-mobile-l-itinerance-3g-orange-sera-plus-lente-des-le-1er-janvier-avant-de-disparaitre-1833059.html)\n\nLes utilisateurs constatent alors que leur expérience, auparavant fluide, devient frustrante : ralentissement du web, vidéos qui ne se chargent pas correctement, visioconférences de qualité médiocre.\n\n### Pourquoi un bridage ?\n\nLe bridage de la 3G s’explique par plusieurs facteurs :\n\n1. **Refarming du spectre** : libérer les fréquences 900/1800/2100 MHz pour la 4G et la 5G ;\n2. **Coût d’entretien** : maintenir un réseau 3G coûteux pour des utilisateurs minoritaires n’est plus rentable ;\n3. **Incitation à migrer** : les abonnés passent naturellement aux nouvelles technologies pour profiter de meilleurs débits.\n\n**Schéma suggéré :** flux de données et coût par bit en 3G vs 4G.\n\n---\n\n## La 4G : la révolution nécessaire\n\n### Définition technique\n\nLa 4G, ou LTE (Long Term Evolution), est une avancée majeure :\n\n* Débits théoriques : 100 Mbit/s → 1 Gbit/s ;\n* Latence : 30–50 ms ;\n* Architecture optimisée : eNodeB remplace le contrôleur RNC de la 3G pour réduire les goulots d’étranglement ;\n* Utilisations : streaming HD, cloud computing, jeux en ligne, IoT.\n\n> La 4G a donc transformé l’expérience mobile et a rendu certaines limitations 3G plus visibles que jamais.\n\n### Stratégies de migration\n\nLes opérateurs incitent à la migration par :\n\n* le **bridage des anciennes générations** ;\n* la publicité sur les débits 4G/5G ;\n* le lancement de forfaits “4G-only”.\n\n| Opérateur | 3G moyen (Mbit/s) | 4G moyen (Mbit/s) |\n| --------- | ----------------- | ----------------- |\n| Free | 0,384 | 50–150 |\n| Orange | 0,5–1 | 60–200 |\n| SFR | 0,5 | 50–150 |\n| Bouygues | 0,5 | 50–150 |\n\n> Graphique suggéré : part des abonnés 4G vs 3G (2015–2025).\n\n---\n\n## La 5G : promesse et réalité\n\n### Les promesses\n\n* Débits : 100 Mbit/s → 10 Gbit/s selon fréquence et densité d’antennes ;\n* Latence ultra faible : 1–10 ms ;\n* Fréquences : 700 MHz → 26 GHz (mmWave) ;\n* Usages : cloud gaming, véhicules autonomes, IoT à grande échelle.\n\n### L’expérience utilisateur\n\nMême scénario qu’avec la 3G : certaines zones restent en 4G bridée, incitant les utilisateurs à passer à la 5G. La promesse de la 5G ne se réalise pleinement que dans les zones très denses ou les zones pilotes.\n\n**Schéma suggéré :** architecture 4G vs 5G.\n\n---\n\n## Conséquences pour l’utilisateur\n\n* **Scénarios pratiques :** visioconférence, streaming, cloud computing, IoT ;\n* **Expérience variable selon réseau :** frustration sur 3G bridée, fluidité sur 4G/5G ;\n* **Témoignages utilisateurs :** Reddit, forums français, témoignages directs.\n\n> “Dès qu’on tombe en 3G, rien ne charge correctement… le réseau est volontairement dégradé.” – Reddit\n\n---\n\n## Synthèse scientifique\n\n| Génération | Débit théorique | Latence | Couverture | Usages possibles | Coût par bit | Bridage existant |\n| ---------- | ---------------------- | ---------- | ---------- | -------------------------------------- | ------------ | ---------------------- |\n| 3G | 384 kbit/s → 42 Mbit/s | 150–200 ms | Très large | Email, surf, visio légère | Élevé | Itinérance bridée Free |\n| 4G | 100 Mbit/s → 1 Gbit/s | 30–50 ms | Large | Streaming HD, jeux, cloud | Moyen | Bridage minoritaire |\n| 5G | 100 Mbit/s → 10 Gbit/s | 1–10 ms | Variable | IoT, cloud gaming, véhicules autonomes | Faible | Pas encore |\n\n> Le bridage apparaît comme une stratégie commerciale autant qu’une conséquence technique, visant à préparer l’utilisateur à migrer vers de nouvelles technologies.\n\n---\n\n## Perspectives et conseils\n\n* Vérifier la couverture et la technologie disponible selon votre zone ;\n* Questionner son opérateur :\n\n 1. Suis-je sur le réseau propre ou en itinérance ?\n 2. Quels sont les débits effectifs en 3G et 4G ?\n 3. Quand la 3G sera-t-elle désactivée ?\n* Anticiper le passage à la 5G pour certains usages exigeants (IoT, cloud gaming, télétravail intensif).\n\n> Vous pouvez encore profiter de votre 3G… mais à quel prix ?\n\n---\n\n## Références principales\n\n1. [01net – Free Mobile et bridage 3G](https://www.01net.com/actualites/free-mobile-l-itinerance-3g-orange-sera-plus-lente-des-le-1er-janvier-avant-de-disparaitre-1833059.html)\n2. [Univers Freebox – Bridage 3G](https://www.universfreebox.com/article/47917/Free-Mobile-continue-de-brider-l-itinerance-3G-Orange)\n3. [ARCEP – Gestion spectre et couverture](https://www.arcep.fr/)\n4. Free Mobile – Fiche information standardisée 2020 ([PDF](https://mobile.free.fr/docs/fis/Fiche_information_standardisee_2020-12-15.pdf))\n","featured":false,"files_meta":[],"external_links":[],"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/ddb53aae-7214-4e3c-8af5-e42da60d8429.json b/_cache/articles/ddb53aae-7214-4e3c-8af5-e42da60d8429.json
deleted file mode 100644
index 8be2d8d..0000000
--- a/_cache/articles/ddb53aae-7214-4e3c-8af5-e42da60d8429.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"ddb53aae-7214-4e3c-8af5-e42da60d8429","slug":"kobo-elipsa-2e-le-cahier-a4-numerique-qu-on-attendait-a-quelques-details-pres","title":"Kobo Elipsa 2E : le cahier A4 numérique qu'on attendait, à quelques détails près","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-09 12:07","created_at":"2025-11-09 12:07:00","updated_at":"2026-05-12 01:43:39","revisions":[{"n":1,"date":"2026-05-12 01:43:39","comment":"","title":"Kobo Elipsa 2E : le cahier A4 numérique qu'on attendait, à quelques détails près"}],"cover":"cover.jpg","files_meta":{"cover.jpg":{"author":"","source_url":"https://fwd.nl/app/uploads/Kobo-Elipsa-2E-620x410.jpg"}},"external_links":[{"url":"https://fwd.nl/app/uploads/Kobo-Elipsa-2E-620x410.jpg","name":"Kobo Eclipse","added_at":"2026-05-12 01:42:43","meta":{"mime":"image/jpeg","size":48877,"width":620}}],"seo_title":"","seo_description":"","og_image":"","category":"loisirs","content":"# Kobo Elipsa 2E : le cahier A4 numérique qu'on attendait, à quelques détails près\n\n## Une liseuse qui n'en est plus tout à fait une\n\nPendant longtemps, le marché des liseuses s'est tenu à une règle non écrite : une liseuse, c'est petit, c'est noir et blanc, c'est fait pour lire des romans dans le métro. Les tentatives de sortir de ce cadre — Sony DPT-RP1, Onyx Boox, ReMarkable — restaient soit confidentielles, soit positionnées comme des outils de prise de notes pure, sans véritable identité de liseuse. Avec l'**Elipsa 2E**, Kobo assume frontalement l'hybridation. Ce n'est pas une liseuse à laquelle on a ajouté un stylet ; c'est un objet pensé dès le départ comme un *cahier numérique qui sait aussi lire des livres*.\n\nL'engin est imposant. Écran E-Ink Carta 1200 de 10,3 pouces, résolution 1404 × 1872 pour 227 ppi, processeur dual-core 2 GHz et 32 Go de stockage. Côté tarif, TechRadar la situe autour de 399 dollars ou 349 livres, ce qui la place dans une catégorie où on n'achète plus sur un coup de tête : à ce prix, on attend un usage précis, pas un gadget de chevet.\n\n## Le format change tout\n\nTenir l'Elipsa 2E pour la première fois, c'est comprendre instantanément à qui elle parle. À 10,3 pouces, on est très proche d'une feuille A5, voire d'un cahier d'étudiant — un format qui colle naturellement aux PDF et aux documents grand format. Et c'est là que tout se joue.\n\nQuiconque a déjà tenté de lire un PDF technique sur une liseuse 6 ou 7 pouces sait à quel point l'exercice est frustrant : on zoome, on déplace, on perd la mise en page, les schémas explosent en morceaux. Avec l'Elipsa 2E, un PDF A4 passe à l'écran à une taille parfaitement lisible, sans gymnastique. Les manuels techniques, les articles scientifiques, les supports de cours, les rapports d'entreprise : tout ce qui était pénible devient confortable. C'est moins spectaculaire que la couleur d'une Libra Colour, mais sur un usage professionnel ou étudiant intensif, le format change littéralement la nature de l'objet.\n\n## Le stylet, atout central — mais imparfait\n\nLe stylet est inclus dans la boîte. Détail qui n'a l'air de rien mais qui mérite d'être souligné, parce que l'usage prévu est clairement l'annotation directe sur les e-books et la prise de notes manuscrites. Pas de Kobo Stylus 2 à racheter en option, pas de configuration séparée : on déballe, on écrit.\n\nL'utilisation est exactement ce qu'on en attend. On peut surligner dans n'importe quel ePub, écrire dans la marge, créer des carnets vierges pour des notes manuscrites, dessiner des schémas à main levée. Tout ce qu'on griffonne reste dans le fichier, et — point essentiel — peut être ressorti ensuite. Le système prend en charge ePub, PDF, et accepte sans broncher les fichiers déposés par USB-C, Wi-Fi ou Bluetooth.\n\nMais il faut être honnête : la sensation d'écriture n'est pas au niveau de ce que proposent les meilleurs concurrents. eWritable est même cinglant, qualifiant l'expérience tactile d'« horrible » et pointant le choix par Kobo du protocole Microsoft Pen Protocol (MPP 2.0) plutôt que la technologie Wacom qui équipe le ReMarkable 2 et reste la référence du secteur. Concrètement, qu'est-ce que ça veut dire ? Que la pointe glisse un peu trop sur le verre, qu'il manque cette résistance subtile qui fait penser au crayon sur papier, et qu'à très haute vitesse d'écriture la latence devient perceptible. Pour quelqu'un qui annote ses lectures, surligne, prend des notes ponctuelles, c'est largement suffisant. Pour quelqu'un qui veut remplacer son carnet Moleskine en cours magistral et écrire trois pages d'affilée à vitesse normale, ce sera frustrant.\n\nC'est une différence de positionnement, pas un défaut technique grave : l'Elipsa 2E est d'abord une liseuse qui annote, pas un cahier qui sait aussi lire.\n\n## L'export des annotations, ce qui fait vraiment la différence\n\nC'est probablement le point sur lequel Kobo creuse l'écart avec ses concurrents, et notamment avec le Kindle Scribe. Le manuel officiel explique qu'on peut exporter ses annotations sous forme de fichier .txt et le récupérer sur son ordinateur, mais en réalité l'écosystème va plus loin : les PDF annotés ressortent avec les annotations intégrées à la page, prêts à être imprimés ou partagés.\n\nCe flux, en apparence banal, change tout pour qui travaille sérieusement avec ses lectures. Un étudiant peut annoter ses cours et imprimer la version surlignée pour les révisions. Un enseignant peut corriger des copies en PDF et renvoyer le fichier annoté à l'élève. Un consultant peut lire un rapport, le commenter en marge, le réintégrer dans sa documentation projet. Aucune annotation perdue, aucune resaisie. Là où Kindle Scribe limite encore largement l'export de ses annotations, Kobo joue le jeu de l'ouverture.\n\n## Le talon d'Achille : l'entrée des fichiers\n\nC'est ici que l'Elipsa 2E montre ses limites les plus tangibles, et il faut le savoir avant d'acheter. Contrairement à Kindle, il n'existe pas d'adresse e-mail officielle « envoyer à ma liseuse » : il faut transférer les fichiers manuellement, par USB ou via un service tiers comme Dropbox. Pour qui s'envoie régulièrement des articles ou des e-books depuis son ordinateur ou son téléphone, ce manque crée une vraie friction quotidienne.\n\nLes workarounds existent, à condition d'accepter de mettre un peu les mains dans le moteur. Un projet open source baptisé KoboMail propose un système d'envoi par e-mail pour certaines Kobo, et plus intéressant encore, un daemon Nextcloud-Kobo permet de synchroniser automatiquement un dossier Nextcloud via WebDAV vers la liseuse. C'est ouvert, c'est élégant, ça respecte le principe d'auto-hébergement — mais ce n'est pas du *plug and play*. Il faut un serveur Nextcloud opérationnel, savoir configurer une connexion WebDAV, et accepter que l'installation se fasse dans le dossier `/mnt/onboard/.adds/` du système Kobo. Bref, c'est superbe pour qui maîtrise déjà son infrastructure ; c'est rédhibitoire pour qui veut juste une solution clé en main.\n\nSur ce point précis, Kobo et Amazon proposent deux philosophies opposées : le confort immédiat d'un écosystème fermé contre la liberté d'un écosystème ouvert mais exigeant. À vous de voir où vous vous situez.\n\n## Pour qui ce produit a-t-il du sens ?\n\nL'Elipsa 2E est faite pour vous si vous lisez beaucoup de documents grand format — PDF techniques, cours universitaires, rapports professionnels, partitions — et si l'idée d'annoter ces documents fait partie intégrante de votre flux de travail. Elle est faite pour vous si vous voulez un objet unique au lieu de jongler entre une liseuse classique et un cahier papier. Elle est faite pour vous, aussi, si vous avez déjà (ou êtes prêt à monter) un Nextcloud ou un Dropbox pour synchroniser vos fichiers proprement.\n\nElle ne l'est pas si votre priorité est la prise de notes manuscrite intensive et fluide : sur ce terrain, un ReMarkable 2 ou un Supernote restent supérieurs. Elle ne l'est pas non plus si vous attendez le confort de l'envoi par e-mail à la Kindle, ou si l'idée d'installer un plugin communautaire pour combler un manque officiel vous donne de l'urticaire. Et elle est sans doute disproportionnée si vous lisez essentiellement des romans : à ce moment-là, une Clara BW à 150 € vous donnera plus de plaisir, dans un format de poche.\n\n## Mon avis\n\nL'Elipsa 2E est un produit ambitieux qui réussit l'essentiel et trébuche sur quelques détails finalement révélateurs. L'essentiel, c'est le format, la qualité de l'écran, l'export des annotations, l'ouverture du système et l'autonomie typique d'une liseuse — autant de raisons qui en font la meilleure proposition du marché pour un usage documentaire sérieux à ce niveau de prix.\n\nLes détails, ce sont le ressenti perfectible du stylet et l'absence d'un système d'entrée des fichiers digne de 2026. Kobo aurait pu intégrer nativement WebDAV — ça lui coûterait à peu près rien — et opter pour une dalle Wacom — ça lui coûterait plus cher mais lui ferait gagner une catégorie entière d'utilisateurs. À la place, on hérite d'un produit excellent à 80 %, et qui demande qu'on accepte ses zones grises sur les 20 % restants.\n\nPour qui cherche un véritable cahier A4 numérique sans basculer dans une tablette Android Onyx — plus chère, plus complexe, et au confort de lecture moindre — l'Elipsa 2E reste, à mes yeux, le meilleur compromis du moment. Pas le produit parfait. Le meilleur compromis. Ce n'est pas la même chose, et c'est très bien aussi.","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/e1e8a0c1-6971-4357-9aaa-7e7a748922f3.json b/_cache/articles/e1e8a0c1-6971-4357-9aaa-7e7a748922f3.json
deleted file mode 100644
index 6edeaa3..0000000
--- a/_cache/articles/e1e8a0c1-6971-4357-9aaa-7e7a748922f3.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e1e8a0c1-6971-4357-9aaa-7e7a748922f3","slug":"quand-systemd-remplace-cron-pourquoi-et-comment-migrer-ses-taches-planifiees","title":"Quand systemd remplace cron : pourquoi (et comment) migrer ses tâches planifiées","author":"cedric@abonnel.fr","published":true,"published_at":"2026-06-01 07:56","created_at":"2026-05-12 13:57:29","updated_at":"2026-05-12 13:58:58","revisions":[],"cover":"","files_meta":{"b116a3e7b4b54c5c-13369.svg":{"author":"Générée par IA our Cédrix","source_url":""}},"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"informatique","content":"# Quand systemd remplace cron : pourquoi (et comment) migrer ses tâches planifiées\n\n*Cron tourne sur Linux depuis 1975. Il a fait son temps pour beaucoup d'usages : voici ce que les timers systemd apportent, et comment basculer sans tout casser.*\n\n## Pourquoi cron reste partout\n\n`cron` est l'un des plus anciens outils Unix encore en service. Son principe tient en deux idées : un démon qui se réveille toutes les minutes, et un fichier texte — la crontab — où chaque ligne décrit une commande et son moment d'exécution avec cinq champs (minute, heure, jour du mois, mois, jour de la semaine).\n\n```\n# m h dom mon dow command\n0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1\n```\n\nCinquante ans plus tard, ça marche. C'est installé partout, c'est documenté à mort, ça tient sur une ligne, et n'importe quel administrateur sait lire `0 2 * * *`. Pour beaucoup de besoins simples — « lancer ce script tous les jours à 2h du matin » — cron reste le bon choix.\n\nLe problème est que les besoins ont rarement été aussi simples depuis longtemps.\n\n## Les limites de cron qu'on finit toujours par rencontrer\n\nÀ chaque administration de serveur sérieuse, on retombe sur les mêmes frustrations.\n\n**La machine était éteinte au moment du job.** Cron saute purement et simplement l'occurrence ratée. Si le portable de l'utilisateur dormait à 2h, la sauvegarde quotidienne n'aura pas lieu — point. Le job s'exécutera de nouveau le lendemain à 2h, sans rattrapage, sans alerte.\n\n**Les logs sont dispersés ou perdus.** Par défaut, la sortie standard du job est envoyée par mail à l'utilisateur (si `MAILTO` est défini et qu'un MTA tourne) ou simplement perdue. Le démon lui-même logue dans syslog quand il *démarre* un job, mais pas son contenu. Diagnostiquer pourquoi un job a échoué la semaine dernière relève souvent de l'archéologie.\n\n**Pas de dépendances.** Un job qui doit attendre que le réseau soit monté, qu'un point de montage soit présent, qu'un autre service ait fini son démarrage : cron ne sait pas exprimer ça. La parade habituelle — un `sleep 60` ou un `@reboot` suivi d'une boucle d'attente — fonctionne mais reste un bricolage.\n\n**Pas de recouvrement entre exécutions.** Si un job de 5 minutes en prend 7 ce jour-là, cron lance la prochaine occurrence pile au moment où la précédente tourne encore. Deux instances simultanées d'un script de synchronisation, c'est rarement ce qu'on veut.\n\n**Pas de jitter, pas de randomisation.** Quand cinquante VMs lancent leur `cron.daily` toutes en même temps à 6h25 (l'heure d'anacron par défaut sur Debian), le pic de charge sur l'hyperviseur est garanti. Cron n'offre aucune primitive pour étaler les exécutions.\n\n**Pas de visibilité globale.** Pour répondre à « quels jobs vont tourner aujourd'hui sur cette machine ? », il faut lire la crontab système, les crontabs utilisateur (`/var/spool/cron/`), le contenu de `/etc/cron.d/`, `/etc/cron.daily/`, `/etc/cron.hourly/`, etc. Aucune commande ne donne la vue consolidée.\n\n**Pas d'isolation, pas de quota.** Le job s'exécute avec les privilèges et les ressources du shell qui l'a lancé. Aucune façon native de limiter à 50 % de CPU, à 1 Go de RAM, ou de couper si ça dépasse 10 minutes.\n\nAucun de ces points ne rend cron inutilisable. Mais accumulés sur une dizaine de jobs critiques, ils transforment l'administration en travail de surveillance permanente.\n\n## Ce qu'apporte un timer systemd\n\nSur toute distribution Linux moderne basée sur systemd (la quasi-totalité, hors BSD, Alpine, Gentoo et quelques cas particuliers), une alternative native existe : les **timers**. Le principe est différent dès le départ.\n\nUn timer systemd, c'est **deux fichiers** au lieu d'une ligne :\n\n- Un fichier `.service` qui décrit **ce qu'il faut faire** — exactement comme on décrit un service classique, en mode `Type=oneshot` pour un job ponctuel\n- Un fichier `.timer` qui décrit **quand le faire** — ce sont les règles de déclenchement\n\nCette séparation entre le « quoi » et le « quand » est plus verbeuse au départ, mais elle débloque tout le reste.\n\n### Une syntaxe d'horaire lisible\n\nLà où cron oblige à mentaliser `0 2 * * 1-5`, systemd écrit :\n\n```ini\nOnCalendar=Mon..Fri 02:00:00\n```\n\nEt la commande `systemd-analyze calendar \"Mon..Fri 02:00:00\"` valide l'expression en montrant la prochaine exécution prévue. Une erreur de jour-de-semaine ou un décalage horaire ne plante pas en silence : on le voit avant de déployer.\n\nD'autres formes utiles que cron ne sait pas exprimer :\n\n```ini\nOnCalendar=*-*-* 02..04:00:00 # toutes les heures entre 2h et 4h\nOnCalendar=*-*-01 03:00:00 # tous les 1er du mois à 3h\nOnCalendar=*-*-* 09:00:00 Europe/Paris # à 9h heure de Paris, été comme hiver\n```\n\nLe support natif des fuseaux horaires est une avancée significative pour qui gère des serveurs distribués géographiquement — cron ignore tout du concept et tourne sur le fuseau du système.\n\n### Du temps relatif, pas seulement du temps absolu\n\nCron raisonne uniquement en horloge murale (« tel jour, à telle heure »). systemd ajoute le **temps monotone**, relatif à un événement :\n\n```ini\nOnBootSec=10min # 10 minutes après le démarrage\nOnUnitActiveSec=6h # toutes les 6 heures après la dernière exécution\nOnStartupSec=5min # 5 minutes après le démarrage de systemd\n```\n\n`OnUnitActiveSec=6h` règle proprement le problème des exécutions qui se chevauchent : la prochaine instance se déclenche 6 heures **après la fin** de la précédente, pas 6 heures après son démarrage. Aucune équivalence simple en cron.\n\n### Le rattrapage des exécutions ratées\n\nUne seule ligne change tout :\n\n```ini\nPersistent=true\n```\n\nAvec cette option, systemd mémorise la dernière exécution réussie. Si la machine était éteinte au moment prévu, le job se déclenche dès le démarrage suivant (après le `RandomizedDelaySec` éventuel, voir plus bas). Pour un portable, un poste de développement, ou n'importe quelle machine qui n'est pas en service 24/7, c'est une différence majeure de fiabilité.\n\n### Du jitter intégré\n\n```ini\nRandomizedDelaySec=15min\n```\n\nLe déclenchement se fait à un instant aléatoire dans la fenêtre `[heure_prévue, heure_prévue + 15 min]`. Quand cinquante machines lancent leur mise à jour quotidienne, le pic de charge se lisse au lieu de tomber au même instant. C'est la fonctionnalité que tous les administrateurs de flottes finissent par re-bricoler en cron avec un `sleep $((RANDOM % 900))` peu élégant.\n\n### Le logging gratuit dans journald\n\nTout ce que le service écrit sur stdout et stderr est capturé automatiquement par journald. Une seule commande pour tout consulter :\n\n```bash\njournalctl -u backup.service # toutes les exécutions historisées\njournalctl -u backup.service -f # en suivi temps réel\njournalctl -u backup.service --since yesterday\n```\n\nPas de configuration, pas de redirection à la main, pas de `>> /var/log/backup.log 2>&1` à coller à chaque ligne de crontab. Et accessoirement, journald gère la rotation, la compression et la rétention.\n\n### Les dépendances déclaratives\n\nDans le fichier `.service`, on peut dire au planificateur qu'un job nécessite que le réseau soit prêt, qu'un point de montage soit présent, qu'un autre service ait démarré :\n\n```ini\n[Unit]\nWants=network-online.target\nAfter=network-online.target\nRequiresMountsFor=/mnt/backup\n```\n\nsystemd attend que ces conditions soient remplies avant de déclencher le service. Le job ne tente plus de s'exécuter sur un montage absent ou avant que la résolution DNS soit fonctionnelle.\n\n### Le contrôle des ressources via cgroups\n\nPuisque chaque exécution passe par un service, on bénéficie de tout l'arsenal cgroups de systemd :\n\n```ini\n[Service]\nCPUQuota=50%\nMemoryMax=1G\nIOWeight=10\n```\n\nUn job de sauvegarde qui pourrait saturer le disque ne sortira pas de son enveloppe. Cron n'offre rien d'équivalent — au mieux on enrobe la commande dans `nice` et `ionice`, ce qui reste primitif.\n\n### La vue consolidée\n\n```bash\nsystemctl list-timers --all\n```\n\nUne seule commande, toutes les exécutions planifiées du système, classées par prochaine échéance, avec date de dernière exécution. La question « qu'est-ce qui tourne automatiquement sur cette machine ? » trouve enfin une réponse en une ligne.\n\n## Un exemple complet, pas-à-pas\n\nReprenons le job de sauvegarde initial — `0 2 * * * /usr/local/bin/backup.sh` — et traduisons-le.\n\n`/etc/systemd/system/backup.service` :\n\n```ini\n[Unit]\nDescription=Sauvegarde quotidienne\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=oneshot\nUser=backup\nGroup=backup\nExecStart=/usr/local/bin/backup.sh\n# Capture stdout/stderr dans journald (comportement par défaut, ici explicité)\nStandardOutput=journal\nStandardError=journal\n# Garde-fous ressources\nCPUQuota=50%\nMemoryMax=1G\n```\n\n`/etc/systemd/system/backup.timer` :\n\n```ini\n[Unit]\nDescription=Déclenche la sauvegarde tous les jours à 2h\n\n[Timer]\nOnCalendar=*-*-* 02:00:00\nPersistent=true\nRandomizedDelaySec=15min\n\n[Install]\nWantedBy=timers.target\n```\n\nActivation :\n\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable --now backup.timer\n```\n\nVérifications :\n\n```bash\nsystemctl list-timers backup.timer\nsystemctl status backup.timer\nsystemd-analyze calendar \"*-*-* 02:00:00\" # voir la prochaine échéance\njournalctl -u backup.service # voir l'historique\nsudo systemctl start backup.service # déclencher manuellement pour tester\n```\n\nComparé à la ligne de crontab originale, c'est plus verbeux. Mais on a, sans rien ajouter : le rattrapage en cas d'arrêt machine, du jitter pour éviter les pics, l'attente du réseau, des limites de ressources, du logging structuré, et une commande pour tout inspecter.\n\n## Quelques recettes utiles\n\n**Tous les jours à 3h sauf le dimanche** :\n\n```ini\nOnCalendar=Mon..Sat 03:00:00\n```\n\n**Toutes les 15 minutes pendant les heures de bureau** :\n\n```ini\nOnCalendar=Mon..Fri 08..18:00/15:00\n```\n\n**Le premier lundi de chaque mois à 5h** : pas faisable en une seule expression, mais combinable avec une condition `ExecStartPre` qui vérifie la date et sort si ce n'est pas le bon jour. C'est l'une des rares zones où cron reste plus naturel (`0 5 * * 1` + `[ $(date +\\%d) -le 7 ]` dans le script).\n\n**Toutes les six heures à partir du dernier passage** (jamais de chevauchement) :\n\n```ini\n[Timer]\nOnBootSec=5min\nOnUnitActiveSec=6h\n```\n\n**Timer utilisateur, sans `sudo`** : dans `~/.config/systemd/user/`, puis :\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable --now monjob.timer\nloginctl enable-linger $USER # pour que ça tourne sans session ouverte\n```\n\n## Quand garder cron\n\nTout n'est pas à migrer. Cron reste le bon choix dans plusieurs cas :\n\n- **Scripts portables vers BSD, macOS, ou des conteneurs minimaux**. systemd n'existe pas dans Alpine Linux, sur les BSD, ni dans la plupart des images Docker légères.\n- **Tâches utilisateur très simples sur un serveur partagé**, où chaque utilisateur gère sa propre crontab sans privilèges admin.\n- **Notification par mail intégrée** : si `MAILTO=admin@domain.tld` suivi d'une sortie sur stderr couvre déjà le besoin de monitoring, repasser par journald + un exporter Prometheus est de la sur-ingénierie.\n- **Un job de trente secondes à ajouter sur un serveur existant** déjà couvert par cron. Mélanger les deux outils est sans risque — ils coexistent sans interférence — et créer deux fichiers pour un alias unique d'une ligne reste excessif.\n\nLa meilleure stratégie est rarement migratoire au pas de charge. Elle consiste à **utiliser systemd pour toute nouvelle tâche planifiée**, et à ne migrer les jobs cron existants que quand ils posent un problème concret : un job raté qu'il fallait rattraper, un log perdu qu'il fallait retrouver, un chevauchement qui a corrompu des données.\n\n## En résumé\n\nCron n'est pas obsolète, il est sous-dimensionné pour des besoins modernes. Les timers systemd ne remplacent pas la simplicité d'une ligne de crontab pour un job trivial, mais ils apportent à peu près tout ce qui manque dès qu'une tâche planifiée devient critique : rattrapage, logging, dépendances, isolation, observabilité.\n\nPour un DevOps qui construit aujourd'hui un nouveau service, le choix par défaut a basculé : commencer en systemd, et n'utiliser cron que par exception justifiée. La verbosité initiale des deux fichiers se rentabilise au premier incident de production qu'on diagnostique en `journalctl -u nom.service` au lieu de fouiller dans des logs disparates.\n\nEt même sans migrer quoi que ce soit, la commande `systemctl list-timers` mérite d'entrer dans le réflexe de tout audit de machine Linux. C'est là que se cache la moitié des tâches planifiées qu'on croit avoir comprises.","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/e739bf3c-b380-4567-90aa-32da12f56bc5.json b/_cache/articles/e739bf3c-b380-4567-90aa-32da12f56bc5.json
deleted file mode 100644
index ff93212..0000000
--- a/_cache/articles/e739bf3c-b380-4567-90aa-32da12f56bc5.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e739bf3c-b380-4567-90aa-32da12f56bc5","slug":"50g-pon-la-fibre-optique-du-futur","title":"50G-PON : la fibre optique du futur","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-05 08:48","created_at":"2025-11-05 08:48:01","updated_at":"2026-05-11 23:54:38","revisions":[{"n":1,"date":"2026-05-11 23:54:38","comment":"","title":"50G-PON : la fibre optique du futur"}],"cover":"cover.jpg","files_meta":{"cover.jpg":{"author":"","source_url":"https://www.zdnet.fr/wp-content/uploads/zdnet/2025/10/fibre-1125x615.jpg"},"_thumb_63b0e27c3950cfe1-993774.webp":{"author":"","source_url":""},"_thumb_6dea6d617384f5ed-875.gif":{"author":"","source_url":""},"_thumb_7df96bdf1ecebb75-124286.jpg":{"author":"","source_url":""},"_thumb_bfd46debd51361c4-255309.jpg":{"author":"","source_url":""},"_thumb_c436b74420666bbb-3393394.png":{"author":"","source_url":""},"_thumb_e58b3803bdfafdf0-360838.png":{"author":"","source_url":""}},"external_links":[{"url":"https://hellofuture.orange.com/fr/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/","name":"50G-PON : Orange ouvre la voie à la Fibre du futur - Hello Future","added_at":"2026-05-11 23:52:53","meta":{"mime":"text/html","size":117887,"description":"Sur la standardisation de la triple coexistence de trois technologies PON Depuis 2006, Orange déploie la fibre jusqu’aux domiciles (FTTH-Fibre To The Home) et jusqu’aux entreprises (FTTE-Fibre To The Entreprise). Les réseaux d’accès fibre d’Orange reposent sur des infrastructures passives (fibres, câbles, connecteurs, boitiers etc.) et des systèmes de transmissions…","og_image":"/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_bfd46debd51361c4-255309.jpg","site_name":"Hello Future","og_type":"article","language":"fr_FR","date":"2024-06-25T10:27:25+01:00","canonical":"https://hellofuture.orange.com/fr/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/"}},{"url":"https://www.universfreebox.com/article/587477/orange-teste-la-fibre-du-futur-avec-la-50g-pon-a-40-gbit-s-une-premiere-en-france","name":"Orange teste la \"fibre du futur\" avec la 50G-PON à 40 Gbit/s, une première en France","added_at":"2026-05-11 23:53:22","author":"Lucas Musset","meta":{"mime":"text/html","size":118235,"description":"Orange teste la technologie 50G-PON, une première en France pour la fibre très haut débit. Ce jeudi 23 octobre 2025, Orange a présenté à Lyon et Marseille une démonstration grandeur nature de la technologie 50G-PON, considérée comme la prochaine étape majeure dans l’évolution des réseaux fibre optique. Il s’agit, selon l’opérateur, d’une première en France. […]","og_image":"/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_c436b74420666bbb-3393394.png","site_name":"Univers Freebox","og_type":"article","language":"fr_FR","date":"2025-10-23T16:00:44+00:00","canonical":"https://www.universfreebox.com/article/587477/orange-teste-la-fibre-du-futur-avec-la-50g-pon-a-40-gbit-s-une-premiere-en-france"}},{"url":"https://www.generation-nt.com/actualites/orange-50g-pon-fibre-ftth-debit-2064811","name":"Fibre du futur : Orange teste du 50G-PON en conditions réelles","added_at":"2026-05-11 23:53:33","author":"Jérôme G.","meta":{"mime":"text/html","size":109809,"description":"GNT est le portail Hi-Tech français consacré aux nouvelles technologies (internet, logiciel, matériel, mobilité, entreprise) et au jeu vidéo PC et consoles.","keywords":"50g-pon orange fibre optique , orange, 50g, pon, fibre, ftth, debit","og_image":"/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_63b0e27c3950cfe1-993774.webp","site_name":"Génération NT","og_type":"article","language":"fr_FR","canonical":"https://www.generation-nt.com/actualites/orange-50g-pon-fibre-ftth-debit-2064811"}},{"url":"https://www.zdnet.fr/actualites/orange-teste-la-fibre-optique-du-futur-jusqua-cinq-fois-plus-rapide-484095.htm","name":"Orange teste la fibre optique du futur, jusqu’à cinq fois plus ra ...","added_at":"2026-05-11 23:54:09","author":"Xavier Biseul","meta":{"mime":"text/html","size":236667,"description":"Dans ses laboratoires, l’opérateur historique mène des expérimentations sur la technologie 50G-PON. Ce nouveau standard des réseaux de fibre optique permet d’atteindre des débits théoriques allant jusqu’à 50 gigabits par seconde.","og_image":"/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_7df96bdf1ecebb75-124286.jpg","site_name":"ZDNET","og_type":"article","language":"fr_FR","date":"2025-10-28T15:20:02+00:00","canonical":"https://www.zdnet.fr/actualites/orange-teste-la-fibre-optique-du-futur-jusqua-cinq-fois-plus-rapide-484095.htm"}},{"url":"https://www.lyon-entreprises.com/actualites/article/orange-teste-a-lyon-la-fibre-du-futur-grace-a-la-technologie-50g-pon","name":"Orange teste à Lyon la fibre du futur grâce à la technologie 50G-PON - Lyon Entreprises [LE]","added_at":"2026-05-11 23:54:21","meta":{"mime":"text/html","size":161762,"description":"Un article d'actualité LE [ Lyon-Entreprises ], le portail d'information sur les entreprises pour les décideurs de Lyon et Rhône-Alpes","og_image":"/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_e58b3803bdfafdf0-360838.png","site_name":"Lyon Entreprises [LE]","og_type":"article","language":"fr_FR","canonical":"https://www.lyon-entreprises.com/actualites/article/orange-teste-a-lyon-la-fibre-du-futur-grace-a-la-technologie-50g-pon"}},{"url":"https://lafibre.info/orange-les-news/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/","name":"50G-PON : Orange ouvre la voie à la Fibre du futur","added_at":"2026-05-11 23:54:30","meta":{"mime":"text/html","size":48608,"description":"50G-PON : Orange ouvre la voie à la Fibre du futur","keywords":"Fibre optique,FTTH,très haut débit,Gpon,FTTLA,FTTdp,Test débit,SpeedTest","canonical":"https://lafibre.info/orange-les-news/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/","og_image":"/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_6dea6d617384f5ed-875.gif"}}],"seo_title":"","seo_description":"","og_image":"","category":"télécom","content":"# 50G-PON : la fibre optique du futur\n\nLa fibre optique a déjà remplacé le cuivre dans la plupart des déploiements neufs, et les opérateurs ont passé la dernière décennie à généraliser le GPON puis le XGS-PON. Mais la course aux débits ne s'arrête pas là. La prochaine marche s'appelle le **50G-PON**, et elle est en train de passer du statut de standard sur le papier à celui de technologie qu'on commence à voir en démonstration chez les équipementiers. Voilà ce qu'il faut en retenir.\n\n## Ce que c'est\n\nLe 50G-PON est la dernière génération de réseau optique passif normalisée par l'ITU-T sous la référence **G.9804**. Comme ses prédécesseurs, il repose sur le principe d'une fibre unique partagée entre plusieurs abonnés via des splitters passifs — pas d'électronique active entre le central et le client. Ce qui change, c'est le débit : **50 Gbit/s symétriques** sur une seule longueur d'onde.\n\nPour situer la techno dans sa famille :\n\n- **GPON** : 2,5 Gbit/s descendant / 1,25 Gbit/s montant — la base du déploiement résidentiel actuel\n- **XGS-PON** : 10 Gbit/s symétriques — la génération qui prend le relais aujourd'hui\n- **NG-PON2** : 40 Gbit/s, obtenus en agrégeant quatre canaux de 10 Gbit/s sur des longueurs d'onde différentes\n- **50G-PON** : 50 Gbit/s symétriques sur une longueur d'onde unique\n\nLe point intéressant, c'est précisément ce dernier détail. Là où NG-PON2 multipliait les canaux pour atteindre 40 Gbit/s — au prix d'une électronique plus complexe et plus chère — le 50G-PON tape les 50 Gbit/s sur **une seule porteuse**. C'est techniquement plus exigeant côté composants optiques, mais beaucoup plus simple à industrialiser et à exploiter.\n\n## Comment ça marche\n\nL'architecture reste celle du PON classique, ce qui est un choix volontaire pour garantir la coexistence avec les générations précédentes :\n\n```\nOLT (central) ──── fibre ──── [Splitter passif] ─┬─── ONT abonné 1\n ├─── ONT abonné 2\n └─── ONT abonné 3\n```\n\n- L'**OLT** (*Optical Line Terminal*), côté opérateur, pilote le réseau et émet le signal.\n- Les **splitters passifs** dupliquent le signal lumineux pour le distribuer, sans alimentation ni amplification.\n- L'**ONT** (*Optical Network Terminal*), chez l'abonné, fait la conversion optique-électrique.\n\nL'astuce du 50G-PON, c'est qu'il utilise **des longueurs d'onde différentes** de celles du GPON et du XGS-PON. Concrètement, les trois technologies peuvent **cohabiter sur la même fibre physique** : un opérateur peut continuer à servir ses abonnés GPON existants tout en branchant des nouveaux clients en XGS-PON ou en 50G-PON, sans retoucher l'infrastructure passive. C'est un point décisif pour le déploiement, parce qu'il évite la rupture de service et étale l'investissement.\n\n## Pourquoi ça compte\n\nÀ 50 Gbit/s symétriques, on n'est plus dans la logique du « plus de débit pour le particulier ». L'enjeu est ailleurs, et il est triple.\n\nD'abord, **les usages professionnels** qui tournent en limite sur XGS-PON. Sauvegarde cloud à l'échelle d'une entreprise, synchronisation inter-sites, stockage partagé, environnements de travail virtualisés : ces flux ont besoin de débit symétrique et constant, et 10 Gbit/s commencent à serrer dans certains contextes.\n\nEnsuite, le **transport pour le mobile**. Une antenne 5G — et a fortiori 6G — doit être raccordée au cœur de réseau par un lien capable d'encaisser le trafic agrégé de tous les utilisateurs qu'elle sert. C'est ce qu'on appelle le *fronthaul* ou le *backhaul* selon l'architecture. Le 50G-PON est un candidat sérieux pour ce rôle, parce qu'il offre les bons débits avec une infrastructure mutualisable et peu coûteuse à exploiter.\n\nEnfin, **l'évolutivité**. La même fibre, le même splitter, le même chemin physique pourront porter le 50G-PON aujourd'hui et la génération suivante — déjà en discussion à l'ITU-T sous le nom de 100G-PON — demain. C'est ce qui justifie qu'on déploie du 50G-PON même si tous les abonnés n'en ont pas l'usage immédiat : ce n'est pas l'équipement client qui coûte cher, c'est la fibre dans la rue, et elle est déjà là.\n\n## Ce qui freine encore\n\nLe 50G-PON existe, il est standardisé, et plusieurs équipementiers proposent du matériel compatible. Pour autant, le déploiement à grande échelle prendra du temps, pour quelques raisons concrètes.\n\nLe **coût des équipements** reste élevé. Les composants optiques capables de moduler proprement à 50 Gbit/s sur une seule porteuse sont à un stade industriel récent, et les volumes ne sont pas encore là pour faire baisser les prix. Pour la majorité des foyers, le XGS-PON couvre largement les besoins et coûte beaucoup moins cher.\n\nLa **consommation énergétique** est plus importante que sur les générations précédentes. Ce n'est pas rédhibitoire, mais ça compte dans le bilan d'exploitation, surtout à l'échelle d'un opérateur.\n\nEnfin, **le marché n'est pas pressé**. Les box résidentielles actuelles n'exploiteraient même pas 10 Gbit/s symétriques, et les usages qui justifient le 50G-PON sont aujourd'hui concentrés sur des segments précis — entreprises, datacenters, opérateurs mobiles. Le déploiement va donc se faire par couches, en commençant par les zones où la demande existe vraiment.\n\n## En résumé\n\n| Technologie | Débit symétrique | Cible principale |\n|---|---|---|\n| GPON | 1 Gbit/s | Résidentiel actuel |\n| XGS-PON | 10 Gbit/s | Résidentiel haut de gamme, PME |\n| NG-PON2 | 40 Gbit/s (4 × 10) | Niche, peu déployé |\n| 50G-PON | 50 Gbit/s | Entreprises, datacenters, transport mobile |\n\nLe 50G-PON n'est pas la techno qui va arriver dans les box grand public dans les six mois. C'est la **brique d'infrastructure** qui prépare la décennie qui vient : celle qui permettra aux opérateurs de répondre à la fois aux besoins des entreprises, au raccordement des antennes mobiles de prochaine génération, et à la montée en puissance progressive du résidentiel — sans toucher à la fibre déjà tirée. Et c'est exactement ce qu'on attend d'une bonne infrastructure : qu'elle se mette en place sans bruit, et qu'elle dure.\n","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/e9adfdab-6246-411f-9953-91fcfcfb105f.json b/_cache/articles/e9adfdab-6246-411f-9953-91fcfcfb105f.json
deleted file mode 100644
index fef08e3..0000000
--- a/_cache/articles/e9adfdab-6246-411f-9953-91fcfcfb105f.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"e9adfdab-6246-411f-9953-91fcfcfb105f","slug":"esp32","title":"esp32","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-29 06:31:50","created_at":"2025-11-29 06:31:50","updated_at":"2025-11-29 06:31:50","revisions":[],"cover":"","files_meta":[],"external_links":[],"seo_title":"","seo_description":"","og_image":"","category":"Électronique","content":"# esp32\n\n\n\n## Choix de l’ESP32\nL’ESP32 constitue une alternative compacte et économique pour récupérer automatiquement les informations TIC d’un compteur électrique. Il présente plusieurs avantages :\n\n- **une connexion Wi-Fi intégrée**, permettant de communiquer facilement avec un serveur, une box domotique ou un service en ligne ;\n- **un espace de stockage interne (SPI Flash)** pour le firmware et les données nécessaires au fonctionnement ;\n- **une interface série (UART)** directement accessible sur les broches GPIO pour lire les trames issues du démodulateur ASK.\n\nL’utilisation d’un **démodulateur ASK** permet d’obtenir un signal numérique TTL immédiatement compatible avec l’entrée UART de l’ESP32, sans adaptation de niveau. Les broches les plus couramment utilisées pour la liaison série sont **GPIO16 (RX)** ou **RX0 (GPIO3)**, selon la configuration retenue.\nL’alimentation du module est assurée par la sortie **3,3 V** de l’ESP32, ce qui permet un câblage simple et propre.\n\nGrâce à son environnement logiciel flexible (Arduino, ESP-IDF, MicroPython…), l’ESP32 permet de mettre en place facilement des fonctions avancées : connexion Wi-Fi, envoi de données vers MQTT, interface Web locale, synchronisation NTP, journalisation, etc.\n\n## Câblage\n⚠️ **Attention : ne pas confondre 3V3, VIN et VCC/VDD (5 V)**\n\nSur une carte ESP32 (dev board type WROOM / NodeMCU / UPesy / DOIT…), les tensions disponibles sont :\n\n### • 3V3 (3.3 V régulé)\n- C’est la sortie du régulateur embarqué.\n- Elle alimente le microcontrôleur ESP32 et ses GPIO.\n- **Toutes les entrées/sorties de l’ESP32 sont *strictement* en 3,3 V.**\n- **Le démodulateur ASK doit être alimenté ici.**\n\n### • VIN (ou 5V selon les cartes)\n- Entrée utilisée pour alimenter la carte en **5 V** (via USB ou alimentation externe).\n- Passera ensuite par le régulateur pour produire le **3,3 V interne**.\n- **NE PAS utiliser VIN pour alimenter le démodulateur ASK**.\n\n### • Pourquoi cette précision ?\nParce que certains modules ou schémas utilisent la notation **VCC / VDD**, qui peut désigner tantôt 3,3 V, tantôt 5 V selon le fabricant.\nSur l’ESP32, **la seule tension sûre pour alimenter un module logique est 3V3**.\n\n### Rappel important\n- Les GPIO de l’ESP32 **ne sont pas tolérants au 5 V**.\n- Injecter du 5 V sur RX0, GPIO3 ou tout autre GPIO risque de **détruire le microcontrôleur**.\n\n### Description du câblage\n\n\nSchéma de *câblage ESP32 générique* provenant du site \n\nL’ESP32 est connecté au **démodulateur ASK**, qui fournit un signal numérique TTL prêt à être lu par l’UART de l’ESP32.\nLe câblage est très simple : trois fils suffisent entre l’ESP32 et le module.\n\nBroches recommandées :\n\n- **3V3** – alimentation du démodulateur\n- **GND** – masse commune\n- **RX0 / GPIO3** entrée série utilisée pour lire les trames TIC)\n\nL’ESP32 ne transmet aucune commande au compteur : seule la ligne **RX** est nécessaire.\nLe démodulateur assure la conversion du signal modulé provenant du Linky vers un signal propre au format TTL.\n\n---\n\n### Schéma de câblage (ASCII)\n```\n+-----------------------------+\n| Compteur Linky |\n| --- |\n| Sortie TIC (ASK) |\n +-------------+---------------+\n| |\n| --- |\n| Signal TIC modulé |\n v\n +-----------------------------+\n| Démodulateur ASK |\n| --- |\n| |\n| IN <---------------------+- TIC Data |\n| GND <---------------------+- TIC GND |\n| |\n| OUT ----------------------+------------------> RX0 / GPIO3 |\n| GND ----------------------+------------------> GND |\n| VCC <---------------------+------------------- 3V3 |\n +-----------------------------+\n\n```\n ╔═══════════════════════╗\n ║ ESP32 ║\n ║ Dev Board ║\n ╠═══════════════════════╣\n ║ 3V3 : alimentation ║\n ║ GND : masse ║\n ║ GPIO3 : RX0 (UART) ║\n ╚═══════════════════════╝\n```\n```\n\n## ESP Home\n\nLa capture ci-dessus illustre un ESPHome fonctionnel, connecté à un compteur Linky, affichant les mesures électriques instantanées et les index de consommation. En parallèle, les logs temps réel confirment la bonne réception et l’envoi périodique des données.\n\n## Tasmota\nPour récupérer et exploiter les informations du compteur électrique Linky, nous allons utiliser un logiciel tel que **Tasmota**. Tasmota est un firmware open-source pour microcontrôleurs ESP8266 et ESP32, conçu pour simplifier la gestion des objets connectés et la domotique.\n\nGrâce à Tasmota, il devient possible de :\n\n- **Lire directement les trames TIC** via l’entrée UART de l’ESP32, en utilisant un démodulateur ASK pour obtenir un signal numérique TTL propre.\n- **Transmettre les données** vers un serveur local ou en ligne, une box domotique ou un service cloud compatible MQTT ou HTTP.\n- **Configurer facilement le système** sans coder, grâce à son interface Web intuitive et ses nombreuses options de paramétrage pour les GPIO, UART et protocoles réseau.\n\nEn utilisant Tasmota avec l’ESP32, nous transformons ce microcontrôleur en un **collecteur TIC intelligent**, capable de centraliser les informations énergétiques de manière autonome et de les rendre exploitables pour la domotique ou le suivi de consommation.\n## Installer Tasmota\nBrancher l'ESP32 sur l'ordinateur. Voir la page .\n\nTélécharger **Tasmota32** (`tasmota32.bin`) qui inclut les drivers nécessaires à la Téléinfo/TIC.\n\nTéléchargez-le ici : https:*ota.tasmota.com/tasmota32/release/\n\nFlasher Tasmota pour ESP32 avec espytool","featured":false,"tags":[]}
\ No newline at end of file
diff --git a/_cache/articles/f008f509-2cad-437f-9850-7b39ec37262a.json b/_cache/articles/f008f509-2cad-437f-9850-7b39ec37262a.json
deleted file mode 100644
index 099df59..0000000
--- a/_cache/articles/f008f509-2cad-437f-9850-7b39ec37262a.json
+++ /dev/null
@@ -1 +0,0 @@
-{"uuid":"f008f509-2cad-437f-9850-7b39ec37262a","slug":"gitea-l-installation","title":"gitea, l'installation","author":"cedric@abonnel.fr","published":true,"published_at":"2025-11-07 11:01:57","created_at":"2025-11-07 11:01:57","updated_at":"2025-11-07 11:01:57","revisions":[],"cover":"","category":"informatique","content":"# gitea, l'installation\n\nVoici un guide pas à pas pour installer Gitea sur Debian 13 avec PostgreSQL comme base de données, et configurer un reverse-proxy (par ex. Traefik ou Nginx) pour servir Gitea. \n\n---\n\n## 1. Pré-requis\n\n* Un serveur Debian 13 à jour.\n\n ```bash\n sudo apt update && sudo apt upgrade -y\n ```\n* Installer Git, et éventuellement d’autres dépendances.\n\n ```bash\n sudo apt install -y git ca-certificates\n ```\n* Un nom de domaine `git.abonnel.fr` pointant vers votre serveur (DNS A ou AAAA).\n* Assurez-vous que le port 80 et/ou 443 sont ouverts sur le serveur (pour le proxy).\n* Installer PostgreSQL.\n\n---\n\n## 2. Installer PostgreSQL et créer base & utilisateur\n\n1. Installer PostgreSQL (Debian 13 inclut postgresql dans ses dépôts).\n\n ```bash\n sudo apt install -y postgresql postgresql-contrib\n ```\n2. Passer à l’utilisateur postgres et créer la base + utilisateur pour Gitea :\n\n ```bash\n sudo -i -u postgres\n psql\n CREATE DATABASE gitea WITH ENCODING 'UTF8' TEMPLATE template0;\n CREATE USER gitea WITH PASSWORD 'votre_mot_de_passe_sécurisé';\n GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea;\n \\q\n exit\n ```\n\n Ces commandes sont conformes à la documentation Gitea pour PostgreSQL. ([Gitea Documentation][1])\n3. Vérifier que PostgreSQL fonctionne :\n\n ```bash\n sudo systemctl status postgresql\n ```\n4. (Optionnel) Modifier le fichier `pg_hba.conf` si vous voulez autoriser certaines connexions supplémentaires (ex: accès réseau).\n\n---\n\n## 3. Installer Gitea\n\n1. Créer un utilisateur système qui va exécuter Gitea :\n\n ```bash\n sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git\n ```\n\n ([Gitea Documentation][2])\n2. Créer les dossiers de travail :\n\n ```bash\n sudo mkdir -p /var/lib/gitea/{custom,data,log}\n sudo chown -R git:git /var/lib/gitea/\n sudo chmod -R 750 /var/lib/gitea/\n sudo mkdir /etc/gitea\n sudo chown root:git /etc/gitea\n sudo chmod 770 /etc/gitea\n ```\n\n ([Gitea Documentation][3])\n3. Télécharger le binaire Gitea :\n\n ```bash\n wget -O gitea https://dl.gitea.com/gitea/1.24.7/gitea-1.24.7-linux-amd64\n chmod +x gitea\n sudo mv gitea /usr/local/bin/gitea\n ```\n\n (Vérifiez la version la plus récente sur le site officiel) ([Gitea Documentation][2])\n4. Créer un fichier de service systemd pour Gitea. Exemple minimal (`/etc/systemd/system/gitea.service`) :\n\n ```ini\n [Unit]\n Description=Gitea (Git with a cup of tea)\n After=network.target postgresql.service\n\n [Service]\n User=git\n Group=git\n WorkingDirectory=/var/lib/gitea/\n ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini\n Restart=always\n Environment=USER=git HOME=/var/lib/gitea GITEA_WORK_DIR=/var/lib/gitea\n\n [Install]\n WantedBy=multi-user.target\n ```\n\n Ensuite :\n\n ```bash\n sudo systemctl daemon-reload\n sudo systemctl enable --now gitea\n sudo systemctl status gitea\n ```\n\n ([Gitea Documentation][4])\n\n---\n\n## 4. Configuration via l’interface web\n\n* Ouvrez [http://votre-serveur:3000](http://votre-serveur:3000) (ou le port que Gitea utilise) dans un navigateur.\n* Dans l’assistant d’installation, choisissez *PostgreSQL* comme type de base de données. Entrez :\n\n * Host : `localhost:5432` (ou l’IP/port selon)\n * Database : `gitea`\n * Username : `gitea`\n * Password : celui que vous avez défini\n* Dans le champ \"Base URL\", indiquez `https://git.abonnel.fr/` (ou http selon votre setup).\n* Complétez le reste (admin account, etc.).\n ([James R. S. Kemp Git][5])\n\n---\n\n## 5. Configurer reverse-proxy pour `git.abonnel.fr`\n\nSi vous utilisez Nginx ou Traefik (ou un autre proxy) vous devez rediriger le domaine vers Gitea.\n\n### Exemple avec Nginx :\n\n```nginx\nserver {\n listen 80;\n server_name git.abonnel.fr;\n\n # redirection vers HTTPS (si certbot/Let’s Encrypt)\n return 301 https://$host$request_uri;\n}\n\nserver {\n listen 443 ssl;\n server_name git.abonnel.fr;\n\n ssl_certificate /etc/letsencrypt/live/git.abonnel.fr/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/git.abonnel.fr/privkey.pem;\n\n location / {\n proxy_pass http://127.0.0.1:3000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n}\n```\n\nCet exemple est inspiré des tutos d’installation Gitea + Nginx. ([James R. S. Kemp Git][5])\nSi vous utilisez un autre proxy (ex: Traefik ou « zoraxyproxy »), adaptez la configuration pour qu’il fasse passer `git.abonnel.fr` vers `localhost:3000` et gère SSL.\n\n### Activer HTTPS\n\n* Installez `certbot` ou utilisez votre gestionnaire de certificats.\n\n ```bash\n sudo apt install -y certbot python3-certbot-nginx\n sudo certbot --nginx -d git.abonnel.fr\n ```\n* Vérifiez que le certificat est actif et que `https://git.abonnel.fr` fonctionne.\n\n---\n\n## 6. Configuration finale dans app.ini\n\nAprès installation, vous pouvez ajuster `/etc/gitea/app.ini` (ou via l’interface). Exemples de réglages utiles :\n\n* Dans `[server]` :\n\n ```\n ROOT_URL = https://git.abonnel.fr/\n HTTP_PORT = 3000\n SSH_PORT = 22 # ou le port SSH que vous utilisez pour Git \n START_SSH_SERVER = false # si vous n’utilisez pas le serveur SSH interne \n DOMAIN = git.abonnel.fr\n ```\n* Dans `[database]` :\n\n ```\n DB_TYPE = postgres\n HOST = 127.0.0.1:5432\n NAME = gitea\n USER = gitea\n PASSWD = votre_mot_de_passe\n SSL_MODE = disable # ou require selon votre config\n ```\n* Redémarrez Gitea après modification :\n\n ```bash\n sudo systemctl restart gitea\n ```\n\n---\n\n## 7. Sécuriser & entretien\n\n* Assurez-vous que seuls les ports nécessaires sont exposés (ex: 80/443 via proxy, 3000 en local si non exposé).\n* Faites des sauvegardes régulières : base PostgreSQL + dossier `/var/lib/gitea/data` (ou vos dépôts).\n* Vérifiez les logs de Gitea (souvent dans `/var/lib/gitea/log/`).\n* Gardez Gitea et PostgreSQL à jour.\n* Si vous utilisez SSH pour les repos Git, configurez correctement les clés SSH utilisateur et vérifiez que l’utilisateur `git` a bien les permissions.\n\n---\n\n\n[1]: https://docs.gitea.com/enterprise/installation/linux?utm_source=chatgpt.com \"Install on Linux | Gitea Enterprise Documentations\"\n[2]: https://docs.gitea.com/installation/install-from-binary?utm_source=chatgpt.com \"Installation from binary | Gitea Documentation\"\n[3]: https://docs.gitea.com/1.18/installation/install-from-binary?utm_source=chatgpt.com \"Installation from binary | Gitea Documentation\"\n[4]: https://docs.gitea.com/1.20/category/installation?utm_source=chatgpt.com \"Installation | Gitea Documentation\"\n[5]: https://git.jamesrskemp.com/hosting/gitea.html?utm_source=chatgpt.com \"Gitea - Git Commands by James Skemp\"\n","featured":false,"files_meta":[],"external_links":[],"tags":[]}
\ No newline at end of file
diff --git a/_cache/backlinks.json b/_cache/backlinks.json
index 75aecbd..0637a08 100644
--- a/_cache/backlinks.json
+++ b/_cache/backlinks.json
@@ -1 +1 @@
-{"post-install":[{"uuid":"0bba1ad7-e4cb-49a6-9467-fcfac2e09a93","slug":"deuxiemes-pas-devops-durcir-et-fiabiliser-un-serveur-debian","title":"Deuxièmes pas DevOps : durcir et fiabiliser un serveur Debian","cover":"cover.jpg","category":"informatique","published_at":"2026-06-08 07:00","created_at":"2026-05-12 23:01:34"}],"advanced-access-control-mechanisms-in-lte-and-5g-nr-networks":[{"uuid":"4f443bcb-b0d4-47f8-837d-61627e6c94f2","slug":"priorites-et-acces-au-reseau-en-4g-et-5g","title":"Pourquoi le réseau mobile ne s'effondre pas le jour où tout le monde téléphone en même temps","cover":"cover.jpg","category":"télécom","published_at":"2026-01-06 22:21","created_at":"2026-01-06 22:21:04"}]}
\ No newline at end of file
+[]
\ No newline at end of file
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_3b36733949021940-73450.jpg b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_3b36733949021940-73450.jpg
deleted file mode 100644
index ea61807..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_3b36733949021940-73450.jpg and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_442161d0a89ddd20-93141.png b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_442161d0a89ddd20-93141.png
deleted file mode 100644
index eb1ee32..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_442161d0a89ddd20-93141.png and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_6cf992e9f28c8172-4217.png b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_6cf992e9f28c8172-4217.png
deleted file mode 100644
index 625d316..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_6cf992e9f28c8172-4217.png and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_926396967ba5066a-5819.png b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_926396967ba5066a-5819.png
deleted file mode 100644
index 3f9de21..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_926396967ba5066a-5819.png and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_92af148c2c6c0f4e-30461.png b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_92af148c2c6c0f4e-30461.png
deleted file mode 100644
index f515aa3..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_92af148c2c6c0f4e-30461.png and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_d713074303b20cbd-5978.png b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_d713074303b20cbd-5978.png
deleted file mode 100644
index 768a78b..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_d713074303b20cbd-5978.png and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_da0580ecf0511076-371380.png b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_da0580ecf0511076-371380.png
deleted file mode 100644
index 18de4ca..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_da0580ecf0511076-371380.png and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_dae1b79a9d60ae4b-22161.jpg b/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_dae1b79a9d60ae4b-22161.jpg
deleted file mode 100644
index ded0547..0000000
Binary files a/a2487513-2848-4e62-bd19-d8ebb205e502/files/_thumb_dae1b79a9d60ae4b-22161.jpg and /dev/null differ
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/index.md b/a2487513-2848-4e62-bd19-d8ebb205e502/index.md
deleted file mode 100644
index c84e024..0000000
--- a/a2487513-2848-4e62-bd19-d8ebb205e502/index.md
+++ /dev/null
@@ -1,452 +0,0 @@
-# Progressive Web Apps — Dossier 2026
-
-## 1. Qu'est-ce qu'une PWA ?
-
-Une **Progressive Web App** est une application web qui, grâce à des APIs modernes des navigateurs, se comporte comme une application native : installable sur l'écran d'accueil, capable de fonctionner hors ligne, de recevoir des notifications push, de s'intégrer au système d'exploitation, tout en restant un site web indexable par les moteurs de recherche.
-
-Le mot clé est **progressive** : l'expérience s'enrichit selon les capacités du navigateur et de l'appareil. Sur un Chrome récent sous Android, la PWA offre une expérience proche du natif ; sur un vieux navigateur, elle reste un site web fonctionnel.
-
-Une PWA repose sur trois piliers techniques :
-
-- **HTTPS obligatoire** — sécurité et confiance, prérequis pour toutes les APIs sensibles.
-- **Service Worker** — un script JavaScript qui tourne en arrière-plan, intercepte les requêtes réseau, gère le cache et les notifications.
-- **Manifest** (`manifest.webmanifest`) — un fichier JSON qui décrit l'application (nom, icônes, couleurs, mode d'affichage) pour permettre son installation.
-
-Trois critères définissent une PWA selon Google : elle doit être **fiable** (charge instantanément, même hors ligne), **rapide** (réagit vite aux interactions) et **engageante** (sensation d'application native, réengagement par notifications).
-
-## 2. Histoire et promoteurs
-
-L'idée d'une convergence web/natif n'est pas neuve. Steve Jobs, en 2007, présentait initialement l'iPhone sans App Store : les développeurs étaient censés faire des « web apps ». L'App Store est arrivé un an plus tard et a marginalisé cette vision pendant près d'une décennie.
-
-Le terme **« Progressive Web App »** est proposé en 2015 par la designer Frances Berriman et l'ingénieur Google **Alex Russell**, pour désigner les sites tirant parti des nouvelles APIs (service workers notamment, standardisés à partir de 2014-2015).
-
-**Les promoteurs historiques :**
-
-- **Google** — moteur principal. Pousse la spécification, intègre les PWA à Chrome, Android, ChromeOS, et au Play Store (depuis 2019, on peut publier une PWA empaquetée via TWA — Trusted Web Activity).
-- **Microsoft** — second souffle majeur. Edge intègre les PWA nativement, et Windows permet leur publication au Microsoft Store via packaging MSIX. En mai 2025, Edge a ajouté les **App Actions on Windows** pour les PWA, améliorant la découvrabilité système.
-- **Mozilla** — soutien historique des standards, support solide dans Firefox (bien que l'installation desktop ait été retirée puis partiellement réintégrée selon les versions).
-- **Apple** — adoption lente et réticente, voir section 6.
-
-**Les premiers grands déploiements** (vers 2016-2017) ont servi de cas d'école : Twitter Lite, AliExpress, Pinterest, Flipkart, Starbucks, Uber, Tinder, Trivago. Tous ont publié des chiffres montrant des gains d'engagement et de conversion significatifs, ce qui a légitimé le modèle auprès des grandes entreprises.
-
-## 3. Comment ça marche techniquement
-
-### 3.1 Le manifeste
-
-Fichier JSON déclaratif qui dit au navigateur : « ce site est installable, voici comment il doit se présenter ».
-
-```json
-{
- "name": "Mon Application",
- "short_name": "MonApp",
- "start_url": "/",
- "display": "standalone",
- "background_color": "#ffffff",
- "theme_color": "#0066cc",
- "icons": [
- { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
- { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
- ]
-}
-```
-
-Référencé dans le HTML :
-
-```html
-
-
-```
-
-Le mode `display: standalone` retire la barre d'adresse au lancement depuis l'écran d'accueil ; `fullscreen` masque même la barre système.
-
-### 3.2 Le Service Worker
-
-Script JavaScript qui s'exécute dans un thread séparé, sans accès direct au DOM, et qui agit comme un **proxy programmable** entre l'application et le réseau.
-
-```javascript
-// sw.js
-const CACHE_NAME = 'app-v1';
-const ASSETS = ['/', '/index.html', '/styles.css', '/app.js', '/icons/icon-192.png'];
-
-// Installation : on précharge les ressources critiques
-self.addEventListener('install', (event) => {
- event.waitUntil(
- caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS))
- );
-});
-
-// Activation : on nettoie les anciens caches
-self.addEventListener('activate', (event) => {
- event.waitUntil(
- caches.keys().then((keys) =>
- Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k)))
- )
- );
-});
-
-// Fetch : stratégie cache-first, puis réseau en fallback
-self.addEventListener('fetch', (event) => {
- event.respondWith(
- caches.match(event.request).then((cached) => cached || fetch(event.request))
- );
-});
-```
-
-Enregistrement depuis la page principale :
-
-```javascript
-if ('serviceWorker' in navigator) {
- navigator.serviceWorker.register('/sw.js');
-}
-```
-
-### 3.3 Stratégies de cache
-
-Quatre patterns canoniques selon le type de ressource :
-
-- **Cache-first** — sert le cache, va sur le réseau si absent. Idéal pour les assets statiques (CSS, JS, polices).
-- **Network-first** — tente le réseau, retombe sur le cache en cas d'échec. Idéal pour les contenus dynamiques (articles, posts).
-- **Stale-while-revalidate** — sert le cache immédiatement, met à jour en arrière-plan. Bon compromis pour les contenus semi-dynamiques (listes, avatars).
-- **Network-only / Cache-only** — cas particuliers (analytics, données critiques).
-
-### 3.4 Les APIs modernes mobilisables
-
-En 2026, l'écosystème PWA s'appuie sur un éventail large :
-
-- **Push API + Notifications API** — notifications push, y compris sur iOS 16.4+ (sous conditions).
-- **Background Sync** — différer une requête jusqu'au retour de la connectivité (Chrome/Edge ; pas sur iOS).
-- **Periodic Background Sync** — déclencher du code à intervalle régulier (Chrome/Edge uniquement).
-- **Web Share API** — utiliser le menu de partage natif du système.
-- **File System Access API** — lire/écrire dans des fichiers locaux (Chrome/Edge).
-- **WebGPU, WebAssembly SIMD, WebNN** — calcul intensif et inférence IA côté client.
-- **Badging API** — afficher un badge numérique sur l'icône d'app.
-- **Web Bluetooth, Web USB, Web Serial** — accès matériel (Chrome/Edge, hors iOS).
-- **Payment Request API** — paiements unifiés, dont Apple Pay sur Safari.
-
-## 4. Exemples emblématiques
-
-Les références suivantes ont structuré la perception du modèle PWA. Les chiffres sont ceux publiés par les entreprises à l'époque de leur migration.
-
-**Twitter Lite** (2017) — Twitter a déployé une PWA pesant moins de 1 Mo (contre 23 Mo pour l'app native Android). Résultat : +65 % de pages par session, +75 % de tweets envoyés, −20 % de taux de rebond. Nicolas Gallagher, alors lead du projet, résumait : « Twitter Lite is now the fastest, least expensive, and most reliable way to use Twitter. »
-
-**AliExpress** — Migration de leur site mobile vers une PWA. Doublement du temps passé par session, +104 % de taux de conversion pour les nouveaux utilisateurs sur tous les navigateurs.
-
-**Pinterest** — Refonte en PWA en 2017. Le poids initial du bundle JavaScript est passé de 650 Ko à 150 Ko. Temps passé +40 %, revenus publicitaires +44 %, engagement utilisateur +60 %.
-
-**Starbucks** — Une PWA pour la commande en ligne, environ 600 Ko (contre 148 Mo pour l'app iOS native). Double des commandes quotidiennes via le web, avec des chiffres particulièrement marqués sur les marchés à faible bande passante.
-
-**Spotify, Uber, Tinder, Trivago, BMW, Forbes, The Washington Post** — Tous ont déployé des versions PWA, soit en remplacement de leur site mobile, soit en complément de l'app native.
-
-**Note d'objectivité :** ces cas remontent majoritairement à 2017-2019. Beaucoup ont été suivis d'allers-retours stratégiques (certaines entreprises ont depuis re-priorisé le natif pour des raisons de fonctionnalités ou de distribution). Twitter, par exemple, a depuis fait évoluer son web app et son app native en parallèle. Ces chiffres restent illustratifs d'un potentiel, pas d'une vérité universelle.
-
-## 5. Où en est-on en 2026 ?
-
-### 5.1 Maturité du modèle
-
-Trois leviers ont fait basculer les PWA d'une expérimentation à une option pragmatique :
-
-1. **Maturité des APIs clés** — service worker stable, manifest standardisé, Web Push enfin disponible sur Safari (iOS 16.4+).
-2. **Intégration croissante par les OS et stores** — packaging MSIX vers le Microsoft Store, TWA vers le Play Store, App Actions sur Windows, mode app par défaut sur iOS 26.
-3. **Preuves de ROI répétées** sur une décennie de déploiements.
-
-### 5.2 Chiffres du marché
-
-Les estimations convergent vers une croissance soutenue. Selon Research Nester, le marché mondial des PWA dépassait 2,47 Md$ en 2025, est estimé à 3,14 Md$ en 2026, avec une projection à 34,58 Md$ d'ici 2035 (TCAC supérieur à 30 %).
-
-L'adoption reste cependant **concentrée** : selon les datasets publics (HTTP Archive / Web Almanac), une fraction modeste des sites déclarent un service worker, mais ces sites représentent une part disproportionnée du trafic mondial — autrement dit, ce sont les gros sites qui adoptent.
-
-### 5.3 Nouveautés récentes
-
-- **Declarative Web Push** (Safari 18.4, 2025) — alternative simplifiée au Web Push impératif, ne nécessitant pas de service worker pour des notifications basiques.
-- **App Actions on Windows** pour les PWA (Edge, mai 2025) — les PWA peuvent déclarer des actions invocables depuis la barre de recherche Windows.
-- **iOS 26** — tout site ajouté à l'écran d'accueil s'ouvre par défaut en mode application, même sans manifest. Avancée notable côté Apple.
-- **WebGPU, WebNN, WebAssembly SIMD** — débloquent l'inférence IA côté client, ouvrant la voie à des PWA capables de traitements lourds locaux (vision, NLP, recommandation).
-
-### 5.4 Verrous résiduels
-
-- **Découvrabilité** — beaucoup d'utilisateurs ne savent pas qu'« ajouter à l'écran d'accueil » installe une vraie app. Pas de prompt automatique sur iOS.
-- **Fragmentation des APIs** — Chrome/Edge avancent vite, Safari traîne, Firefox se positionne au cas par cas. Le détection de feature reste obligatoire.
-- **Stockage** — quotas plus stricts sur iOS qu'ailleurs, avec un risque d'éviction du cache après 7 jours sans utilisation sur certaines configurations.
-- **Monétisation** — pas de système intégré de paiement in-app comme l'App Store. Il faut passer par Stripe, Apple Pay via Payment Request, etc.
-
-## 6. Le cas iOS : limites et particularités
-
-Apple a toujours été le frein principal à l'adoption universelle des PWA. Les raisons sont à la fois techniques et stratégiques (revenus de l'App Store, contrôle de la plateforme, monopole de WebKit).
-
-**Ce qui marche en 2026 sur iOS :**
-
-- Installation manuelle sur l'écran d'accueil (mais pas de prompt automatique).
-- Mode standalone (fenêtre sans barre d'adresse).
-- Service workers (avec des quotas et limitations).
-- Push notifications, **uniquement si la PWA a été installée à l'écran d'accueil** (depuis iOS 16.4).
-- Apple Pay via Payment Request API.
-- Géolocalisation, caméra, microphone.
-
-**Ce qui ne marche pas ou mal :**
-
-- Pas de Background Sync ni de Periodic Background Sync.
-- Pas de Web Bluetooth, Web USB, Web NFC.
-- Stockage limité, susceptible d'être purgé sans usage.
-- Pas de silent push ni de réveil en arrière-plan.
-- L'audience effectivement joignable par push est environ 10 à 15 fois plus petite que sur app native, une fois pris en compte le parcours d'installation multi-étapes.
-
-**Le détour DMA en Europe :** en 2024, Apple a brièvement annoncé supprimer le mode standalone pour les PWA dans l'UE (iOS 17.4) au prétexte du Digital Markets Act, ce qui aurait réduit les PWA à de simples raccourcis Safari. Décision rapidement annulée après tollé : le support PWA complet a été rétabli dans l'UE. Épisode révélateur de la position ambiguë d'Apple.
-
-**Verdict pratique 2026 :** Apple a fait des progrès (push en 16.4, Declarative Web Push en 18.4, app mode par défaut en iOS 26), mais à un rythme lent et avec des marges de manœuvre étroites. Pour un projet ciblant fortement iOS et reposant sur du push fiable, du background sync ou de l'intégration profonde au système, le natif (ou hybride) reste l'option plus sûre.
-
-## 7. PWA vs natif vs hybride
-
-| Critère | PWA | Natif (iOS/Android) | Hybride (RN, Flutter) |
-|---|---|---|---|
-| Codebase | Unique (web) | 2 séparés | 1 partagé, ponts natifs |
-| Distribution | URL + stores optionnels | App Store, Play Store obligatoires | Stores obligatoires |
-| Mises à jour | Instantanées | Validation store (jours) | Validation store |
-| Découvrabilité SEO | Oui (indexé Google) | Non | Non |
-| Coût de dev (typique) | 1× | 2-3× | 1,3-1,8× |
-| Performance UI | Bonne à très bonne | Maximale | Très bonne |
-| Accès matériel | Partiel, variable selon OS | Total | Quasi-total |
-| Notifications push iOS | Oui, sous conditions | Oui, sans conditions | Oui |
-| Frais store (achats numériques) | 0 % | 15-30 % | 15-30 % |
-| Hors ligne | Oui via service worker | Oui | Oui |
-
-**Quand choisir une PWA**
-
-- Audience web-first (desktop + mobile navigateur).
-- SEO comme canal d'acquisition stratégique.
-- Time-to-market et coût de maintenance prioritaires.
-- Contenu plutôt que fonctionnalités matérielles avancées.
-- Marchés émergents (stockage, bande passante limités).
-- Outils internes B2B, portails, contenus éditoriaux, e-commerce léger.
-
-**Quand préférer le natif**
-
-- Accès matériel profond (BLE, NFC, capteurs avancés, ARKit/ARCore).
-- Performances graphiques 120 fps, jeux, AR/VR.
-- Monétisation reposant sur l'achat in-app via stores.
-- Marque dépendant fortement de la présence App Store/Play Store.
-
-**Quand choisir hybride (React Native, Flutter)**
-
-- Présence store nécessaire mais sans le budget de deux codebases natives.
-- Équipe JavaScript ou Dart.
-- Besoins matériels modérés mais réels.
-
-## 8. Pour commencer : un MVP en 4 fichiers
-
-Voici la PWA minimale viable. Quatre fichiers, aucun framework, déployable sur n'importe quel hébergement HTTPS.
-
-### `index.html`
-
-```html
-
-
-
-
-
- Ma PWA
-
-
-
-
-
-
Bonjour
-
Ceci est une PWA.
-
-
-
-```
-
-### `manifest.webmanifest`
-
-```json
-{
- "name": "Ma Progressive Web App",
- "short_name": "MaPWA",
- "description": "Démonstration minimale d'une PWA.",
- "start_url": "/",
- "scope": "/",
- "display": "standalone",
- "orientation": "portrait",
- "background_color": "#ffffff",
- "theme_color": "#0066cc",
- "icons": [
- {
- "src": "/icons/icon-192.png",
- "sizes": "192x192",
- "type": "image/png",
- "purpose": "any maskable"
- },
- {
- "src": "/icons/icon-512.png",
- "sizes": "512x512",
- "type": "image/png",
- "purpose": "any maskable"
- }
- ]
-}
-```
-
-### `sw.js`
-
-```javascript
-const CACHE_NAME = 'mapwa-v1';
-const PRECACHE = [
- '/',
- '/index.html',
- '/manifest.webmanifest',
- '/icons/icon-192.png',
- '/icons/icon-512.png'
-];
-
-self.addEventListener('install', (event) => {
- event.waitUntil(
- caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE))
- );
- self.skipWaiting();
-});
-
-self.addEventListener('activate', (event) => {
- event.waitUntil(
- caches.keys().then((keys) =>
- Promise.all(
- keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))
- )
- )
- );
- self.clients.claim();
-});
-
-self.addEventListener('fetch', (event) => {
- // Stale-while-revalidate pour les navigations
- if (event.request.mode === 'navigate') {
- event.respondWith(
- caches.match(event.request).then((cached) => {
- const fresh = fetch(event.request).then((response) => {
- caches.open(CACHE_NAME).then((c) => c.put(event.request, response.clone()));
- return response;
- }).catch(() => cached);
- return cached || fresh;
- })
- );
- return;
- }
- // Cache-first pour le reste
- event.respondWith(
- caches.match(event.request).then((cached) => cached || fetch(event.request))
- );
-});
-```
-
-### Icônes
-
-Deux fichiers PNG : `icons/icon-192.png` (192×192) et `icons/icon-512.png` (512×512). L'attribut `purpose: "any maskable"` permet à Android de découper l'icône selon la forme système (cercle, squircle, etc.).
-
-**Servir le tout en HTTPS** (obligatoire en production ; `localhost` fonctionne en dev). Configuration nginx/Apache : s'assurer que `manifest.webmanifest` est servi avec le content-type `application/manifest+json` et que `sw.js` n'est jamais mis en cache HTTP côté navigateur (sinon les mises à jour ne se propagent pas).
-
-```nginx
-location = /sw.js {
- add_header Cache-Control "no-store, no-cache, must-revalidate";
- expires off;
-}
-
-location = /manifest.webmanifest {
- add_header Content-Type "application/manifest+json";
-}
-```
-
-**Tester avec Lighthouse** (intégré à Chrome DevTools, onglet *Lighthouse* puis catégorie *Progressive Web App*) — fournit un score, identifie les manques, propose des corrections.
-
-## 9. Outils et frameworks
-
-**Workbox** (Google) — la bibliothèque de référence pour les service workers. Génère du SW à partir de configurations déclaratives, gère les stratégies de cache, le préchargement, la mise à jour. Souvent utilisée via un plugin de bundler.
-
-**Vite PWA Plugin** (`vite-plugin-pwa`) — l'option la plus simple pour un projet moderne basé sur Vite. Wrap Workbox, génère manifest et SW automatiquement.
-
-**Next.js** — supporte les PWA via `next-pwa` (basé sur Workbox).
-
-**Nuxt** — `@vite-pwa/nuxt` officiel.
-
-**Angular, Vue, Svelte** — tous disposent d'intégrations PWA officielles ou bien maintenues.
-
-**PWA Builder** (Microsoft) — outil web qui audit un site et génère le packaging pour les stores (MSIX pour Microsoft, TWA pour Play Store).
-
-**Lighthouse** — audit intégré à Chrome DevTools. Standard de fait pour vérifier la conformité PWA.
-
-**Côté PHP (pertinent au regard du contexte de cette doc)** — Symfony et Laravel n'ont pas d'extension PWA officielle, mais l'intégration est triviale puisqu'une PWA n'exige côté serveur que de servir correctement quelques fichiers statiques en HTTPS. Bundles comme `friendsofsymfony/elastica-bundle` ne couvrent pas le sujet ; c'est plutôt à l'asset pipeline (Webpack Encore, Vite) de gérer la génération du service worker.
-
-## 10. Pièges fréquents et bonnes pratiques
-
-**Le service worker piégé en cache** — `sw.js` lui-même ne doit jamais être mis en cache HTTP, sinon les utilisateurs restent bloqués sur une ancienne version. `Cache-Control: no-store` strict côté serveur.
-
-**Versionner le cache** — toujours inclure une version dans le nom du cache (`mapwa-v1`, `mapwa-v2`...) et purger les anciens à l'activation. Sans cela, des assets périmés peuvent persister indéfiniment.
-
-**Ne pas tout cacher** — précharger uniquement le strict nécessaire au shell de l'application. Le reste doit être mis en cache à la demande, avec une stratégie adaptée.
-
-**Tester hors ligne** — Chrome DevTools propose un mode *Offline* dans l'onglet *Network*. C'est le seul moyen de vérifier que les stratégies de cache fonctionnent.
-
-**Gérer la mise à jour** — quand un nouveau service worker est détecté, il s'installe mais n'est actif qu'après fermeture de tous les onglets de la PWA. Soit forcer via `skipWaiting()` + `clients.claim()` (rapide mais peut casser une session en cours), soit afficher à l'utilisateur une bannière « nouvelle version disponible ».
-
-**Détection de feature, jamais détection de navigateur** — `if ('serviceWorker' in navigator)`, `if ('PushManager' in window)`. Ne jamais sniffer `userAgent`.
-
-**Tester sur iOS réel** — l'émulateur Safari ne reproduit pas toutes les limitations. Un iPhone physique est indispensable pour valider l'expérience.
-
-**HTTPS impératif** — même en pré-prod. Les certificats Let's Encrypt sont gratuits ; un reverse proxy bien configuré (Caddy, nginx, Traefik) suffit. *NB : ce point recoupe directement la configuration habituelle d'un homelab avec reverse proxy.*
-
-**Manifest et icônes adaptatives** — utiliser `purpose: "maskable"` avec des icônes ayant une zone de sécurité de ~10 % autour du contenu, sinon Android va découper dans le visuel.
-
-**Pas de prompt d'installation intrusif** — Chrome déclenche automatiquement un mini-info-bar quand les critères PWA sont remplis. Si on veut un prompt personnalisé, intercepter l'événement `beforeinstallprompt` et le déclencher au moment opportun (jamais au premier chargement).
-
-```javascript
-let deferredPrompt;
-window.addEventListener('beforeinstallprompt', (e) => {
- e.preventDefault();
- deferredPrompt = e;
- // Afficher un bouton « Installer » dans l'UI
- document.querySelector('#install-btn').hidden = false;
-});
-
-document.querySelector('#install-btn').addEventListener('click', async () => {
- if (!deferredPrompt) return;
- deferredPrompt.prompt();
- const { outcome } = await deferredPrompt.userChoice;
- console.log('Choix utilisateur :', outcome);
- deferredPrompt = null;
-});
-```
-
-## 11. Ressources
-
-**Documentation officielle**
-
-- web.dev — section *Progressive Web Apps* : https://web.dev/explore/progressive-web-apps
-- MDN Web Docs — *Progressive web apps* : https://developer.mozilla.org/fr/docs/Web/Progressive_web_apps
-- Apple Developer — *Sending web push notifications* : https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers
-- Microsoft Edge — *PWA on Windows* : https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/
-
-**Outils**
-
-- Workbox : https://developer.chrome.com/docs/workbox
-- PWA Builder : https://www.pwabuilder.com/
-- Lighthouse : intégré à Chrome DevTools, ou via CLI `npm i -g @lhci/cli`
-
-**Veille**
-
-- *Web Almanac* (HTTP Archive) — rapport annuel sur l'état du web, chapitre PWA.
-- *Can I Use* : https://caniuse.com/ — compatibilité navigateur pour chaque API.
-
-**Études de cas**
-
-- web.dev cases : https://web.dev/case-studies
-
-
----
-
-*Document de référence — état au 13 mai 2026. À revoir tous les 6 à 12 mois, l'écosystème évoluant rapidement (notamment côté Apple).*
\ No newline at end of file
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/meta.json b/a2487513-2848-4e62-bd19-d8ebb205e502/meta.json
deleted file mode 100644
index 783562a..0000000
--- a/a2487513-2848-4e62-bd19-d8ebb205e502/meta.json
+++ /dev/null
@@ -1,188 +0,0 @@
-{
- "uuid": "a2487513-2848-4e62-bd19-d8ebb205e502",
- "slug": "progressive-web-apps-dossier-2026",
- "title": "Progressive Web Apps — Dossier 2026",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2026-05-15 07:53",
- "created_at": "2026-05-13 18:58:29",
- "updated_at": "2026-05-13 19:06:33",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-13 19:02:08",
- "comment": "Contenu modifié",
- "title": "Progressive Web Apps — Dossier 2026"
- }
- ],
- "cover": "cover.jpg",
- "files_meta": {
- "cover.jpg": {
- "author": "",
- "source_url": "https://www.pragimtech.com/blog/contribute/article_images/1220210424145927/progressive-web-apps.jpg"
- },
- "_thumb_3b36733949021940-73450.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_6cf992e9f28c8172-4217.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_442161d0a89ddd20-93141.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_926396967ba5066a-5819.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_92af148c2c6c0f4e-30461.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_d713074303b20cbd-5978.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_da0580ecf0511076-371380.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_dae1b79a9d60ae4b-22161.jpg": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [
- {
- "url": "http://pwastats.com/",
- "name": "PWA Stats",
- "added_at": "2026-05-13 19:01:07",
- "meta": {
- "mime": "text/html",
- "size": 7116,
- "description": "A collection of Progressive Web App case studies.",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_6cf992e9f28c8172-4217.png",
- "site_name": "PWA Stats",
- "og_type": "website"
- }
- },
- {
- "url": "https://web.dev/case-studies",
- "name": "Case studies",
- "added_at": "2026-05-13 19:02:00",
- "meta": {
- "mime": "text/html",
- "size": 14236,
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_3b36733949021940-73450.jpg",
- "site_name": "web.dev",
- "og_type": "website",
- "language": "en",
- "canonical": "https://web.dev/case-studies"
- }
- },
- {
- "url": "https://almanac.httparchive.org/",
- "name": "The 2025 Web Almanac",
- "added_at": "2026-05-13 19:03:37",
- "author": "Rick Viscomi",
- "meta": {
- "mime": "text/html",
- "size": 15541,
- "description": "The Web Almanac is an annual state of the web report combining the expertise of the web community with the data and trends of the HTTP Archive.",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_92af148c2c6c0f4e-30461.png",
- "og_type": "article",
- "date": "2025-12-09T00:00:00.000Z",
- "canonical": "https://almanac.httparchive.org/en/2025/"
- }
- },
- {
- "url": "https://www.pwabuilder.com/",
- "name": "PWABuilder",
- "added_at": "2026-05-13 19:03:54",
- "meta": {
- "mime": "text/html",
- "size": 2467,
- "description": "Publish your Progressive Web App (PWA) to app stores",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_da0580ecf0511076-371380.png",
- "og_type": "website"
- }
- },
- {
- "url": "https://developer.chrome.com/docs/workbox",
- "name": "Workbox",
- "added_at": "2026-05-13 19:04:09",
- "meta": {
- "mime": "text/html",
- "size": 19258,
- "description": "Build progressive web apps (PWAs) with Workbox - the Service Worker library from the Chrome team",
- "site_name": "Chrome for Developers",
- "og_type": "website",
- "language": "en",
- "canonical": "https://developer.chrome.com/docs/workbox",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_926396967ba5066a-5819.png"
- }
- },
- {
- "url": "https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/",
- "name": "Overview of Progressive Web Apps (PWAs) - Microsoft Edge Developer documentation | Microsoft Learn",
- "added_at": "2026-05-13 19:04:29",
- "author": "MSEdgeTeam",
- "meta": {
- "mime": "text/html",
- "size": 53645,
- "description": "Progressive Web Apps (PWAs) run natively on Windows 10 or later. Here's everything you need to know about PWAs, as a web developer.",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_442161d0a89ddd20-93141.png",
- "og_type": "website",
- "canonical": "https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps/"
- }
- },
- {
- "url": "https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers",
- "name": "Sending web push notifications in web apps and browsers | Apple Developer Documentation",
- "added_at": "2026-05-13 19:04:48",
- "meta": {
- "mime": "text/html",
- "size": 3840,
- "description": "Update your web server and website to send push notifications that work in Safari, other browsers, and web apps, following cross-browser standards.",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_dae1b79a9d60ae4b-22161.jpg",
- "site_name": "Apple Developer Documentation",
- "og_type": "website",
- "language": "en_US"
- }
- },
- {
- "url": "https://developer.mozilla.org/fr/docs/Web/Progressive_web_apps",
- "name": "Applications web progressives | MDN",
- "added_at": "2026-05-13 19:05:14",
- "meta": {
- "mime": "text/html",
- "size": 18140,
- "description": "Les applications web progressives (ou progressive web applications en anglais, abrégées en PWAs) sont des applications web qui utilisent les service workers, les manifestes, et d'autres fonctionnalités de la plateforme web, avec l'amélioration progressive pour fournir aux utilisatrices et utilisateurs une expérience équivalente à celle des applications natives.",
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_d713074303b20cbd-5978.png",
- "site_name": "MDN Web Docs",
- "language": "fr",
- "canonical": "https://developer.mozilla.org/fr/docs/Web/Progressive_web_apps"
- }
- },
- {
- "url": "https://web.dev/explore/progressive-web-apps",
- "name": "Progressive Web Apps | web.dev",
- "added_at": "2026-05-13 19:06:29",
- "meta": {
- "mime": "text/html",
- "size": 16488,
- "og_image": "/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=_thumb_3b36733949021940-73450.jpg",
- "site_name": "web.dev",
- "og_type": "website",
- "language": "en",
- "canonical": "https://web.dev/explore/progressive-web-apps"
- }
- }
- ],
- "seo_title": "",
- "seo_description": "",
- "og_image": "https://varlog.a5l.fr/file?uuid=a2487513-2848-4e62-bd19-d8ebb205e502&name=cover.jpg",
- "category": ""
-}
diff --git a/a2487513-2848-4e62-bd19-d8ebb205e502/revisions/0001.md b/a2487513-2848-4e62-bd19-d8ebb205e502/revisions/0001.md
deleted file mode 100644
index 3e95a1e..0000000
--- a/a2487513-2848-4e62-bd19-d8ebb205e502/revisions/0001.md
+++ /dev/null
@@ -1,450 +0,0 @@
-## 1. Qu'est-ce qu'une PWA ?
-
-Une **Progressive Web App** est une application web qui, grâce à des APIs modernes des navigateurs, se comporte comme une application native : installable sur l'écran d'accueil, capable de fonctionner hors ligne, de recevoir des notifications push, de s'intégrer au système d'exploitation, tout en restant un site web indexable par les moteurs de recherche.
-
-Le mot clé est **progressive** : l'expérience s'enrichit selon les capacités du navigateur et de l'appareil. Sur un Chrome récent sous Android, la PWA offre une expérience proche du natif ; sur un vieux navigateur, elle reste un site web fonctionnel.
-
-Une PWA repose sur trois piliers techniques :
-
-- **HTTPS obligatoire** — sécurité et confiance, prérequis pour toutes les APIs sensibles.
-- **Service Worker** — un script JavaScript qui tourne en arrière-plan, intercepte les requêtes réseau, gère le cache et les notifications.
-- **Manifest** (`manifest.webmanifest`) — un fichier JSON qui décrit l'application (nom, icônes, couleurs, mode d'affichage) pour permettre son installation.
-
-Trois critères définissent une PWA selon Google : elle doit être **fiable** (charge instantanément, même hors ligne), **rapide** (réagit vite aux interactions) et **engageante** (sensation d'application native, réengagement par notifications).
-
-## 2. Histoire et promoteurs
-
-L'idée d'une convergence web/natif n'est pas neuve. Steve Jobs, en 2007, présentait initialement l'iPhone sans App Store : les développeurs étaient censés faire des « web apps ». L'App Store est arrivé un an plus tard et a marginalisé cette vision pendant près d'une décennie.
-
-Le terme **« Progressive Web App »** est proposé en 2015 par la designer Frances Berriman et l'ingénieur Google **Alex Russell**, pour désigner les sites tirant parti des nouvelles APIs (service workers notamment, standardisés à partir de 2014-2015).
-
-**Les promoteurs historiques :**
-
-- **Google** — moteur principal. Pousse la spécification, intègre les PWA à Chrome, Android, ChromeOS, et au Play Store (depuis 2019, on peut publier une PWA empaquetée via TWA — Trusted Web Activity).
-- **Microsoft** — second souffle majeur. Edge intègre les PWA nativement, et Windows permet leur publication au Microsoft Store via packaging MSIX. En mai 2025, Edge a ajouté les **App Actions on Windows** pour les PWA, améliorant la découvrabilité système.
-- **Mozilla** — soutien historique des standards, support solide dans Firefox (bien que l'installation desktop ait été retirée puis partiellement réintégrée selon les versions).
-- **Apple** — adoption lente et réticente, voir section 6.
-
-**Les premiers grands déploiements** (vers 2016-2017) ont servi de cas d'école : Twitter Lite, AliExpress, Pinterest, Flipkart, Starbucks, Uber, Tinder, Trivago. Tous ont publié des chiffres montrant des gains d'engagement et de conversion significatifs, ce qui a légitimé le modèle auprès des grandes entreprises.
-
-## 3. Comment ça marche techniquement
-
-### 3.1 Le manifeste
-
-Fichier JSON déclaratif qui dit au navigateur : « ce site est installable, voici comment il doit se présenter ».
-
-```json
-{
- "name": "Mon Application",
- "short_name": "MonApp",
- "start_url": "/",
- "display": "standalone",
- "background_color": "#ffffff",
- "theme_color": "#0066cc",
- "icons": [
- { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
- { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
- ]
-}
-```
-
-Référencé dans le HTML :
-
-```html
-
-
-```
-
-Le mode `display: standalone` retire la barre d'adresse au lancement depuis l'écran d'accueil ; `fullscreen` masque même la barre système.
-
-### 3.2 Le Service Worker
-
-Script JavaScript qui s'exécute dans un thread séparé, sans accès direct au DOM, et qui agit comme un **proxy programmable** entre l'application et le réseau.
-
-```javascript
-// sw.js
-const CACHE_NAME = 'app-v1';
-const ASSETS = ['/', '/index.html', '/styles.css', '/app.js', '/icons/icon-192.png'];
-
-// Installation : on précharge les ressources critiques
-self.addEventListener('install', (event) => {
- event.waitUntil(
- caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS))
- );
-});
-
-// Activation : on nettoie les anciens caches
-self.addEventListener('activate', (event) => {
- event.waitUntil(
- caches.keys().then((keys) =>
- Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k)))
- )
- );
-});
-
-// Fetch : stratégie cache-first, puis réseau en fallback
-self.addEventListener('fetch', (event) => {
- event.respondWith(
- caches.match(event.request).then((cached) => cached || fetch(event.request))
- );
-});
-```
-
-Enregistrement depuis la page principale :
-
-```javascript
-if ('serviceWorker' in navigator) {
- navigator.serviceWorker.register('/sw.js');
-}
-```
-
-### 3.3 Stratégies de cache
-
-Quatre patterns canoniques selon le type de ressource :
-
-- **Cache-first** — sert le cache, va sur le réseau si absent. Idéal pour les assets statiques (CSS, JS, polices).
-- **Network-first** — tente le réseau, retombe sur le cache en cas d'échec. Idéal pour les contenus dynamiques (articles, posts).
-- **Stale-while-revalidate** — sert le cache immédiatement, met à jour en arrière-plan. Bon compromis pour les contenus semi-dynamiques (listes, avatars).
-- **Network-only / Cache-only** — cas particuliers (analytics, données critiques).
-
-### 3.4 Les APIs modernes mobilisables
-
-En 2026, l'écosystème PWA s'appuie sur un éventail large :
-
-- **Push API + Notifications API** — notifications push, y compris sur iOS 16.4+ (sous conditions).
-- **Background Sync** — différer une requête jusqu'au retour de la connectivité (Chrome/Edge ; pas sur iOS).
-- **Periodic Background Sync** — déclencher du code à intervalle régulier (Chrome/Edge uniquement).
-- **Web Share API** — utiliser le menu de partage natif du système.
-- **File System Access API** — lire/écrire dans des fichiers locaux (Chrome/Edge).
-- **WebGPU, WebAssembly SIMD, WebNN** — calcul intensif et inférence IA côté client.
-- **Badging API** — afficher un badge numérique sur l'icône d'app.
-- **Web Bluetooth, Web USB, Web Serial** — accès matériel (Chrome/Edge, hors iOS).
-- **Payment Request API** — paiements unifiés, dont Apple Pay sur Safari.
-
-## 4. Exemples emblématiques
-
-Les références suivantes ont structuré la perception du modèle PWA. Les chiffres sont ceux publiés par les entreprises à l'époque de leur migration.
-
-**Twitter Lite** (2017) — Twitter a déployé une PWA pesant moins de 1 Mo (contre 23 Mo pour l'app native Android). Résultat : +65 % de pages par session, +75 % de tweets envoyés, −20 % de taux de rebond. Nicolas Gallagher, alors lead du projet, résumait : « Twitter Lite is now the fastest, least expensive, and most reliable way to use Twitter. »
-
-**AliExpress** — Migration de leur site mobile vers une PWA. Doublement du temps passé par session, +104 % de taux de conversion pour les nouveaux utilisateurs sur tous les navigateurs.
-
-**Pinterest** — Refonte en PWA en 2017. Le poids initial du bundle JavaScript est passé de 650 Ko à 150 Ko. Temps passé +40 %, revenus publicitaires +44 %, engagement utilisateur +60 %.
-
-**Starbucks** — Une PWA pour la commande en ligne, environ 600 Ko (contre 148 Mo pour l'app iOS native). Double des commandes quotidiennes via le web, avec des chiffres particulièrement marqués sur les marchés à faible bande passante.
-
-**Spotify, Uber, Tinder, Trivago, BMW, Forbes, The Washington Post** — Tous ont déployé des versions PWA, soit en remplacement de leur site mobile, soit en complément de l'app native.
-
-**Note d'objectivité :** ces cas remontent majoritairement à 2017-2019. Beaucoup ont été suivis d'allers-retours stratégiques (certaines entreprises ont depuis re-priorisé le natif pour des raisons de fonctionnalités ou de distribution). Twitter, par exemple, a depuis fait évoluer son web app et son app native en parallèle. Ces chiffres restent illustratifs d'un potentiel, pas d'une vérité universelle.
-
-## 5. Où en est-on en 2026 ?
-
-### 5.1 Maturité du modèle
-
-Trois leviers ont fait basculer les PWA d'une expérimentation à une option pragmatique :
-
-1. **Maturité des APIs clés** — service worker stable, manifest standardisé, Web Push enfin disponible sur Safari (iOS 16.4+).
-2. **Intégration croissante par les OS et stores** — packaging MSIX vers le Microsoft Store, TWA vers le Play Store, App Actions sur Windows, mode app par défaut sur iOS 26.
-3. **Preuves de ROI répétées** sur une décennie de déploiements.
-
-### 5.2 Chiffres du marché
-
-Les estimations convergent vers une croissance soutenue. Selon Research Nester, le marché mondial des PWA dépassait 2,47 Md$ en 2025, est estimé à 3,14 Md$ en 2026, avec une projection à 34,58 Md$ d'ici 2035 (TCAC supérieur à 30 %).
-
-L'adoption reste cependant **concentrée** : selon les datasets publics (HTTP Archive / Web Almanac), une fraction modeste des sites déclarent un service worker, mais ces sites représentent une part disproportionnée du trafic mondial — autrement dit, ce sont les gros sites qui adoptent.
-
-### 5.3 Nouveautés récentes
-
-- **Declarative Web Push** (Safari 18.4, 2025) — alternative simplifiée au Web Push impératif, ne nécessitant pas de service worker pour des notifications basiques.
-- **App Actions on Windows** pour les PWA (Edge, mai 2025) — les PWA peuvent déclarer des actions invocables depuis la barre de recherche Windows.
-- **iOS 26** — tout site ajouté à l'écran d'accueil s'ouvre par défaut en mode application, même sans manifest. Avancée notable côté Apple.
-- **WebGPU, WebNN, WebAssembly SIMD** — débloquent l'inférence IA côté client, ouvrant la voie à des PWA capables de traitements lourds locaux (vision, NLP, recommandation).
-
-### 5.4 Verrous résiduels
-
-- **Découvrabilité** — beaucoup d'utilisateurs ne savent pas qu'« ajouter à l'écran d'accueil » installe une vraie app. Pas de prompt automatique sur iOS.
-- **Fragmentation des APIs** — Chrome/Edge avancent vite, Safari traîne, Firefox se positionne au cas par cas. Le détection de feature reste obligatoire.
-- **Stockage** — quotas plus stricts sur iOS qu'ailleurs, avec un risque d'éviction du cache après 7 jours sans utilisation sur certaines configurations.
-- **Monétisation** — pas de système intégré de paiement in-app comme l'App Store. Il faut passer par Stripe, Apple Pay via Payment Request, etc.
-
-## 6. Le cas iOS : limites et particularités
-
-Apple a toujours été le frein principal à l'adoption universelle des PWA. Les raisons sont à la fois techniques et stratégiques (revenus de l'App Store, contrôle de la plateforme, monopole de WebKit).
-
-**Ce qui marche en 2026 sur iOS :**
-
-- Installation manuelle sur l'écran d'accueil (mais pas de prompt automatique).
-- Mode standalone (fenêtre sans barre d'adresse).
-- Service workers (avec des quotas et limitations).
-- Push notifications, **uniquement si la PWA a été installée à l'écran d'accueil** (depuis iOS 16.4).
-- Apple Pay via Payment Request API.
-- Géolocalisation, caméra, microphone.
-
-**Ce qui ne marche pas ou mal :**
-
-- Pas de Background Sync ni de Periodic Background Sync.
-- Pas de Web Bluetooth, Web USB, Web NFC.
-- Stockage limité, susceptible d'être purgé sans usage.
-- Pas de silent push ni de réveil en arrière-plan.
-- L'audience effectivement joignable par push est environ 10 à 15 fois plus petite que sur app native, une fois pris en compte le parcours d'installation multi-étapes.
-
-**Le détour DMA en Europe :** en 2024, Apple a brièvement annoncé supprimer le mode standalone pour les PWA dans l'UE (iOS 17.4) au prétexte du Digital Markets Act, ce qui aurait réduit les PWA à de simples raccourcis Safari. Décision rapidement annulée après tollé : le support PWA complet a été rétabli dans l'UE. Épisode révélateur de la position ambiguë d'Apple.
-
-**Verdict pratique 2026 :** Apple a fait des progrès (push en 16.4, Declarative Web Push en 18.4, app mode par défaut en iOS 26), mais à un rythme lent et avec des marges de manœuvre étroites. Pour un projet ciblant fortement iOS et reposant sur du push fiable, du background sync ou de l'intégration profonde au système, le natif (ou hybride) reste l'option plus sûre.
-
-## 7. PWA vs natif vs hybride
-
-| Critère | PWA | Natif (iOS/Android) | Hybride (RN, Flutter) |
-|---|---|---|---|
-| Codebase | Unique (web) | 2 séparés | 1 partagé, ponts natifs |
-| Distribution | URL + stores optionnels | App Store, Play Store obligatoires | Stores obligatoires |
-| Mises à jour | Instantanées | Validation store (jours) | Validation store |
-| Découvrabilité SEO | Oui (indexé Google) | Non | Non |
-| Coût de dev (typique) | 1× | 2-3× | 1,3-1,8× |
-| Performance UI | Bonne à très bonne | Maximale | Très bonne |
-| Accès matériel | Partiel, variable selon OS | Total | Quasi-total |
-| Notifications push iOS | Oui, sous conditions | Oui, sans conditions | Oui |
-| Frais store (achats numériques) | 0 % | 15-30 % | 15-30 % |
-| Hors ligne | Oui via service worker | Oui | Oui |
-
-**Quand choisir une PWA**
-
-- Audience web-first (desktop + mobile navigateur).
-- SEO comme canal d'acquisition stratégique.
-- Time-to-market et coût de maintenance prioritaires.
-- Contenu plutôt que fonctionnalités matérielles avancées.
-- Marchés émergents (stockage, bande passante limités).
-- Outils internes B2B, portails, contenus éditoriaux, e-commerce léger.
-
-**Quand préférer le natif**
-
-- Accès matériel profond (BLE, NFC, capteurs avancés, ARKit/ARCore).
-- Performances graphiques 120 fps, jeux, AR/VR.
-- Monétisation reposant sur l'achat in-app via stores.
-- Marque dépendant fortement de la présence App Store/Play Store.
-
-**Quand choisir hybride (React Native, Flutter)**
-
-- Présence store nécessaire mais sans le budget de deux codebases natives.
-- Équipe JavaScript ou Dart.
-- Besoins matériels modérés mais réels.
-
-## 8. Pour commencer : un MVP en 4 fichiers
-
-Voici la PWA minimale viable. Quatre fichiers, aucun framework, déployable sur n'importe quel hébergement HTTPS.
-
-### `index.html`
-
-```html
-
-
-
-
-
- Ma PWA
-
-
-
-
-
-
Bonjour
-
Ceci est une PWA.
-
-
-
-```
-
-### `manifest.webmanifest`
-
-```json
-{
- "name": "Ma Progressive Web App",
- "short_name": "MaPWA",
- "description": "Démonstration minimale d'une PWA.",
- "start_url": "/",
- "scope": "/",
- "display": "standalone",
- "orientation": "portrait",
- "background_color": "#ffffff",
- "theme_color": "#0066cc",
- "icons": [
- {
- "src": "/icons/icon-192.png",
- "sizes": "192x192",
- "type": "image/png",
- "purpose": "any maskable"
- },
- {
- "src": "/icons/icon-512.png",
- "sizes": "512x512",
- "type": "image/png",
- "purpose": "any maskable"
- }
- ]
-}
-```
-
-### `sw.js`
-
-```javascript
-const CACHE_NAME = 'mapwa-v1';
-const PRECACHE = [
- '/',
- '/index.html',
- '/manifest.webmanifest',
- '/icons/icon-192.png',
- '/icons/icon-512.png'
-];
-
-self.addEventListener('install', (event) => {
- event.waitUntil(
- caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE))
- );
- self.skipWaiting();
-});
-
-self.addEventListener('activate', (event) => {
- event.waitUntil(
- caches.keys().then((keys) =>
- Promise.all(
- keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))
- )
- )
- );
- self.clients.claim();
-});
-
-self.addEventListener('fetch', (event) => {
- // Stale-while-revalidate pour les navigations
- if (event.request.mode === 'navigate') {
- event.respondWith(
- caches.match(event.request).then((cached) => {
- const fresh = fetch(event.request).then((response) => {
- caches.open(CACHE_NAME).then((c) => c.put(event.request, response.clone()));
- return response;
- }).catch(() => cached);
- return cached || fresh;
- })
- );
- return;
- }
- // Cache-first pour le reste
- event.respondWith(
- caches.match(event.request).then((cached) => cached || fetch(event.request))
- );
-});
-```
-
-### Icônes
-
-Deux fichiers PNG : `icons/icon-192.png` (192×192) et `icons/icon-512.png` (512×512). L'attribut `purpose: "any maskable"` permet à Android de découper l'icône selon la forme système (cercle, squircle, etc.).
-
-**Servir le tout en HTTPS** (obligatoire en production ; `localhost` fonctionne en dev). Configuration nginx/Apache : s'assurer que `manifest.webmanifest` est servi avec le content-type `application/manifest+json` et que `sw.js` n'est jamais mis en cache HTTP côté navigateur (sinon les mises à jour ne se propagent pas).
-
-```nginx
-location = /sw.js {
- add_header Cache-Control "no-store, no-cache, must-revalidate";
- expires off;
-}
-
-location = /manifest.webmanifest {
- add_header Content-Type "application/manifest+json";
-}
-```
-
-**Tester avec Lighthouse** (intégré à Chrome DevTools, onglet *Lighthouse* puis catégorie *Progressive Web App*) — fournit un score, identifie les manques, propose des corrections.
-
-## 9. Outils et frameworks
-
-**Workbox** (Google) — la bibliothèque de référence pour les service workers. Génère du SW à partir de configurations déclaratives, gère les stratégies de cache, le préchargement, la mise à jour. Souvent utilisée via un plugin de bundler.
-
-**Vite PWA Plugin** (`vite-plugin-pwa`) — l'option la plus simple pour un projet moderne basé sur Vite. Wrap Workbox, génère manifest et SW automatiquement.
-
-**Next.js** — supporte les PWA via `next-pwa` (basé sur Workbox).
-
-**Nuxt** — `@vite-pwa/nuxt` officiel.
-
-**Angular, Vue, Svelte** — tous disposent d'intégrations PWA officielles ou bien maintenues.
-
-**PWA Builder** (Microsoft) — outil web qui audit un site et génère le packaging pour les stores (MSIX pour Microsoft, TWA pour Play Store).
-
-**Lighthouse** — audit intégré à Chrome DevTools. Standard de fait pour vérifier la conformité PWA.
-
-**Côté PHP (pertinent au regard du contexte de cette doc)** — Symfony et Laravel n'ont pas d'extension PWA officielle, mais l'intégration est triviale puisqu'une PWA n'exige côté serveur que de servir correctement quelques fichiers statiques en HTTPS. Bundles comme `friendsofsymfony/elastica-bundle` ne couvrent pas le sujet ; c'est plutôt à l'asset pipeline (Webpack Encore, Vite) de gérer la génération du service worker.
-
-## 10. Pièges fréquents et bonnes pratiques
-
-**Le service worker piégé en cache** — `sw.js` lui-même ne doit jamais être mis en cache HTTP, sinon les utilisateurs restent bloqués sur une ancienne version. `Cache-Control: no-store` strict côté serveur.
-
-**Versionner le cache** — toujours inclure une version dans le nom du cache (`mapwa-v1`, `mapwa-v2`...) et purger les anciens à l'activation. Sans cela, des assets périmés peuvent persister indéfiniment.
-
-**Ne pas tout cacher** — précharger uniquement le strict nécessaire au shell de l'application. Le reste doit être mis en cache à la demande, avec une stratégie adaptée.
-
-**Tester hors ligne** — Chrome DevTools propose un mode *Offline* dans l'onglet *Network*. C'est le seul moyen de vérifier que les stratégies de cache fonctionnent.
-
-**Gérer la mise à jour** — quand un nouveau service worker est détecté, il s'installe mais n'est actif qu'après fermeture de tous les onglets de la PWA. Soit forcer via `skipWaiting()` + `clients.claim()` (rapide mais peut casser une session en cours), soit afficher à l'utilisateur une bannière « nouvelle version disponible ».
-
-**Détection de feature, jamais détection de navigateur** — `if ('serviceWorker' in navigator)`, `if ('PushManager' in window)`. Ne jamais sniffer `userAgent`.
-
-**Tester sur iOS réel** — l'émulateur Safari ne reproduit pas toutes les limitations. Un iPhone physique est indispensable pour valider l'expérience.
-
-**HTTPS impératif** — même en pré-prod. Les certificats Let's Encrypt sont gratuits ; un reverse proxy bien configuré (Caddy, nginx, Traefik) suffit. *NB : ce point recoupe directement la configuration habituelle d'un homelab avec reverse proxy.*
-
-**Manifest et icônes adaptatives** — utiliser `purpose: "maskable"` avec des icônes ayant une zone de sécurité de ~10 % autour du contenu, sinon Android va découper dans le visuel.
-
-**Pas de prompt d'installation intrusif** — Chrome déclenche automatiquement un mini-info-bar quand les critères PWA sont remplis. Si on veut un prompt personnalisé, intercepter l'événement `beforeinstallprompt` et le déclencher au moment opportun (jamais au premier chargement).
-
-```javascript
-let deferredPrompt;
-window.addEventListener('beforeinstallprompt', (e) => {
- e.preventDefault();
- deferredPrompt = e;
- // Afficher un bouton « Installer » dans l'UI
- document.querySelector('#install-btn').hidden = false;
-});
-
-document.querySelector('#install-btn').addEventListener('click', async () => {
- if (!deferredPrompt) return;
- deferredPrompt.prompt();
- const { outcome } = await deferredPrompt.userChoice;
- console.log('Choix utilisateur :', outcome);
- deferredPrompt = null;
-});
-```
-
-## 11. Ressources
-
-**Documentation officielle**
-
-- web.dev — section *Progressive Web Apps* : https://web.dev/explore/progressive-web-apps
-- MDN Web Docs — *Progressive web apps* : https://developer.mozilla.org/fr/docs/Web/Progressive_web_apps
-- Apple Developer — *Sending web push notifications* : https://developer.apple.com/documentation/usernotifications/sending-web-push-notifications-in-web-apps-and-browsers
-- Microsoft Edge — *PWA on Windows* : https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/
-
-**Outils**
-
-- Workbox : https://developer.chrome.com/docs/workbox
-- PWA Builder : https://www.pwabuilder.com/
-- Lighthouse : intégré à Chrome DevTools, ou via CLI `npm i -g @lhci/cli`
-
-**Veille**
-
-- *Web Almanac* (HTTP Archive) — rapport annuel sur l'état du web, chapitre PWA.
-- *Can I Use* : https://caniuse.com/ — compatibilité navigateur pour chaque API.
-
-**Études de cas**
-
-- web.dev cases : https://web.dev/case-studies
-
-
----
-
-*Document de référence — état au 13 mai 2026. À revoir tous les 6 à 12 mois, l'écosystème évoluant rapidement (notamment côté Apple).*
\ No newline at end of file
diff --git a/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2/index.md b/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2/index.md
deleted file mode 100644
index dc98b86..0000000
--- a/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2/index.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# Pourquoi les opérateurs brident-ils la 3G ?
-
-## Explications scientifiques et économiques
-
-La migration des utilisateurs de la 3G vers la 4G et la 5G ne se limite pas à une simple volonté commerciale. Plusieurs facteurs techniques et économiques expliquent pourquoi les opérateurs limitent progressivement les performances des anciennes générations.
-
----
-
-### 1. Refarming du spectre
-
-Le **refarming** consiste à **réaffecter les fréquences radio utilisées par la 3G (900 MHz, 1800 MHz, 2100 MHz)** pour la 4G et désormais la 5G.
-
-* **Objectif :** optimiser l’utilisation du spectre radio limité et très convoité.
-* **Conséquence pour la 3G :** réduction des capacités réseau et baisse effective des débits.
-* **Avantage pour la 4G/5G :** meilleure couverture et débits accrus, tout en utilisant les bandes déjà déployées.
-
----
-
-### 2. Coût d’entretien élevé des infrastructures 3G
-
-Maintenir un réseau 3G opérationnel est **coûteux** :
-
-* Les équipements (antennes, contrôleurs RNC, stations de base) vieillissent et nécessitent maintenance et mises à jour régulières.
-* Les coûts énergétiques et opérationnels sont proportionnellement plus élevés par bit transmis comparé à la 4G ou la 5G.
-* En parallèle, le nombre d’utilisateurs actifs sur la 3G diminue, ce qui réduit la rentabilité.
-
-> Le ratio coût par bit est donc nettement moins favorable pour la 3G : pour un flux de données équivalent, un opérateur dépense plus en 3G qu’en 4G ou 5G.
-
----
-
-### 3. Incitation à la migration via bridage
-
-Pour accélérer la transition vers les nouvelles générations :
-
-* Les opérateurs **brident les débits 3G** (exemple concret : Free Mobile en itinérance sur Orange).
-* Les utilisateurs rencontrent des **limitations visibles** : ralentissements web, streaming limité, visioconférence dégradée.
-* Cette stratégie crée une motivation implicite à souscrire à des forfaits 4G ou 5G, sans intervention directe sur les tarifs.
-
----
-
-### Évolution des débits bridés sur 3G Free/Orange (2016–2020)
-
-| Année | Débit descendant | Débit montant |
-| ----- | ---------------- | ------------- |
-| 2016 | ~5 Mbit/s | 0,5–1 Mbit/s |
-| 2017 | ~1 Mbit/s | 0,5 Mbit/s |
-| 2019 | 768 kbit/s | 384 kbit/s |
-| 2020 | 384 kbit/s | 384 kbit/s |
-
-> Ce tableau illustre la **réduction progressive des performances**, transformant un réseau encore fonctionnel en service à très faible débit, pour encourager la migration vers la 4G/5G.
-
----
-
-### Schéma suggéré : flux de données et coût par bit (3G vs 4G)
-
-```mermaid
-flowchart LR
- A[Utilisateur 3G] -->|Faible débit| B[Flux de données]
- B -->|Coût élevé par bit| C[Opérateur]
-
- D[Utilisateur 4G] -->|Débit élevé| E[Flux de données]
- E -->|Coût faible par bit| C[Opérateur]
-
- style A fill:#f9f,stroke:#333,stroke-width:1px
- style D fill:#9f9,stroke:#333,stroke-width:1px
-```
-
-* **Lecture du schéma :** la 3G transmet moins de données à un coût plus élevé pour l’opérateur. La 4G/5G, avec des débits supérieurs et un coût par bit réduit, devient nettement plus rentable.
-
----
-
-La dégradation volontaire des performances 3G s’explique par un **mix de contraintes techniques, économiques et stratégiques** :
-
-1. Libérer les fréquences pour les nouvelles générations (refarming).
-2. Réduire les coûts d’entretien des infrastructures obsolètes.
-3. Inciter les utilisateurs à migrer vers la 4G et la 5G, plus rentables et performantes.
-
-> Ce processus est récurrent : chaque génération prépare progressivement l’abandon de la précédente, toujours sous couvert d’optimisation technique et économique.
diff --git a/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2/meta.json b/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2/meta.json
deleted file mode 100644
index 8c26426..0000000
--- a/a55aeefd-28ae-4c3f-bfc1-c0400c3877c2/meta.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "uuid": "a55aeefd-28ae-4c3f-bfc1-c0400c3877c2",
- "slug": "pourquoi-les-operateurs-brident-ils-la-3g",
- "title": "Pourquoi les opérateurs brident-ils la 3G ?",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-05 08:41:22",
- "created_at": "2025-11-05 08:41:22",
- "updated_at": "2025-11-05 08:41:22",
- "revisions": [],
- "cover": "cover.jpg",
- "category": "télécom"
-}
diff --git a/a9474a83-43b3-484c-950e-37a27ff663fe/index.md b/a9474a83-43b3-484c-950e-37a27ff663fe/index.md
deleted file mode 100644
index 9cb826c..0000000
--- a/a9474a83-43b3-484c-950e-37a27ff663fe/index.md
+++ /dev/null
@@ -1,783 +0,0 @@
-# Gawfgbsdfg
-
-> Document de travail consolidant le prototypage Arduino, la conception du PCB sous KiCad, les règles de conception et la préparation des fichiers pour la CNC.
-
----
-
-## 1. Rappel : prototypage
-
-### 1.1 Liste du matériel
-
-- 1 × Arduino Uno
-- 1 × écran LCD 16 broches (non I²C)
-- 3 × boutons poussoirs
-- 1 × buzzer
-- 1 × résistance 220 Ω
-- 1 × potentiomètre 10 kΩ *(facultatif — voir remarque ci-dessous)*
-
-### 1.2 Câblage
-
-**Écran LCD** — câblage identique au projet n° 11 du livre de référence ; consulter les pages 116 et 117 pour le détail des broches.
-
-Une variante sans potentiomètre a été testée (LCD branché directement à la masse) mais elle a été abandonnée.
-
-**Boutons poussoirs** — montés en pull-up interne :
-
-```
-GND → Poussoir → broches 7, 8, 9 (avec INPUT_PULLUP dans le code)
-```
-
-Pour comprendre le principe du montage pull-up :
-
-**Buzzer** — deux broches : l'une à la masse, l'autre sur la broche 6 (qui assure également l'alimentation lors du pilotage par `tone()`). Voir notamment le projet n° 6, p. 71.
-
-### 1.3 Type de jeu
-
-Jeu d'arcade type *Asteroids*.
-
-### 1.4 Code de référence
-
-```cpp
-#include
-LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
-
-// ---- Buzzer ----
-const int PIN_BUZZER = 6;
-inline void beepShoot() { tone(PIN_BUZZER, 2000, 40); } // court
-inline void beepHit() { tone(PIN_BUZZER, 1200, 80); } // moyen
-inline void beepOver() { tone(PIN_BUZZER, 400, 600); } // long
-
-// ---- Boutons ----
-const int boutonTir = 7;
-const int boutonHaut = 8;
-const int boutonBas = 9;
-
-// ---- Affichage ----
-byte CH_VAISSEAU[8] = {
- B00100, B01110, B11111, B11111, B01110, B00100, B00100, B00000
-};
-byte CH_MISSILE[8] = {
- B00100, B00100, B00100, B11111, B00100, B00100, B00100, B00000
-};
-byte CH_ENNEMI[8] = {
- B11111, B10101, B11111, B01010, B11111, B10101, B11111, B00000
-};
-
-int vaisseauLigne = 1; // 0..1
-
-struct Ennemi { int colonne; int ligne; bool actif; };
-const int MAX_ENNEMIS = 3;
-Ennemi ennemis[MAX_ENNEMIS];
-
-struct Projectile { int colonne; int ligne; bool actif; };
-const int MAX_TIRS = 6;
-Projectile tirs[MAX_TIRS];
-
-unsigned long dernierDeplacement = 0;
-unsigned long intervalDeplacement = 500;
-
-unsigned long dernierTir = 0;
-const unsigned long delaiTir = 180;
-
-int score = 0;
-
-void setup() {
- pinMode(boutonTir, INPUT_PULLUP);
- pinMode(boutonHaut, INPUT_PULLUP);
- pinMode(boutonBas, INPUT_PULLUP);
- pinMode(PIN_BUZZER, OUTPUT);
-
- lcd.begin(16, 2);
- lcd.createChar(0, CH_VAISSEAU);
- lcd.createChar(1, CH_MISSILE);
- lcd.createChar(2, CH_ENNEMI);
- lcd.print("Vaisseau Pret!");
- delay(600);
- lcd.clear();
-
- randomSeed(analogRead(A0));
- for (int i = 0; i < MAX_ENNEMIS; i++) ennemis[i].actif = false;
- for (int i = 0; i < MAX_TIRS; i++) tirs[i].actif = false;
-}
-
-void loop() {
- unsigned long now = millis();
-
- if (digitalRead(boutonHaut) == LOW) vaisseauLigne = 0;
- else if (digitalRead(boutonBas) == LOW) vaisseauLigne = 1;
-
- // Tir multi-missiles + bip
- if (digitalRead(boutonTir) == LOW && now - dernierTir >= delaiTir) {
- int idx = slotTirLibre();
- if (idx >= 0) {
- tirs[idx].actif = true;
- tirs[idx].colonne = 1;
- tirs[idx].ligne = vaisseauLigne;
- dernierTir = now;
- beepShoot();
- }
- }
-
- if (now - dernierDeplacement > intervalDeplacement) {
- dernierDeplacement = now;
-
- // Déplacer les tirs
- for (int t = 0; t < MAX_TIRS; t++) {
- if (!tirs[t].actif) continue;
- tirs[t].colonne++;
- if (tirs[t].colonne > 15) tirs[t].actif = false;
- }
-
- // Déplacer les ennemis + détection des collisions
- for (int i = 0; i < MAX_ENNEMIS; i++) {
- if (!ennemis[i].actif) continue;
- ennemis[i].colonne--;
-
- for (int t = 0; t < MAX_TIRS; t++) {
- if (!tirs[t].actif) continue;
- if (ennemis[i].colonne == tirs[t].colonne
- && ennemis[i].ligne == tirs[t].ligne) {
- ennemis[i].actif = false;
- tirs[t].actif = false;
- score++;
- beepHit();
- break;
- }
- }
-
- if (ennemis[i].colonne <= 0) {
- beepOver();
- gameOver();
- }
- }
-
- // Apparition d'ennemis
- int actifs = 0;
- for (int i = 0; i < MAX_ENNEMIS; i++) if (ennemis[i].actif) actifs++;
- if (actifs < MAX_ENNEMIS && random(0, 10) > 7) {
- for (int i = 0; i < MAX_ENNEMIS; i++) if (!ennemis[i].actif) {
- ennemis[i].actif = true;
- ennemis[i].colonne = 15;
- ennemis[i].ligne = random(0, 2);
- break;
- }
- }
-
- updateLCD();
- }
-}
-
-int slotTirLibre() {
- for (int i = 0; i < MAX_TIRS; i++) if (!tirs[i].actif) return i;
- return -1;
-}
-
-static inline void printIfOnScreen(int col, int row, uint8_t ch) {
- if (col >= 0 && col <= 15 && row >= 0 && row <= 1) {
- lcd.setCursor(col, row);
- lcd.write(ch);
- }
-}
-
-void updateLCD() {
- lcd.clear();
- lcd.setCursor(10, 0); lcd.print("S:"); lcd.print(score);
-
- printIfOnScreen(0, vaisseauLigne, 0); // vaisseau
-
- // Tirs
- for (int t = 0; t < MAX_TIRS; t++) {
- if (!tirs[t].actif) continue;
- if (tirs[t].colonne >= 0 && tirs[t].colonne <= 15) {
- lcd.setCursor(tirs[t].colonne, tirs[t].ligne);
- lcd.write((uint8_t)1); // missile
- }
- }
-
- // Ennemis
- for (int i = 0; i < MAX_ENNEMIS; i++) {
- if (!ennemis[i].actif) continue;
- if (ennemis[i].colonne >= 0 && ennemis[i].colonne <= 15) {
- lcd.setCursor(ennemis[i].colonne, ennemis[i].ligne);
- lcd.write((uint8_t)2); // ennemi
- }
- }
-}
-
-void gameOver() {
- lcd.clear();
- lcd.setCursor(3, 0); lcd.print("GAME OVER");
- lcd.setCursor(4, 1); lcd.print("Score:"); lcd.print(score);
- while (true) {}
-}
-```
-
----
-
-## 2. Tutoriel : préparation sous KiCad
-
-### 2.1 Atelier — KiCad → PCB → CNC
-
-> ⚠️ Tutoriel expérimental : à revérifier, tester et adapter au besoin.
-
-Site officiel : — éditeur de PCB libre et gratuit.
-
-### 2.2 Création du projet
-
-Deux possibilités :
-
-- **Projet vierge** : *Fichier → Nouveau projet*
-- **Projet « shield Arduino »** : *Fichier → Nouveau projet à partir d'un modèle → Arduino UNO Shield*
-
-L'exemple suivant porte sur la création d'un shield Arduino Uno comportant 3 LED, 3 résistances de 220 Ω et 3 boutons.
-
-Enregistrer le projet dans un dossier dédié (ici, `shieldDynalab`). Il contient deux fichiers principaux :
-
-- `*.kicad_sch` — conception du circuit électronique (schéma)
-- `*.kicad_pcb` — agencement des composants sur le circuit imprimé et dessin des pistes
-
-Ouvrir le fichier `.kicad_sch`. Le modèle Arduino Uno Shield contient déjà les broches correspondant aux pins de l'Arduino.
-
-### 2.3 Ajout des composants
-
-Cliquer sur le bouton **Ajouter un symbole** (barre d'outils de droite, en haut). Dans le champ de recherche, saisir le nom du composant *en anglais* (par exemple `led`).
-
-Sélectionner le composant dans la liste : son symbole électrique s'affiche dans le volet de droite. Puis, via le menu déroulant **Pas d'empreinte par défaut**, sélectionner l'empreinte qui correspond au composant physique (par exemple via la référence constructeur ou les dimensions).
-
-> **Empreinte** : espace physique occupé par le composant sur le PCB ainsi que la position de ses broches.
-
-- **SMD** *(Surface Mount Device)* — composant monté en surface
-- **THT** *(Through-Hole Technology)* — composant traversant
-
-Vérifier que l'empreinte qui s'affiche en dessous semble cohérente, valider, puis poursuivre avec les autres composants (par exemple une résistance 220 Ω).
-
-Si une empreinte n'est pas trouvée dans la liste déroulante, ce n'est pas grave : il sera possible de l'attribuer plus tard, par exemple pour le bouton poussoir.
-
-### 2.4 Attribution des empreintes a posteriori
-
-Pour attribuer une empreinte aux composants qui n'en ont pas encore, utiliser le bouton **Assigner des empreintes**. Une fenêtre liste tous les composants du projet ; il devient possible :
-
-- de modifier les empreintes déjà attribuées,
-- d'en attribuer de nouvelles depuis la liste à droite (recherche par mot-clé ou référence, en anglais ; double-clic pour valider).
-
-En cas de doute, faire un *clic droit* sur le nom de l'empreinte → **Affichage de l'empreinte sélectionnée**, pour vérifier visuellement la cohérence.
-
-Si un composant n'existe pas dans la bibliothèque, il est possible de fabriquer une empreinte personnalisée à partir de zéro.
-
-### 2.5 Conception du circuit
-
-Dans l'espace de travail, survoler un composant et utiliser les raccourcis suivants :
-
-| Touche | Action |
-|---|---|
-| `M` | *Move* — déplacer le composant |
-| `R` | *Rotate* — pivoter le composant |
-| `Ctrl + D` | *Duplicate* — dupliquer le composant (cliquer ailleurs pour le poser) |
-
-Le bouton **Ajouter un fil** (barre d'outils de droite) permet de relier les broches entre elles.
-
-Survoler les noms des broches de l'Arduino et faire `Ctrl + D` pour les dupliquer à proximité du module en cours de conception (par exemple le module LED). Procéder de même pour la masse (GND).
-
-Le bouton **Annotation de la schématique** renomme automatiquement les composants pour éviter les conflits.
-
-Ajouter des **indicateurs de non-connexion** sur toutes les broches qui ne seront reliées à rien : cela évite les erreurs lors du contrôle des règles électriques (ERC).
-
-> *Point à vérifier* : sur quelles broches exactement faut-il placer ces indicateurs ?
-
-Il est possible de sélectionner plusieurs composants à la fois pour les dupliquer en bloc (utile lorsqu'un même sous-module se répète sur le circuit).
-
-### 2.6 Passage à l'éditeur de PCB
-
-Une fois le schéma terminé : **sauvegarder**, puis cliquer sur **Commuter vers l'éditeur de PCB** (barre d'outils en haut). Cela ouvre le fichier `.kicad_pcb`.
-
-Au départ, l'éditeur ne contient pas encore les composants du schéma. Pour les importer : **Outils → Mettre à jour le PCB depuis le schéma**.
-
-Les composants apparaissent à l'écran, reliés par des « chevelus » aux broches correspondantes. Reste à les positionner, les orienter et les router de manière à éviter les croisements de pistes (le casse-tête commence ici).
-
-### 2.7 Paramétrage des contraintes (CNC)
-
-Avant de tracer les pistes, paramétrer les contraintes liées à la CNC : **Options du CI → Contraintes**.
-
-Modifier les valeurs minimales pour permettre le passage de la fraise lors de l'isolation des pistes. Se baser sur les diamètres de fraises disponibles.
-
-### 2.8 Tracé des pistes
-
-Le bouton de tracé de piste permet de dessiner les connexions. Au clic sur une broche, l'écran s'assombrit et seules les broches reliées électriquement restent éclairées, ce qui facilite l'identification des connexions à réaliser.
-
-- **Trait rouge** : la piste elle-même
-- **Contour gris** : la zone d'isolation minimum
-
-KiCad maintient automatiquement la distance minimale par rapport aux autres broches et pistes.
-
-**Choix de la couche** — bien sélectionner la couche dans la liste de droite *avant* de tracer :
-
-- `F.Cu` *(front)* — pistes en cuivre côté composants
-- `B.Cu` *(back)* — pistes en cuivre côté soudure
-
-Vérifier le rendu via **Affichage → Visualisation 3D** pour s'assurer que le résultat est physiquement réalisable et cohérent.
-
-> 💡 **Cas de la gravure CNC** : le cuivre ne traverse pas la plaque au niveau des perçages. Les pistes doivent donc être placées de l'autre côté par rapport aux composants. On travaille donc sur la couche `B.Cu`.
->
-> Faire les pistes sur `F.Cu` donne certes un rendu plus clair, mais ne permet pas de souder les composants une fois la plaque gravée à la CNC.
-
-### 2.9 Export des fichiers de fabrication
-
-**Pistes (Gerber)** : *Fichier → Fichier de fabrication → Gerber `.gbr`*. Sélectionner les couches concernées, tracer ; la fenêtre du bas confirme l'enregistrement.
-
-**Perçages (Excellon)** : *Fichier → Fichier de fabrication → Fichier de perçage `.drl`*. Créer le fichier de perçage ET le plan de perçage.
-
-### 2.10 Conversion Gerber → SVG
-
-Utiliser **FlatCam** : il permet d'ouvrir des fichiers Gerber, de définir le diamètre et le type de fraise utilisée, et de générer automatiquement le tracé vectoriel du chemin que la CNC empruntera. Il est également possible d'ajouter manuellement des traits si nécessaire.
-
-Étapes :
-
-1. Import des fichiers Gerber
-2. Paramétrage de l'isolation
-3. Création de la géométrie
-4. Adaptation manuelle du tracé si besoin
-5. Géométrie sélectionnée → **Export SVG** ou **DXF**, ou bien génération directe du chemin CNC
-
-Tutoriel vidéo :
-
-### 2.11 Ressources complémentaires
-
-Documentation KiCad en français sur Fabmanager :
-
----
-
-## 3. Atelier 2 — déroulé
-
-1. Retour sur les règles de conception
-2. Retour d'expérience sur le projet
-3. Préparation des fichiers pour la CNC
-4. Usinage sur CNC
-5. **Et après ?** Exposition, autres ateliers, création d'un club ?
-
----
-
-## 4. Règles de conception du PCB
-
-### 4.1 Points abordés ensemble
-
-#### 1. Type de fabrication et couches utilisées
-
-PCB simple face : les pistes sont gravées sur la face cuivre inférieure, les composants traversants sont placés sur la face supérieure. Dans KiCad, router donc les pistes sur la couche `B.Cu`.
-
-#### 2. Types de composants électroniques
-
-- **CMS** (Composants Montés en Surface) = **SMD** (*Surface Mount Device*) : même chose, en français et en anglais.
-- **THT** (*Through-Hole Technology*) : composants traversants.
-
-#### 3. Outils de vérification dans KiCad
-
-- **DRC** (*Design Rule Check*) : contrôle du respect des règles de conception du PCB.
-- **ERC** (*Electrical Rule Check*) : contrôle de la cohérence électrique du schéma.
-
-#### 4. Gestion des entrées non connectées
-
-Ne pas laisser d'entrée non connectée (dite « flottante ») : cela peut entraîner des comportements imprévisibles. Sur un microcontrôleur, une broche inutilisée peut rester non connectée à condition d'être correctement configurée par programmation (en sortie, ou avec un état défini par exemple en pull-up/pull-down interne).
-
-#### 5. Routage et angles des pistes
-
-Éviter les angles à 90°, privilégier les angles à 45°. Cela améliore la qualité de fabrication et limite les discontinuités électriques, particulièrement sur les signaux rapides.
-
-#### 6. Gestion des interférences
-
-Éloigner les éléments susceptibles de générer des interférences (liaisons USB, signaux rapides, lignes d'horloge) des entrées analogiques (notamment audio).
-
-Règle générale : plus un signal est rapide, plus il est susceptible de générer ou de subir des interférences. Dans ce cas, privilégier des pistes courtes. À l'inverse, pour des signaux lents (bouton poussoir, LED, commande de relais, UART à faible débit), il est possible de déporter le composant avec des pistes plus longues sans risque significatif.
-
-#### 7. Notion de routage soigné
-
-Un routage soigné consiste à tracer les pistes de manière logique et maîtrisée :
-
-- privilégier des trajets courts et directs,
-- éviter les boucles inutiles,
-- limiter les croisements entre signaux sensibles et signaux bruyants,
-- conserver une proximité cohérente avec la masse pour assurer un bon retour de courant.
-
-Un tracé clair et structuré facilite également la lecture, la maintenance et le dépannage du circuit.
-
-#### 8. Routage des signaux USB
-
-Les lignes D+ et D− doivent avoir des longueurs identiques afin de préserver les caractéristiques du signal différentiel et maintenir une impédance cohérente.
-
-#### 9. Intérêt des PCB multicouches
-
-Lorsque cela est possible, un PCB à quatre couches est une solution idéale : les couches internes dédiées à l'alimentation et à la masse améliorent la stabilité électrique et réduisent les interférences (notamment grâce à leur effet capacitif).
-
-#### 10. Prototypage avec Arduino et intégration
-
-Une carte Arduino Uno est un dispositif complet adapté au prototypage rapide.
-
-Dans une mise en œuvre intégrée, il est possible de ne conserver que le microcontrôleur — par exemple l'ATmega328P — accompagné des éléments minimaux nécessaires à son fonctionnement :
-
-- un quartz (généralement 16 MHz) avec ses deux condensateurs associés,
-- une résistance de pull-up sur la broche `RESET`,
-- les condensateurs de découplage pour l'alimentation.
-
-Pour faciliter l'usage, monter le microcontrôleur sur un support DIP (support tulipe) : cela permet de le retirer aisément pour le reprogrammer sur une carte Arduino.
-
-### 4.2 Bonnes pratiques supplémentaires (bonus à vérifier)
-
-#### 11. Découplage des alimentations
-
-Chaque circuit intégré doit posséder un condensateur de découplage (typiquement 100 nF) placé au plus près de ses broches `VCC` et `GND`. Cela absorbe les variations rapides de courant, stabilise la tension et évite les comportements aléatoires difficiles à diagnostiquer. Pratique particulièrement importante pour les microcontrôleurs et les circuits logiques rapides.
-
-#### 12. Plan de masse (GND)
-
-Plutôt que de relier la masse uniquement par des pistes fines, utiliser une zone de cuivre continue. Cela réduit les interférences électromagnétiques, améliore le retour de courant et simplifie le routage.
-
-Dans le cas d'une gravure CNC, cette pratique est facilement réalisable : le plan de masse correspond au reste de cuivre non gravé, isolé autour des pistes et pastilles. Dans KiCad, on peut remplir la carte avec un *copper pour* (zone cuivrée) affectée à `GND` et relier tous les points de masse.
-
-#### 13. Boucle de courant et retour de masse
-
-Un signal électrique forme toujours une boucle complète : aller + retour. Si le chemin de retour n'est pas proche de la piste du signal, le circuit peut capter ou émettre du bruit. Toujours garder un retour de masse continu et proche pour tous les signaux, en particulier les signaux rapides ou sensibles.
-
-#### 14. Largeur des pistes adaptée au courant
-
-Toutes les pistes ne doivent pas avoir la même largeur :
-
-- les signaux logiques peuvent passer sur des pistes fines,
-- les pistes d'alimentation et celles transportant un courant important doivent être plus larges pour éviter surchauffe, chute de tension ou destruction de la piste.
-
-Il existe des calculateurs en ligne pour déterminer la largeur adaptée selon le courant et l'épaisseur du cuivre.
-
-#### 15. Points de test pour le débogage
-
-Prévoir sur le PCB des points de test accessibles pour mesurer rapidement la tension d'alimentation, vérifier les signaux critiques et suivre les lignes de communication importantes.
-
-Concrètement, ce sont de petites pastilles ou trous métallisés sur lesquels on peut poser la sonde d'un multimètre ou d'un oscilloscope. Cela facilite le dépannage sans avoir à dessouder des composants.
-
-#### 16. Dissipation thermique
-
-Certains composants génèrent de la chaleur (régulateurs de tension, transistors de puissance). Pour éviter la surchauffe et préserver la fiabilité du circuit, prévoir une surface de cuivre suffisante pour dissiper cette chaleur :
-
-- pistes plus larges connectées aux broches concernées,
-- raccordement de ces broches à des zones de cuivre étendues qui agissent comme dissipateurs thermiques.
-
-L'objectif est d'offrir un chemin efficace d'évacuation de la chaleur vers le PCB.
-
-#### 17. Séparation des alimentations
-
-Si le circuit comporte des parties analogiques, numériques et de puissance, séparer les plans ou pistes d'alimentation pour chaque domaine. Par exemple, les moteurs et autres charges fortes peuvent disposer de leur propre piste, tandis que la logique numérique et l'analogique sensible utilisent des pistes ou zones distinctes.
-
-Même si toutes les alimentations proviennent de la même source, cette séparation physique sur le PCB limite les interférences et améliore la stabilité du circuit.
-
----
-
-## 5. Application au projet
-
-### 5.1 Processus itératif (retour d'expérience)
-
-#### Conception du PCB
-
-**#1 — Listing des composants**
-
-Inventorier l'ensemble des composants nécessaires.
-
-**#2 — Premiers choix de conception**
-
-- forme globale du PCB,
-- composants accessibles ou non,
-- répartition face supérieure / face inférieure,
-- type d'alimentation (ne pas oublier la batterie !).
-
-**#3 — Test de positionnement et d'implantation réelle** *(si possible)*
-
-- repérer les conflits potentiels (ponts notamment),
-- prendre les mesures critiques,
-- définir la forme et la taille du PCB.
-
-**#4 — Schématisation sous KiCad**
-
-> 💡 Travailler si possible sur un double écran.
-
-- positionner et anticiper a minima l'implantation des éléments ;
-- l'objectif n'est pas nécessairement de produire un schéma facilement lisible, mais un schéma exploitable pour le routage ;
-- éviter au maximum les croisements ;
-- relier directement les composants à la broche source (ne pas chercher à les relier entre eux dans un premier temps) ;
-- si besoin, utiliser l'empreinte d'un autre composant (exemple : une batterie peut être représentée par l'empreinte d'une résistance).
-
-À explorer : sous KiCad, les broches `GND` d'un Arduino ne sont pas reliées entre elles. Affecter un `GND` symbolique à chacune via des labels.
-
-**#5 — Routage sous KiCad (éditeur de PCB)**
-
-Dernier moment pour vérifier les empreintes — vérifier notamment que le pas est bien un multiple de 2,54 mm.
-
-> ⚠️ Après création des pistes, déplacer un composant rompt les connexions. Implanter donc précisément les composants dès le départ (au besoin, double-clic + saisie des coordonnées).
-
-Pour Arduino : supprimer si nécessaire les limites de la carte.
-
-- imaginer les premiers regroupements de pistes (vrai aussi pour la masse) et les ajuster progressivement sur le schéma ;
-- éviter les **prisons** (deux broches éloignées reliées par une boucle qui bloque l'accès aux autres broches) → privilégier les pistes en parallèle ;
-- pour le passage des pistes, modifier les empreintes si nécessaire (par exemple suppression d'un perçage) : *double-clic sur l'empreinte → Éditer l'empreinte → Créer une nouvelle bibliothèque personnalisée (la placer en favoris) → la modifier puis enregistrer sous cette nouvelle bibliothèque* ;
-- garder en tête qu'il est possible de faire passer des pistes **sous** les composants ;
-- dans certains cas, créer des ponts filaires (parfois inévitable).
-
-> **Important** : définir la couche `Edge.Cuts` (contour du PCB).
-
-**#6 — Réaffectation des broches**
-
-Objectif : faciliter le routage.
-
-- veiller à la capacité de chaque broche ;
-- bon à savoir : sur Arduino, les broches analogiques peuvent être réaffectées en numérique ;
-- noter toutes les modifications pour adapter le code en conséquence.
-
-**#7 — Modification du code**
-
-Reporter les réaffectations de broches dans le code source.
-
-**#8 — Nouveau prototypage** *(facultatif)*
-
-#### Préparation des fichiers pour l'usinage
-
-**#9 — Export des fichiers Gerber et Excellon**
-
-Exporter a minima : `B.Cu` + `Edge.Cuts` + `.drl`.
-
-**#10 — Traitement dans FlatCam**
-
-Génération des fichiers SVG.
-
-**#11 — Traitement dans Inkscape** *(facultatif)*
-
-Fusionner les « combos », supprimer les contours superflus.
-
-### 5.2 Liste des équipements et positionnement
-
-- Shield Arduino custom avec PCB **débordant du form factor** standard.
-- L'écran déborde de **8 mm minimum vers le haut** ; les broches sont à **4 mm minimum** du bord de la carte.
-- **Pile 9 V** pour alimentation sur `Vin` (anticiper l'emplacement d'un futur interrupteur d'alimentation). Branchement filaire sur le PCB via une cosse de raccordement, à droite des broches de l'écran.
-- **Potentiomètre de contraste** : utile uniquement pour la mise au point, pas besoin d'être accessible une fois la carte dans son boîtier. Position classique conservée, mais il sera caché sous le capot.
-- **Port USB de l'Arduino** : accessible pour reprogrammation.
-- **Bouton reset** : ajout d'un bouton dédié pour relancer le jeu (ou aménager la forme du PCB pour conserver l'accès au bouton reset d'origine de l'Arduino).
-- **Buzzer** : monté en face arrière du PCB. Attention à :
- - ce que la position des mains lors du jeu ne bouche pas le son,
- - ce qu'il ne touche pas / ne court-circuite pas les broches en sous-face de l'écran (le centrer sur la hauteur, l'aligner à gauche sur le bord du module écran).
-
-#### Dimensions du PCB
-
-| | Hauteur | Largeur |
-|---|---|---|
-| Idéal | 78 mm | 80 mm |
-| Plaque à graver disponible | 70 mm | 100 mm |
-| **PCB final retenu** | **65 mm** | **80 mm** |
-
-### 5.3 Schéma KiCad — réaffectation des broches
-
-#### Boutons
-
-| Bouton | Broche Arduino | Rôle |
-|---|---|---|
-| SW1 | D12 (+ GND) | Bouton **haut** |
-| SW2 | D13 (broche 3 du SW2 sur GND, « 14 » à côté du 13) | Bouton **bas** |
-| SW3 | A0 (broches 1 et 3) + GND (broches 2 et 4, à côté du 5 V) | Bouton **tir** |
-
-#### Buzzer
-
-- Broche **D11** + GND.
-
-#### Écran LCD
-
-| Broche LCD | Broche Arduino |
-|---|---|
-| D7 | D10 |
-| D6 | D9 |
-| D5 | D8 |
-| D4 | D7 |
-| E | D5 |
-| RS | D6 |
-| RW | GND |
-
-#### Masses
-
-`VSS` du LCD, GND du buzzer, GND de SW1 et GND de SW2 sont tous reliés à la masse commune.
-
-> ⚠️ **Important** : sur l'écran LCD, il faudra **souder un pont** entre `R/W` et `VSS` pour relier `R/W` à la masse.
-
----
-
-## 6. Tutoriel : préparation pour la CNC
-
-### 6.1 Création d'un PCB à la CNC (gravure « à l'anglaise »)
-
-**Logiciels utilisés :**
-
-- KiCad — version 9.0
-- FlatCam — version bêta 8.994
-- Inkscape
-- Easel (pilotage de la CNC)
-
-### 6.2 Étapes dans KiCad
-
-#### Règles de conception → contraintes
-
-Vérifier :
-
-- le **diamètre des pads** : 3 mm (double-clic sur les pads → *Propriétés*) ;
-- la **distance entre pads** : 2,54 mm.
-
-> Proposition : passer à 2,34 mm (= 2,54 − 2 × 0,1) pour ménager une marge ?
-
-#### Ajouter le contour du circuit
-
-- sélectionner la couche `Edge.Cuts`,
-- utiliser par exemple l'outil **Rectangle**, clic simple.
-
-#### Export des fichiers de fabrication
-
-*Fichier → Fichiers de fabrication → Gerber → Tracer*, puis créer les **fichiers de perçage** (Excellon).
-
-> ⚠️ Ne pas oublier d'exporter la couche `Edge.Cuts`.
-
-### 6.3 FlatCam
-
-**Téléchargement** :
-
-> En date du 01/04/2026, la version 8.994 est disponible avec un `.exe` pour Windows.
-
-#### 1. Ouvrir FlatCam
-
-#### 2. Charger les fichiers
-
-- **Open Gerber** pour le fichier de la face cuivre + `Edge.Cuts`,
-- **Open Excellon** pour les fichiers de perçage :
- - `PTH` → perçage des composants,
- - `NPTH` → autres perçages.
-
-#### 3. Convertir Gerber et Excellon en géométries
-
-- sélectionner les fichiers,
-- *Edit → Conversion → Convert Any to Geo*.
-
-#### 4. Joindre les contours aux géométries
-
-**Pour les pistes** : sélectionner `B.Cu` + `Edge.Cuts` → *Edit → Join Objects → Join Geo / Gerber / Excellon*. Cela génère une nouvelle géométrie « Combo… ».
-
-**Pour les perçages** : même opération avec `PTH.drl` + `Edge.Cuts`.
-
-> ⚠️ Il n'est *a priori* pas possible de joindre efficacement les géométries `PTH.drl` et `B.Cu` directement : le fichier de pistes efface / écrase le fichier de perçage.
-
-#### Variante (ancienne version)
-
-Ajouter manuellement une forme contour sur toutes les géométries :
-
-1. sélectionner la géométrie → *Properties → Geometry Editor* ;
-2. choisir l'outil souhaité (par exemple **Rectangle**) ;
-3. dessiner le contour.
-
-Toutes les géométries doivent partager le même contour pour garantir leur alignement par la suite.
-
-#### 5. Exporter les géométries « Combo » en SVG
-
-Sélectionner chaque géométrie puis *File → Export → SVG* (autant de fichiers SVG que de géométries).
-
-### 6.4 Inkscape *(facultatif)*
-
-1. Ouvrir les fichiers SVG « Combo » et faire copier / coller.
-2. Appliquer un **effet miroir** si nécessaire (réfléchir au résultat attendu).
-3. Séparément, **dégrouper** puis **unir** les pistes d'un côté, les perçages de l'autre.
-4. Regrouper chacun avec son contour respectif.
-5. Aligner les deux fichiers via leurs contours.
-6. Supprimer les contours superflus pour n'en conserver qu'un seul.
-7. Enregistrer le tout dans un seul fichier SVG final.
-
-> Option : conserver 2 contours est possible mais sans réel intérêt.
-
-### 6.5 Easel — usinage CNC
-
-#### Préparation du projet
-
-1. *Nouveau projet* → donner un nom au projet (cliquer sur *Untitled*).
-2. Régler l'unité en **millimètres**.
-3. Spécifier le **matériau PCB** et ses dimensions — **surtout l'épaisseur** (PCB du Lab = **1,4 mm**).
-
-> ⚠️ Appliquer un **miroir** si nécessaire (réfléchir au résultat).
->
-> Vérifier la bonne superposition des SVG si besoin.
-
-#### Gravure des pistes
-
-> ⚠️ Vérifier de nouveau l'effet miroir.
->
-> Important : **monter la fraise** et faire un **homing**.
-
-**Fraise utilisée** : V-bits → *Other* → **pointe javelot 30°, 0,125 in (⅛ pouce)**.
-
-**Cut settings** *(onglet Manual)* :
-
-| Paramètre | Valeur |
-|---|---|
-| Feed rate | 60 mm/min |
-| Plunge rate | 60 mm/min |
-| Depth per pass | 0,05 mm |
-
-**Import du SVG** : *Project → Import SVG*. Le placer à l'origine via `Ctrl + A` puis position `X = 0`, `Y = 0` (veiller à avoir un remplissage interne sur la couche extérieure, ou équivalent).
-
-Supprimer le contour et, au besoin, les trous de perçage. Combiner les pistes : `Ctrl + A` puis *Edit → Combine*.
-
-**Définir la profondeur de passe et le mode** : `Ctrl + A` → *Cut* → `Depth = 0,1 mm` *(à vérifier — proposition : 0,2 mm ?)* → **Cut outside shape path**.
-
-#### Perçages
-
-> ⚠️ Vérifier l'effet miroir.
->
-> 💡 Préparer le fichier pendant que la fraise refroidit !
-
-- monter la fraise et faire un homing ;
-- *Probe* → **Use Last XY Zero** ;
-- ré-importer le SVG, le placer à `(0, 0)` (ou `Ctrl + Z`), puis supprimer le contour et les pistes ;
-- au besoin, supprimer aussi tout reste de contour ou de pistes.
-
-**Fraise utilisée** : 1/32 in (0,03125 in).
-
-**Profondeur et mode** : `Ctrl + A` → *Cut* → `Depth = max` (+ ajouter `0,2 mm` via **Add depth**) → **Cut inside shape path**.
-
-**Cut settings** :
-
-| Paramètre | Valeur |
-|---|---|
-| Feed rate | 300 mm/min |
-| Plunge rate | 100 mm/min |
-| Depth per pass | 0,4 mm |
-
-#### Découpe du contour
-
-- **Work Zero** : *Manual* → **Use Last Position** ;
-- ré-importer le SVG à `(0, 0)`, supprimer perçages et pistes (ou tracer directement le contour avec les outils d'Easel).
-
-**Fraise utilisée** : 1/32 in.
-
-**Profondeur et mode** : `Ctrl + A` → *Cut* → `Depth = max` (+ `0,2 mm` supplémentaires) → **Cut outside shape path**.
-
-> Sans les **tabs** ?
-
-**Cut settings** :
-
-| Paramètre | Valeur |
-|---|---|
-| Feed rate | 300 mm/min |
-| Plunge rate | 100 mm/min |
-| Depth per pass | 0,4 mm |
-
-#### Fixation de la plaque PCB
-
-> 💡 Conseil : travailler **en bas à gauche** de la fraiseuse.
-
----
-
-## 7. Et après ?
-
-À définir : exposition, autres ateliers, création d'un club, prolongements logiciels et matériels…
-
----
-
-## Notes éditoriales (à traiter)
-
-- Harmoniser / reprendre la cohérence des notes encore en suspens.
-- Vérifier les points marqués `?` (notamment indicateurs de non-connexion, valeur de profondeur à 0,1 ou 0,2 mm, pas à 2,34 ou 2,54 mm).
-- Compléter la section « Et après ? ».
-- Réinsérer les illustrations du document original aux emplacements pertinents (KiCad, FlatCam, Easel).
\ No newline at end of file
diff --git a/a9474a83-43b3-484c-950e-37a27ff663fe/meta.json b/a9474a83-43b3-484c-950e-37a27ff663fe/meta.json
deleted file mode 100644
index 3a65f52..0000000
--- a/a9474a83-43b3-484c-950e-37a27ff663fe/meta.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "uuid": "a9474a83-43b3-484c-950e-37a27ff663fe",
- "slug": "game-watch-diy-fabrication",
- "title": "Gawfgbsdfg",
- "author": "cedric@abonnel.fr",
- "published": false,
- "featured": false,
- "published_at": "2026-05-13 18:08",
- "created_at": "2026-05-13 18:12:54",
- "updated_at": "2026-05-15 22:57:05",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-15 22:57:05",
- "comment": "Titre modifié, contenu modifié",
- "title": "Game & Watch DIY — Fabrication"
- }
- ],
- "cover": "",
- "files_meta": {
- "9ae9bc58c13ca70c-56046.jpg": {
- "author": "",
- "source_url": "https://images.freeimages.com/images/previews/9df/nature-1370816.jpg"
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "fablab",
- "tags": []
-}
diff --git a/a9474a83-43b3-484c-950e-37a27ff663fe/revisions/0001.md b/a9474a83-43b3-484c-950e-37a27ff663fe/revisions/0001.md
deleted file mode 100644
index fe944a3..0000000
--- a/a9474a83-43b3-484c-950e-37a27ff663fe/revisions/0001.md
+++ /dev/null
@@ -1,781 +0,0 @@
-> Document de travail consolidant le prototypage Arduino, la conception du PCB sous KiCad, les règles de conception et la préparation des fichiers pour la CNC.
-
----
-
-## 1. Rappel : prototypage
-
-### 1.1 Liste du matériel
-
-- 1 × Arduino Uno
-- 1 × écran LCD 16 broches (non I²C)
-- 3 × boutons poussoirs
-- 1 × buzzer
-- 1 × résistance 220 Ω
-- 1 × potentiomètre 10 kΩ *(facultatif — voir remarque ci-dessous)*
-
-### 1.2 Câblage
-
-**Écran LCD** — câblage identique au projet n° 11 du livre de référence ; consulter les pages 116 et 117 pour le détail des broches.
-
-Une variante sans potentiomètre a été testée (LCD branché directement à la masse) mais elle a été abandonnée.
-
-**Boutons poussoirs** — montés en pull-up interne :
-
-```
-GND → Poussoir → broches 7, 8, 9 (avec INPUT_PULLUP dans le code)
-```
-
-Pour comprendre le principe du montage pull-up :
-
-**Buzzer** — deux broches : l'une à la masse, l'autre sur la broche 6 (qui assure également l'alimentation lors du pilotage par `tone()`). Voir notamment le projet n° 6, p. 71.
-
-### 1.3 Type de jeu
-
-Jeu d'arcade type *Asteroids*.
-
-### 1.4 Code de référence
-
-```cpp
-#include
-LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
-
-// ---- Buzzer ----
-const int PIN_BUZZER = 6;
-inline void beepShoot() { tone(PIN_BUZZER, 2000, 40); } // court
-inline void beepHit() { tone(PIN_BUZZER, 1200, 80); } // moyen
-inline void beepOver() { tone(PIN_BUZZER, 400, 600); } // long
-
-// ---- Boutons ----
-const int boutonTir = 7;
-const int boutonHaut = 8;
-const int boutonBas = 9;
-
-// ---- Affichage ----
-byte CH_VAISSEAU[8] = {
- B00100, B01110, B11111, B11111, B01110, B00100, B00100, B00000
-};
-byte CH_MISSILE[8] = {
- B00100, B00100, B00100, B11111, B00100, B00100, B00100, B00000
-};
-byte CH_ENNEMI[8] = {
- B11111, B10101, B11111, B01010, B11111, B10101, B11111, B00000
-};
-
-int vaisseauLigne = 1; // 0..1
-
-struct Ennemi { int colonne; int ligne; bool actif; };
-const int MAX_ENNEMIS = 3;
-Ennemi ennemis[MAX_ENNEMIS];
-
-struct Projectile { int colonne; int ligne; bool actif; };
-const int MAX_TIRS = 6;
-Projectile tirs[MAX_TIRS];
-
-unsigned long dernierDeplacement = 0;
-unsigned long intervalDeplacement = 500;
-
-unsigned long dernierTir = 0;
-const unsigned long delaiTir = 180;
-
-int score = 0;
-
-void setup() {
- pinMode(boutonTir, INPUT_PULLUP);
- pinMode(boutonHaut, INPUT_PULLUP);
- pinMode(boutonBas, INPUT_PULLUP);
- pinMode(PIN_BUZZER, OUTPUT);
-
- lcd.begin(16, 2);
- lcd.createChar(0, CH_VAISSEAU);
- lcd.createChar(1, CH_MISSILE);
- lcd.createChar(2, CH_ENNEMI);
- lcd.print("Vaisseau Pret!");
- delay(600);
- lcd.clear();
-
- randomSeed(analogRead(A0));
- for (int i = 0; i < MAX_ENNEMIS; i++) ennemis[i].actif = false;
- for (int i = 0; i < MAX_TIRS; i++) tirs[i].actif = false;
-}
-
-void loop() {
- unsigned long now = millis();
-
- if (digitalRead(boutonHaut) == LOW) vaisseauLigne = 0;
- else if (digitalRead(boutonBas) == LOW) vaisseauLigne = 1;
-
- // Tir multi-missiles + bip
- if (digitalRead(boutonTir) == LOW && now - dernierTir >= delaiTir) {
- int idx = slotTirLibre();
- if (idx >= 0) {
- tirs[idx].actif = true;
- tirs[idx].colonne = 1;
- tirs[idx].ligne = vaisseauLigne;
- dernierTir = now;
- beepShoot();
- }
- }
-
- if (now - dernierDeplacement > intervalDeplacement) {
- dernierDeplacement = now;
-
- // Déplacer les tirs
- for (int t = 0; t < MAX_TIRS; t++) {
- if (!tirs[t].actif) continue;
- tirs[t].colonne++;
- if (tirs[t].colonne > 15) tirs[t].actif = false;
- }
-
- // Déplacer les ennemis + détection des collisions
- for (int i = 0; i < MAX_ENNEMIS; i++) {
- if (!ennemis[i].actif) continue;
- ennemis[i].colonne--;
-
- for (int t = 0; t < MAX_TIRS; t++) {
- if (!tirs[t].actif) continue;
- if (ennemis[i].colonne == tirs[t].colonne
- && ennemis[i].ligne == tirs[t].ligne) {
- ennemis[i].actif = false;
- tirs[t].actif = false;
- score++;
- beepHit();
- break;
- }
- }
-
- if (ennemis[i].colonne <= 0) {
- beepOver();
- gameOver();
- }
- }
-
- // Apparition d'ennemis
- int actifs = 0;
- for (int i = 0; i < MAX_ENNEMIS; i++) if (ennemis[i].actif) actifs++;
- if (actifs < MAX_ENNEMIS && random(0, 10) > 7) {
- for (int i = 0; i < MAX_ENNEMIS; i++) if (!ennemis[i].actif) {
- ennemis[i].actif = true;
- ennemis[i].colonne = 15;
- ennemis[i].ligne = random(0, 2);
- break;
- }
- }
-
- updateLCD();
- }
-}
-
-int slotTirLibre() {
- for (int i = 0; i < MAX_TIRS; i++) if (!tirs[i].actif) return i;
- return -1;
-}
-
-static inline void printIfOnScreen(int col, int row, uint8_t ch) {
- if (col >= 0 && col <= 15 && row >= 0 && row <= 1) {
- lcd.setCursor(col, row);
- lcd.write(ch);
- }
-}
-
-void updateLCD() {
- lcd.clear();
- lcd.setCursor(10, 0); lcd.print("S:"); lcd.print(score);
-
- printIfOnScreen(0, vaisseauLigne, 0); // vaisseau
-
- // Tirs
- for (int t = 0; t < MAX_TIRS; t++) {
- if (!tirs[t].actif) continue;
- if (tirs[t].colonne >= 0 && tirs[t].colonne <= 15) {
- lcd.setCursor(tirs[t].colonne, tirs[t].ligne);
- lcd.write((uint8_t)1); // missile
- }
- }
-
- // Ennemis
- for (int i = 0; i < MAX_ENNEMIS; i++) {
- if (!ennemis[i].actif) continue;
- if (ennemis[i].colonne >= 0 && ennemis[i].colonne <= 15) {
- lcd.setCursor(ennemis[i].colonne, ennemis[i].ligne);
- lcd.write((uint8_t)2); // ennemi
- }
- }
-}
-
-void gameOver() {
- lcd.clear();
- lcd.setCursor(3, 0); lcd.print("GAME OVER");
- lcd.setCursor(4, 1); lcd.print("Score:"); lcd.print(score);
- while (true) {}
-}
-```
-
----
-
-## 2. Tutoriel : préparation sous KiCad
-
-### 2.1 Atelier — KiCad → PCB → CNC
-
-> ⚠️ Tutoriel expérimental : à revérifier, tester et adapter au besoin.
-
-Site officiel : — éditeur de PCB libre et gratuit.
-
-### 2.2 Création du projet
-
-Deux possibilités :
-
-- **Projet vierge** : *Fichier → Nouveau projet*
-- **Projet « shield Arduino »** : *Fichier → Nouveau projet à partir d'un modèle → Arduino UNO Shield*
-
-L'exemple suivant porte sur la création d'un shield Arduino Uno comportant 3 LED, 3 résistances de 220 Ω et 3 boutons.
-
-Enregistrer le projet dans un dossier dédié (ici, `shieldDynalab`). Il contient deux fichiers principaux :
-
-- `*.kicad_sch` — conception du circuit électronique (schéma)
-- `*.kicad_pcb` — agencement des composants sur le circuit imprimé et dessin des pistes
-
-Ouvrir le fichier `.kicad_sch`. Le modèle Arduino Uno Shield contient déjà les broches correspondant aux pins de l'Arduino.
-
-### 2.3 Ajout des composants
-
-Cliquer sur le bouton **Ajouter un symbole** (barre d'outils de droite, en haut). Dans le champ de recherche, saisir le nom du composant *en anglais* (par exemple `led`).
-
-Sélectionner le composant dans la liste : son symbole électrique s'affiche dans le volet de droite. Puis, via le menu déroulant **Pas d'empreinte par défaut**, sélectionner l'empreinte qui correspond au composant physique (par exemple via la référence constructeur ou les dimensions).
-
-> **Empreinte** : espace physique occupé par le composant sur le PCB ainsi que la position de ses broches.
-
-- **SMD** *(Surface Mount Device)* — composant monté en surface
-- **THT** *(Through-Hole Technology)* — composant traversant
-
-Vérifier que l'empreinte qui s'affiche en dessous semble cohérente, valider, puis poursuivre avec les autres composants (par exemple une résistance 220 Ω).
-
-Si une empreinte n'est pas trouvée dans la liste déroulante, ce n'est pas grave : il sera possible de l'attribuer plus tard, par exemple pour le bouton poussoir.
-
-### 2.4 Attribution des empreintes a posteriori
-
-Pour attribuer une empreinte aux composants qui n'en ont pas encore, utiliser le bouton **Assigner des empreintes**. Une fenêtre liste tous les composants du projet ; il devient possible :
-
-- de modifier les empreintes déjà attribuées,
-- d'en attribuer de nouvelles depuis la liste à droite (recherche par mot-clé ou référence, en anglais ; double-clic pour valider).
-
-En cas de doute, faire un *clic droit* sur le nom de l'empreinte → **Affichage de l'empreinte sélectionnée**, pour vérifier visuellement la cohérence.
-
-Si un composant n'existe pas dans la bibliothèque, il est possible de fabriquer une empreinte personnalisée à partir de zéro.
-
-### 2.5 Conception du circuit
-
-Dans l'espace de travail, survoler un composant et utiliser les raccourcis suivants :
-
-| Touche | Action |
-|---|---|
-| `M` | *Move* — déplacer le composant |
-| `R` | *Rotate* — pivoter le composant |
-| `Ctrl + D` | *Duplicate* — dupliquer le composant (cliquer ailleurs pour le poser) |
-
-Le bouton **Ajouter un fil** (barre d'outils de droite) permet de relier les broches entre elles.
-
-Survoler les noms des broches de l'Arduino et faire `Ctrl + D` pour les dupliquer à proximité du module en cours de conception (par exemple le module LED). Procéder de même pour la masse (GND).
-
-Le bouton **Annotation de la schématique** renomme automatiquement les composants pour éviter les conflits.
-
-Ajouter des **indicateurs de non-connexion** sur toutes les broches qui ne seront reliées à rien : cela évite les erreurs lors du contrôle des règles électriques (ERC).
-
-> *Point à vérifier* : sur quelles broches exactement faut-il placer ces indicateurs ?
-
-Il est possible de sélectionner plusieurs composants à la fois pour les dupliquer en bloc (utile lorsqu'un même sous-module se répète sur le circuit).
-
-### 2.6 Passage à l'éditeur de PCB
-
-Une fois le schéma terminé : **sauvegarder**, puis cliquer sur **Commuter vers l'éditeur de PCB** (barre d'outils en haut). Cela ouvre le fichier `.kicad_pcb`.
-
-Au départ, l'éditeur ne contient pas encore les composants du schéma. Pour les importer : **Outils → Mettre à jour le PCB depuis le schéma**.
-
-Les composants apparaissent à l'écran, reliés par des « chevelus » aux broches correspondantes. Reste à les positionner, les orienter et les router de manière à éviter les croisements de pistes (le casse-tête commence ici).
-
-### 2.7 Paramétrage des contraintes (CNC)
-
-Avant de tracer les pistes, paramétrer les contraintes liées à la CNC : **Options du CI → Contraintes**.
-
-Modifier les valeurs minimales pour permettre le passage de la fraise lors de l'isolation des pistes. Se baser sur les diamètres de fraises disponibles.
-
-### 2.8 Tracé des pistes
-
-Le bouton de tracé de piste permet de dessiner les connexions. Au clic sur une broche, l'écran s'assombrit et seules les broches reliées électriquement restent éclairées, ce qui facilite l'identification des connexions à réaliser.
-
-- **Trait rouge** : la piste elle-même
-- **Contour gris** : la zone d'isolation minimum
-
-KiCad maintient automatiquement la distance minimale par rapport aux autres broches et pistes.
-
-**Choix de la couche** — bien sélectionner la couche dans la liste de droite *avant* de tracer :
-
-- `F.Cu` *(front)* — pistes en cuivre côté composants
-- `B.Cu` *(back)* — pistes en cuivre côté soudure
-
-Vérifier le rendu via **Affichage → Visualisation 3D** pour s'assurer que le résultat est physiquement réalisable et cohérent.
-
-> 💡 **Cas de la gravure CNC** : le cuivre ne traverse pas la plaque au niveau des perçages. Les pistes doivent donc être placées de l'autre côté par rapport aux composants. On travaille donc sur la couche `B.Cu`.
->
-> Faire les pistes sur `F.Cu` donne certes un rendu plus clair, mais ne permet pas de souder les composants une fois la plaque gravée à la CNC.
-
-### 2.9 Export des fichiers de fabrication
-
-**Pistes (Gerber)** : *Fichier → Fichier de fabrication → Gerber `.gbr`*. Sélectionner les couches concernées, tracer ; la fenêtre du bas confirme l'enregistrement.
-
-**Perçages (Excellon)** : *Fichier → Fichier de fabrication → Fichier de perçage `.drl`*. Créer le fichier de perçage ET le plan de perçage.
-
-### 2.10 Conversion Gerber → SVG
-
-Utiliser **FlatCam** : il permet d'ouvrir des fichiers Gerber, de définir le diamètre et le type de fraise utilisée, et de générer automatiquement le tracé vectoriel du chemin que la CNC empruntera. Il est également possible d'ajouter manuellement des traits si nécessaire.
-
-Étapes :
-
-1. Import des fichiers Gerber
-2. Paramétrage de l'isolation
-3. Création de la géométrie
-4. Adaptation manuelle du tracé si besoin
-5. Géométrie sélectionnée → **Export SVG** ou **DXF**, ou bien génération directe du chemin CNC
-
-Tutoriel vidéo :
-
-### 2.11 Ressources complémentaires
-
-Documentation KiCad en français sur Fabmanager :
-
----
-
-## 3. Atelier 2 — déroulé
-
-1. Retour sur les règles de conception
-2. Retour d'expérience sur le projet
-3. Préparation des fichiers pour la CNC
-4. Usinage sur CNC
-5. **Et après ?** Exposition, autres ateliers, création d'un club ?
-
----
-
-## 4. Règles de conception du PCB
-
-### 4.1 Points abordés ensemble
-
-#### 1. Type de fabrication et couches utilisées
-
-PCB simple face : les pistes sont gravées sur la face cuivre inférieure, les composants traversants sont placés sur la face supérieure. Dans KiCad, router donc les pistes sur la couche `B.Cu`.
-
-#### 2. Types de composants électroniques
-
-- **CMS** (Composants Montés en Surface) = **SMD** (*Surface Mount Device*) : même chose, en français et en anglais.
-- **THT** (*Through-Hole Technology*) : composants traversants.
-
-#### 3. Outils de vérification dans KiCad
-
-- **DRC** (*Design Rule Check*) : contrôle du respect des règles de conception du PCB.
-- **ERC** (*Electrical Rule Check*) : contrôle de la cohérence électrique du schéma.
-
-#### 4. Gestion des entrées non connectées
-
-Ne pas laisser d'entrée non connectée (dite « flottante ») : cela peut entraîner des comportements imprévisibles. Sur un microcontrôleur, une broche inutilisée peut rester non connectée à condition d'être correctement configurée par programmation (en sortie, ou avec un état défini par exemple en pull-up/pull-down interne).
-
-#### 5. Routage et angles des pistes
-
-Éviter les angles à 90°, privilégier les angles à 45°. Cela améliore la qualité de fabrication et limite les discontinuités électriques, particulièrement sur les signaux rapides.
-
-#### 6. Gestion des interférences
-
-Éloigner les éléments susceptibles de générer des interférences (liaisons USB, signaux rapides, lignes d'horloge) des entrées analogiques (notamment audio).
-
-Règle générale : plus un signal est rapide, plus il est susceptible de générer ou de subir des interférences. Dans ce cas, privilégier des pistes courtes. À l'inverse, pour des signaux lents (bouton poussoir, LED, commande de relais, UART à faible débit), il est possible de déporter le composant avec des pistes plus longues sans risque significatif.
-
-#### 7. Notion de routage soigné
-
-Un routage soigné consiste à tracer les pistes de manière logique et maîtrisée :
-
-- privilégier des trajets courts et directs,
-- éviter les boucles inutiles,
-- limiter les croisements entre signaux sensibles et signaux bruyants,
-- conserver une proximité cohérente avec la masse pour assurer un bon retour de courant.
-
-Un tracé clair et structuré facilite également la lecture, la maintenance et le dépannage du circuit.
-
-#### 8. Routage des signaux USB
-
-Les lignes D+ et D− doivent avoir des longueurs identiques afin de préserver les caractéristiques du signal différentiel et maintenir une impédance cohérente.
-
-#### 9. Intérêt des PCB multicouches
-
-Lorsque cela est possible, un PCB à quatre couches est une solution idéale : les couches internes dédiées à l'alimentation et à la masse améliorent la stabilité électrique et réduisent les interférences (notamment grâce à leur effet capacitif).
-
-#### 10. Prototypage avec Arduino et intégration
-
-Une carte Arduino Uno est un dispositif complet adapté au prototypage rapide.
-
-Dans une mise en œuvre intégrée, il est possible de ne conserver que le microcontrôleur — par exemple l'ATmega328P — accompagné des éléments minimaux nécessaires à son fonctionnement :
-
-- un quartz (généralement 16 MHz) avec ses deux condensateurs associés,
-- une résistance de pull-up sur la broche `RESET`,
-- les condensateurs de découplage pour l'alimentation.
-
-Pour faciliter l'usage, monter le microcontrôleur sur un support DIP (support tulipe) : cela permet de le retirer aisément pour le reprogrammer sur une carte Arduino.
-
-### 4.2 Bonnes pratiques supplémentaires (bonus à vérifier)
-
-#### 11. Découplage des alimentations
-
-Chaque circuit intégré doit posséder un condensateur de découplage (typiquement 100 nF) placé au plus près de ses broches `VCC` et `GND`. Cela absorbe les variations rapides de courant, stabilise la tension et évite les comportements aléatoires difficiles à diagnostiquer. Pratique particulièrement importante pour les microcontrôleurs et les circuits logiques rapides.
-
-#### 12. Plan de masse (GND)
-
-Plutôt que de relier la masse uniquement par des pistes fines, utiliser une zone de cuivre continue. Cela réduit les interférences électromagnétiques, améliore le retour de courant et simplifie le routage.
-
-Dans le cas d'une gravure CNC, cette pratique est facilement réalisable : le plan de masse correspond au reste de cuivre non gravé, isolé autour des pistes et pastilles. Dans KiCad, on peut remplir la carte avec un *copper pour* (zone cuivrée) affectée à `GND` et relier tous les points de masse.
-
-#### 13. Boucle de courant et retour de masse
-
-Un signal électrique forme toujours une boucle complète : aller + retour. Si le chemin de retour n'est pas proche de la piste du signal, le circuit peut capter ou émettre du bruit. Toujours garder un retour de masse continu et proche pour tous les signaux, en particulier les signaux rapides ou sensibles.
-
-#### 14. Largeur des pistes adaptée au courant
-
-Toutes les pistes ne doivent pas avoir la même largeur :
-
-- les signaux logiques peuvent passer sur des pistes fines,
-- les pistes d'alimentation et celles transportant un courant important doivent être plus larges pour éviter surchauffe, chute de tension ou destruction de la piste.
-
-Il existe des calculateurs en ligne pour déterminer la largeur adaptée selon le courant et l'épaisseur du cuivre.
-
-#### 15. Points de test pour le débogage
-
-Prévoir sur le PCB des points de test accessibles pour mesurer rapidement la tension d'alimentation, vérifier les signaux critiques et suivre les lignes de communication importantes.
-
-Concrètement, ce sont de petites pastilles ou trous métallisés sur lesquels on peut poser la sonde d'un multimètre ou d'un oscilloscope. Cela facilite le dépannage sans avoir à dessouder des composants.
-
-#### 16. Dissipation thermique
-
-Certains composants génèrent de la chaleur (régulateurs de tension, transistors de puissance). Pour éviter la surchauffe et préserver la fiabilité du circuit, prévoir une surface de cuivre suffisante pour dissiper cette chaleur :
-
-- pistes plus larges connectées aux broches concernées,
-- raccordement de ces broches à des zones de cuivre étendues qui agissent comme dissipateurs thermiques.
-
-L'objectif est d'offrir un chemin efficace d'évacuation de la chaleur vers le PCB.
-
-#### 17. Séparation des alimentations
-
-Si le circuit comporte des parties analogiques, numériques et de puissance, séparer les plans ou pistes d'alimentation pour chaque domaine. Par exemple, les moteurs et autres charges fortes peuvent disposer de leur propre piste, tandis que la logique numérique et l'analogique sensible utilisent des pistes ou zones distinctes.
-
-Même si toutes les alimentations proviennent de la même source, cette séparation physique sur le PCB limite les interférences et améliore la stabilité du circuit.
-
----
-
-## 5. Application au projet
-
-### 5.1 Processus itératif (retour d'expérience)
-
-#### Conception du PCB
-
-**#1 — Listing des composants**
-
-Inventorier l'ensemble des composants nécessaires.
-
-**#2 — Premiers choix de conception**
-
-- forme globale du PCB,
-- composants accessibles ou non,
-- répartition face supérieure / face inférieure,
-- type d'alimentation (ne pas oublier la batterie !).
-
-**#3 — Test de positionnement et d'implantation réelle** *(si possible)*
-
-- repérer les conflits potentiels (ponts notamment),
-- prendre les mesures critiques,
-- définir la forme et la taille du PCB.
-
-**#4 — Schématisation sous KiCad**
-
-> 💡 Travailler si possible sur un double écran.
-
-- positionner et anticiper a minima l'implantation des éléments ;
-- l'objectif n'est pas nécessairement de produire un schéma facilement lisible, mais un schéma exploitable pour le routage ;
-- éviter au maximum les croisements ;
-- relier directement les composants à la broche source (ne pas chercher à les relier entre eux dans un premier temps) ;
-- si besoin, utiliser l'empreinte d'un autre composant (exemple : une batterie peut être représentée par l'empreinte d'une résistance).
-
-À explorer : sous KiCad, les broches `GND` d'un Arduino ne sont pas reliées entre elles. Affecter un `GND` symbolique à chacune via des labels.
-
-**#5 — Routage sous KiCad (éditeur de PCB)**
-
-Dernier moment pour vérifier les empreintes — vérifier notamment que le pas est bien un multiple de 2,54 mm.
-
-> ⚠️ Après création des pistes, déplacer un composant rompt les connexions. Implanter donc précisément les composants dès le départ (au besoin, double-clic + saisie des coordonnées).
-
-Pour Arduino : supprimer si nécessaire les limites de la carte.
-
-- imaginer les premiers regroupements de pistes (vrai aussi pour la masse) et les ajuster progressivement sur le schéma ;
-- éviter les **prisons** (deux broches éloignées reliées par une boucle qui bloque l'accès aux autres broches) → privilégier les pistes en parallèle ;
-- pour le passage des pistes, modifier les empreintes si nécessaire (par exemple suppression d'un perçage) : *double-clic sur l'empreinte → Éditer l'empreinte → Créer une nouvelle bibliothèque personnalisée (la placer en favoris) → la modifier puis enregistrer sous cette nouvelle bibliothèque* ;
-- garder en tête qu'il est possible de faire passer des pistes **sous** les composants ;
-- dans certains cas, créer des ponts filaires (parfois inévitable).
-
-> **Important** : définir la couche `Edge.Cuts` (contour du PCB).
-
-**#6 — Réaffectation des broches**
-
-Objectif : faciliter le routage.
-
-- veiller à la capacité de chaque broche ;
-- bon à savoir : sur Arduino, les broches analogiques peuvent être réaffectées en numérique ;
-- noter toutes les modifications pour adapter le code en conséquence.
-
-**#7 — Modification du code**
-
-Reporter les réaffectations de broches dans le code source.
-
-**#8 — Nouveau prototypage** *(facultatif)*
-
-#### Préparation des fichiers pour l'usinage
-
-**#9 — Export des fichiers Gerber et Excellon**
-
-Exporter a minima : `B.Cu` + `Edge.Cuts` + `.drl`.
-
-**#10 — Traitement dans FlatCam**
-
-Génération des fichiers SVG.
-
-**#11 — Traitement dans Inkscape** *(facultatif)*
-
-Fusionner les « combos », supprimer les contours superflus.
-
-### 5.2 Liste des équipements et positionnement
-
-- Shield Arduino custom avec PCB **débordant du form factor** standard.
-- L'écran déborde de **8 mm minimum vers le haut** ; les broches sont à **4 mm minimum** du bord de la carte.
-- **Pile 9 V** pour alimentation sur `Vin` (anticiper l'emplacement d'un futur interrupteur d'alimentation). Branchement filaire sur le PCB via une cosse de raccordement, à droite des broches de l'écran.
-- **Potentiomètre de contraste** : utile uniquement pour la mise au point, pas besoin d'être accessible une fois la carte dans son boîtier. Position classique conservée, mais il sera caché sous le capot.
-- **Port USB de l'Arduino** : accessible pour reprogrammation.
-- **Bouton reset** : ajout d'un bouton dédié pour relancer le jeu (ou aménager la forme du PCB pour conserver l'accès au bouton reset d'origine de l'Arduino).
-- **Buzzer** : monté en face arrière du PCB. Attention à :
- - ce que la position des mains lors du jeu ne bouche pas le son,
- - ce qu'il ne touche pas / ne court-circuite pas les broches en sous-face de l'écran (le centrer sur la hauteur, l'aligner à gauche sur le bord du module écran).
-
-#### Dimensions du PCB
-
-| | Hauteur | Largeur |
-|---|---|---|
-| Idéal | 78 mm | 80 mm |
-| Plaque à graver disponible | 70 mm | 100 mm |
-| **PCB final retenu** | **65 mm** | **80 mm** |
-
-### 5.3 Schéma KiCad — réaffectation des broches
-
-#### Boutons
-
-| Bouton | Broche Arduino | Rôle |
-|---|---|---|
-| SW1 | D12 (+ GND) | Bouton **haut** |
-| SW2 | D13 (broche 3 du SW2 sur GND, « 14 » à côté du 13) | Bouton **bas** |
-| SW3 | A0 (broches 1 et 3) + GND (broches 2 et 4, à côté du 5 V) | Bouton **tir** |
-
-#### Buzzer
-
-- Broche **D11** + GND.
-
-#### Écran LCD
-
-| Broche LCD | Broche Arduino |
-|---|---|
-| D7 | D10 |
-| D6 | D9 |
-| D5 | D8 |
-| D4 | D7 |
-| E | D5 |
-| RS | D6 |
-| RW | GND |
-
-#### Masses
-
-`VSS` du LCD, GND du buzzer, GND de SW1 et GND de SW2 sont tous reliés à la masse commune.
-
-> ⚠️ **Important** : sur l'écran LCD, il faudra **souder un pont** entre `R/W` et `VSS` pour relier `R/W` à la masse.
-
----
-
-## 6. Tutoriel : préparation pour la CNC
-
-### 6.1 Création d'un PCB à la CNC (gravure « à l'anglaise »)
-
-**Logiciels utilisés :**
-
-- KiCad — version 9.0
-- FlatCam — version bêta 8.994
-- Inkscape
-- Easel (pilotage de la CNC)
-
-### 6.2 Étapes dans KiCad
-
-#### Règles de conception → contraintes
-
-Vérifier :
-
-- le **diamètre des pads** : 3 mm (double-clic sur les pads → *Propriétés*) ;
-- la **distance entre pads** : 2,54 mm.
-
-> Proposition : passer à 2,34 mm (= 2,54 − 2 × 0,1) pour ménager une marge ?
-
-#### Ajouter le contour du circuit
-
-- sélectionner la couche `Edge.Cuts`,
-- utiliser par exemple l'outil **Rectangle**, clic simple.
-
-#### Export des fichiers de fabrication
-
-*Fichier → Fichiers de fabrication → Gerber → Tracer*, puis créer les **fichiers de perçage** (Excellon).
-
-> ⚠️ Ne pas oublier d'exporter la couche `Edge.Cuts`.
-
-### 6.3 FlatCam
-
-**Téléchargement** :
-
-> En date du 01/04/2026, la version 8.994 est disponible avec un `.exe` pour Windows.
-
-#### 1. Ouvrir FlatCam
-
-#### 2. Charger les fichiers
-
-- **Open Gerber** pour le fichier de la face cuivre + `Edge.Cuts`,
-- **Open Excellon** pour les fichiers de perçage :
- - `PTH` → perçage des composants,
- - `NPTH` → autres perçages.
-
-#### 3. Convertir Gerber et Excellon en géométries
-
-- sélectionner les fichiers,
-- *Edit → Conversion → Convert Any to Geo*.
-
-#### 4. Joindre les contours aux géométries
-
-**Pour les pistes** : sélectionner `B.Cu` + `Edge.Cuts` → *Edit → Join Objects → Join Geo / Gerber / Excellon*. Cela génère une nouvelle géométrie « Combo… ».
-
-**Pour les perçages** : même opération avec `PTH.drl` + `Edge.Cuts`.
-
-> ⚠️ Il n'est *a priori* pas possible de joindre efficacement les géométries `PTH.drl` et `B.Cu` directement : le fichier de pistes efface / écrase le fichier de perçage.
-
-#### Variante (ancienne version)
-
-Ajouter manuellement une forme contour sur toutes les géométries :
-
-1. sélectionner la géométrie → *Properties → Geometry Editor* ;
-2. choisir l'outil souhaité (par exemple **Rectangle**) ;
-3. dessiner le contour.
-
-Toutes les géométries doivent partager le même contour pour garantir leur alignement par la suite.
-
-#### 5. Exporter les géométries « Combo » en SVG
-
-Sélectionner chaque géométrie puis *File → Export → SVG* (autant de fichiers SVG que de géométries).
-
-### 6.4 Inkscape *(facultatif)*
-
-1. Ouvrir les fichiers SVG « Combo » et faire copier / coller.
-2. Appliquer un **effet miroir** si nécessaire (réfléchir au résultat attendu).
-3. Séparément, **dégrouper** puis **unir** les pistes d'un côté, les perçages de l'autre.
-4. Regrouper chacun avec son contour respectif.
-5. Aligner les deux fichiers via leurs contours.
-6. Supprimer les contours superflus pour n'en conserver qu'un seul.
-7. Enregistrer le tout dans un seul fichier SVG final.
-
-> Option : conserver 2 contours est possible mais sans réel intérêt.
-
-### 6.5 Easel — usinage CNC
-
-#### Préparation du projet
-
-1. *Nouveau projet* → donner un nom au projet (cliquer sur *Untitled*).
-2. Régler l'unité en **millimètres**.
-3. Spécifier le **matériau PCB** et ses dimensions — **surtout l'épaisseur** (PCB du Lab = **1,4 mm**).
-
-> ⚠️ Appliquer un **miroir** si nécessaire (réfléchir au résultat).
->
-> Vérifier la bonne superposition des SVG si besoin.
-
-#### Gravure des pistes
-
-> ⚠️ Vérifier de nouveau l'effet miroir.
->
-> Important : **monter la fraise** et faire un **homing**.
-
-**Fraise utilisée** : V-bits → *Other* → **pointe javelot 30°, 0,125 in (⅛ pouce)**.
-
-**Cut settings** *(onglet Manual)* :
-
-| Paramètre | Valeur |
-|---|---|
-| Feed rate | 60 mm/min |
-| Plunge rate | 60 mm/min |
-| Depth per pass | 0,05 mm |
-
-**Import du SVG** : *Project → Import SVG*. Le placer à l'origine via `Ctrl + A` puis position `X = 0`, `Y = 0` (veiller à avoir un remplissage interne sur la couche extérieure, ou équivalent).
-
-Supprimer le contour et, au besoin, les trous de perçage. Combiner les pistes : `Ctrl + A` puis *Edit → Combine*.
-
-**Définir la profondeur de passe et le mode** : `Ctrl + A` → *Cut* → `Depth = 0,1 mm` *(à vérifier — proposition : 0,2 mm ?)* → **Cut outside shape path**.
-
-#### Perçages
-
-> ⚠️ Vérifier l'effet miroir.
->
-> 💡 Préparer le fichier pendant que la fraise refroidit !
-
-- monter la fraise et faire un homing ;
-- *Probe* → **Use Last XY Zero** ;
-- ré-importer le SVG, le placer à `(0, 0)` (ou `Ctrl + Z`), puis supprimer le contour et les pistes ;
-- au besoin, supprimer aussi tout reste de contour ou de pistes.
-
-**Fraise utilisée** : 1/32 in (0,03125 in).
-
-**Profondeur et mode** : `Ctrl + A` → *Cut* → `Depth = max` (+ ajouter `0,2 mm` via **Add depth**) → **Cut inside shape path**.
-
-**Cut settings** :
-
-| Paramètre | Valeur |
-|---|---|
-| Feed rate | 300 mm/min |
-| Plunge rate | 100 mm/min |
-| Depth per pass | 0,4 mm |
-
-#### Découpe du contour
-
-- **Work Zero** : *Manual* → **Use Last Position** ;
-- ré-importer le SVG à `(0, 0)`, supprimer perçages et pistes (ou tracer directement le contour avec les outils d'Easel).
-
-**Fraise utilisée** : 1/32 in.
-
-**Profondeur et mode** : `Ctrl + A` → *Cut* → `Depth = max` (+ `0,2 mm` supplémentaires) → **Cut outside shape path**.
-
-> Sans les **tabs** ?
-
-**Cut settings** :
-
-| Paramètre | Valeur |
-|---|---|
-| Feed rate | 300 mm/min |
-| Plunge rate | 100 mm/min |
-| Depth per pass | 0,4 mm |
-
-#### Fixation de la plaque PCB
-
-> 💡 Conseil : travailler **en bas à gauche** de la fraiseuse.
-
----
-
-## 7. Et après ?
-
-À définir : exposition, autres ateliers, création d'un club, prolongements logiciels et matériels…
-
----
-
-## Notes éditoriales (à traiter)
-
-- Harmoniser / reprendre la cohérence des notes encore en suspens.
-- Vérifier les points marqués `?` (notamment indicateurs de non-connexion, valeur de profondeur à 0,1 ou 0,2 mm, pas à 2,34 ou 2,54 mm).
-- Compléter la section « Et après ? ».
-- Réinsérer les illustrations du document original aux emplacements pertinents (KiCad, FlatCam, Easel).
\ No newline at end of file
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201207-233302.png b/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201207-233302.png
deleted file mode 100644
index ec77278..0000000
Binary files a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201207-233302.png and /dev/null differ
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201209-085932.png b/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201209-085932.png
deleted file mode 100644
index c3766f6..0000000
Binary files a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201209-085932.png and /dev/null differ
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201212-183454.png b/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201212-183454.png
deleted file mode 100644
index 058932f..0000000
Binary files a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20201212-183454.png and /dev/null differ
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20220128-103802.png b/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20220128-103802.png
deleted file mode 100644
index efb0771..0000000
Binary files a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20220128-103802.png and /dev/null differ
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20220128-110155.png b/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20220128-110155.png
deleted file mode 100644
index f661758..0000000
Binary files a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/20220128-110155.png and /dev/null differ
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/esp01.pdf b/ab80312d-1483-4187-bbe6-54bcaed793a9/files/esp01.pdf
deleted file mode 100644
index 4483d76..0000000
Binary files a/ab80312d-1483-4187-bbe6-54bcaed793a9/files/esp01.pdf and /dev/null differ
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/index.md b/ab80312d-1483-4187-bbe6-54bcaed793a9/index.md
deleted file mode 100644
index bd222c1..0000000
--- a/ab80312d-1483-4187-bbe6-54bcaed793a9/index.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# ESP-01 : présentation et premiers pas
-
-
-
-## Présentation
-
-L'[ESP-01](https://amzn.to/3oAwIaR) est un module Wi-Fi compact construit autour du microcontrôleur **ESP8266EX** d'Espressif. Sur un PCB d'environ 24 × 14 mm, il rassemble :
-
-- un microcontrôleur **ESP8266EX** (cœur Tensilica L106 32 bits cadencé à 80/160 MHz) ;
-- une mémoire **SPI Flash** externe (généralement **1 Mo** sur les versions courantes, parfois jusqu'à 4 Mo) ;
-- une **antenne PCB** d'environ 2 dBi, gravée directement sur le circuit imprimé ;
-- un **connecteur 2 × 4 broches** au pas de 2,54 mm.
-
-> Lien d'achat : [ESP-01 basé sur ESP8266](https://amzn.to/3oAwIaR)
-
-### ESP8266EX vs ESP-01 : ne pas confondre
-
-Une confusion fréquente porte sur la dénomination du produit :
-
-- **ESP8266EX** désigne le **circuit intégré** (le SoC) produit par Espressif. C'est la puce qui contient le processeur, la radio Wi-Fi, la RAM et les périphériques.
-- **ESP-01** désigne un **module** : un petit PCB qui embarque l'ESP8266EX, sa mémoire flash, son antenne et un connecteur d'accès. Il est conçu et vendu par AI-Thinker, pas par Espressif.
-
-Plusieurs autres modules existent autour du même SoC (ESP-02, ESP-05, ESP-07, ESP-12, etc.). Ils diffèrent par le nombre de broches exposées, la taille de la flash, le type d'antenne et le facteur de forme. L'ESP-01 est le plus simple et le plus économique de la famille, mais aussi le plus contraint en nombre d'entrées/sorties accessibles.
-
-### Pourquoi un adaptateur USB est nécessaire
-
-L'ESP-01 n'expose qu'un port série UART à 3,3 V — pas d'interface USB, pas de régulateur, pas de bouton. Pour le programmer ou dialoguer avec lui depuis un ordinateur, il faut un **adaptateur USB-série** capable de :
-
-- convertir les niveaux USB en niveaux série logiques ;
-- fournir une alimentation **3,3 V** stable (l'ESP-01 ne tolère pas le 5 V).
-
-Les adaptateurs courants utilisent une puce **CH340**, **CP2102** ou **FT232**. Certains sont des dongles spécialement formés pour accueillir l'ESP-01 directement sur leur connecteur.
-
-> Attention : on lit parfois la référence « CH360 ». Il s'agit en réalité de la **CH340** (de WCH). Aucune puce « CH360 » n'existe dans cette gamme.
-
-## Brochage de l'ESP-01
-
-
-
-Le connecteur 8 broches est directement câblé sur les pins de l'ESP8266EX :
-
-| Broche | Nom | Rôle |
-|---|---|---|
-| 1 | **GND** | Masse |
-| 2 | **GPIO2** | E/S générique. Doit être à l'état haut (ou flottante) au démarrage pour booter normalement. |
-| 3 | **GPIO0** | E/S générique. **Forcée à GND au démarrage** pour entrer en mode programmation (flash). Laissée libre, elle permet un boot normal. |
-| 4 | **RX** | Réception série (UART0). À relier au TX de l'adaptateur USB-série. |
-| 5 | **TX** | Émission série (UART0). À relier au RX de l'adaptateur USB-série. |
-| 6 | **CH_PD** (aussi noté **EN**) | Chip enable. Doit être maintenue à **3,3 V** pour que le module fonctionne. |
-| 7 | **RST** | Reset, actif à l'état bas. |
-| 8 | **VCC** | Alimentation **3,3 V** uniquement. |
-
-Points de vigilance :
-
-- l'alimentation **3,3 V** est impérative ; le 5 V détruit le SoC instantanément ;
-- les pics de courant en émission peuvent atteindre **300 mA**. Une alimentation sous-dimensionnée provoque des resets aléatoires ;
-- les niveaux logiques sont également à 3,3 V : interfacer un Arduino Uno (5 V) sans pont diviseur ou level shifter peut endommager l'ESP.
-
-### Branchement avec un adaptateur USB-CH340
-
-
-
-Une fois l'ESP-01 enfiché dans l'adaptateur, ce dernier joue le rôle de pont entre le port USB de l'ordinateur et l'UART de l'ESP8266EX :
-
-- l'ordinateur voit un port série virtuel (`/dev/ttyUSB0` sous Linux, `COMx` sous Windows) ;
-- l'adaptateur fournit le 3,3 V à l'ESP-01 et relaie les octets dans les deux sens ;
-- la plupart des adaptateurs d'entrée de gamme **ne gèrent pas le passage en mode flash** : voir l'article dédié à la [modification de l'adaptateur USB vers ESP-01](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation) pour ajouter un jumper GPIO0 / GND.
-
-## Datasheet
-
-La documentation officielle est très succincte pour ce module. Les deux références utiles sont :
-
-- la **datasheet de l'ESP8266EX** (Espressif) — caractéristiques électriques, brochage du SoC, consommation :
-- la **datasheet AI-Thinker de l'ESP-01** (sommaire) — dimensions et brochage du module : disponible sur le mirroir du fabricant.
-
-
-
-Le fichier joint à cet article reprend la version condensée diffusée par AI-Thinker : [esp01.pdf](esp01.pdf)
-
-## Configurer l'IDE Arduino
-
-
-
-L'IDE Arduino ne sait pas, par défaut, compiler pour l'ESP8266. Il faut au préalable installer le **board package** correspondant.
-
-### 1. Ajouter l'URL du gestionnaire de cartes
-
-Dans `Fichier → Préférences`, ajouter dans **URL de gestionnaire de cartes supplémentaires** :
-
-```
-https://arduino.esp8266.com/stable/package_esp8266com_index.json
-```
-
-### 2. Installer le support ESP8266
-
-Ouvrir `Outils → Type de carte → Gestionnaire de cartes`, rechercher **esp8266** et installer le paquet *esp8266 by ESP8266 Community*.
-
-### 3. Sélectionner la carte et les paramètres
-
-Pour un ESP-01, choisir `Outils → Type de carte → Generic ESP8266 Module`, puis vérifier les paramètres suivants :
-
-| Paramètre | Valeur recommandée pour ESP-01 |
-|---|---|
-| **Flash Size** | `1MB (FS:64KB OTA:~470KB)` pour les ESP-01 noirs ; `512KB` pour les anciens ESP-01 bleus |
-| **Flash Mode** | `DOUT` (compatible avec la majorité des modules ; éviter `QIO` qui plante au boot sur certains lots) |
-| **Flash Frequency** | `40 MHz` |
-| **CPU Frequency** | `80 MHz` |
-| **Upload Speed** | `115200` baud (vitesse fiable ; possible de monter à 230400 ou 460800 si l'adaptateur suit) |
-| **Reset Method** | `dtr (aka nodemcu)` si l'adaptateur câble DTR ; sinon `no dtr (aka ck)` (reset manuel) |
-| **Port** | port série de l'adaptateur (`/dev/ttyUSB0`, `COM3`…) |
-
-En pratique, sur un ESP-01 récent acheté avec un adaptateur basique, seul le **port série** doit être ajusté. Les valeurs par défaut conviennent.
-
-### 4. Premier téléversement
-
-Un programme de test minimal pour valider la chaîne complète :
-
-```cpp
-void setup() {
- Serial.begin(115200);
- pinMode(LED_BUILTIN, OUTPUT);
-}
-
-void loop() {
- digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
- Serial.println("Hello ESP-01");
- delay(1000);
-}
-```
-
-Avant de lancer le téléversement :
-
-1. placer l'ESP-01 en **mode flash** (GPIO0 à GND au démarrage) ;
-2. brancher l'adaptateur sur le PC ;
-3. lancer le téléversement depuis l'IDE Arduino.
-
-Si l'opération échoue avec un message du type `Failed to connect to ESP8266: Timed out waiting for packet header`, c'est que la mise en mode flash n'a pas été effective. Voir là encore l'article sur la [modification de l'adaptateur](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation).
-
-## Pour aller plus loin
-
-- [Adaptateur USB vers ESP-01 : activer le mode programmation](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation)
-- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)
-- [Réinitialisation d'un ESP-01 : restauration du firmware AT](https://varlog.a5l.fr/post/esp8266ex-restore-commandes-at)
-```
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/meta.json b/ab80312d-1483-4187-bbe6-54bcaed793a9/meta.json
deleted file mode 100644
index a6e2d98..0000000
--- a/ab80312d-1483-4187-bbe6-54bcaed793a9/meta.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "uuid": "ab80312d-1483-4187-bbe6-54bcaed793a9",
- "slug": "specifications-esp-01",
- "title": "ESP-01 : présentation et premiers pas",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2022-01-28 10:03",
- "created_at": "2022-01-28 10:03:16",
- "updated_at": "2026-05-13 18:26:30",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-13 18:26:30",
- "comment": "Contenu modifié",
- "title": "ESP-01 : présentation et premiers pas"
- }
- ],
- "cover": "",
- "files_meta": {
- "20201207-233302.png": {
- "author": "",
- "source_url": ""
- },
- "20201209-085932.png": {
- "author": "",
- "source_url": ""
- },
- "20201212-183454.png": {
- "author": "",
- "source_url": ""
- },
- "20220128-103802.png": {
- "author": "",
- "source_url": ""
- },
- "20220128-110155.png": {
- "author": "",
- "source_url": ""
- },
- "esp01.pdf": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Électronique"
-}
diff --git a/ab80312d-1483-4187-bbe6-54bcaed793a9/revisions/0001.md b/ab80312d-1483-4187-bbe6-54bcaed793a9/revisions/0001.md
deleted file mode 100644
index 5653e29..0000000
--- a/ab80312d-1483-4187-bbe6-54bcaed793a9/revisions/0001.md
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-## Présentation
-
-L'[ESP-01](https://amzn.to/3oAwIaR) est un module Wi-Fi compact construit autour du microcontrôleur **ESP8266EX** d'Espressif. Sur un PCB d'environ 24 × 14 mm, il rassemble :
-
-- un microcontrôleur **ESP8266EX** (cœur Tensilica L106 32 bits cadencé à 80/160 MHz) ;
-- une mémoire **SPI Flash** externe (généralement **1 Mo** sur les versions courantes, parfois jusqu'à 4 Mo) ;
-- une **antenne PCB** d'environ 2 dBi, gravée directement sur le circuit imprimé ;
-- un **connecteur 2 × 4 broches** au pas de 2,54 mm.
-
-> Lien d'achat : [ESP-01 basé sur ESP8266](https://amzn.to/3oAwIaR)
-
-### ESP8266EX vs ESP-01 : ne pas confondre
-
-Une confusion fréquente porte sur la dénomination du produit :
-
-- **ESP8266EX** désigne le **circuit intégré** (le SoC) produit par Espressif. C'est la puce qui contient le processeur, la radio Wi-Fi, la RAM et les périphériques.
-- **ESP-01** désigne un **module** : un petit PCB qui embarque l'ESP8266EX, sa mémoire flash, son antenne et un connecteur d'accès. Il est conçu et vendu par AI-Thinker, pas par Espressif.
-
-Plusieurs autres modules existent autour du même SoC (ESP-02, ESP-05, ESP-07, ESP-12, etc.). Ils diffèrent par le nombre de broches exposées, la taille de la flash, le type d'antenne et le facteur de forme. L'ESP-01 est le plus simple et le plus économique de la famille, mais aussi le plus contraint en nombre d'entrées/sorties accessibles.
-
-### Pourquoi un adaptateur USB est nécessaire
-
-L'ESP-01 n'expose qu'un port série UART à 3,3 V — pas d'interface USB, pas de régulateur, pas de bouton. Pour le programmer ou dialoguer avec lui depuis un ordinateur, il faut un **adaptateur USB-série** capable de :
-
-- convertir les niveaux USB en niveaux série logiques ;
-- fournir une alimentation **3,3 V** stable (l'ESP-01 ne tolère pas le 5 V).
-
-Les adaptateurs courants utilisent une puce **CH340**, **CP2102** ou **FT232**. Certains sont des dongles spécialement formés pour accueillir l'ESP-01 directement sur leur connecteur.
-
-> Attention : on lit parfois la référence « CH360 ». Il s'agit en réalité de la **CH340** (de WCH). Aucune puce « CH360 » n'existe dans cette gamme.
-
-## Brochage de l'ESP-01
-
-
-
-Le connecteur 8 broches est directement câblé sur les pins de l'ESP8266EX :
-
-| Broche | Nom | Rôle |
-|---|---|---|
-| 1 | **GND** | Masse |
-| 2 | **GPIO2** | E/S générique. Doit être à l'état haut (ou flottante) au démarrage pour booter normalement. |
-| 3 | **GPIO0** | E/S générique. **Forcée à GND au démarrage** pour entrer en mode programmation (flash). Laissée libre, elle permet un boot normal. |
-| 4 | **RX** | Réception série (UART0). À relier au TX de l'adaptateur USB-série. |
-| 5 | **TX** | Émission série (UART0). À relier au RX de l'adaptateur USB-série. |
-| 6 | **CH_PD** (aussi noté **EN**) | Chip enable. Doit être maintenue à **3,3 V** pour que le module fonctionne. |
-| 7 | **RST** | Reset, actif à l'état bas. |
-| 8 | **VCC** | Alimentation **3,3 V** uniquement. |
-
-Points de vigilance :
-
-- l'alimentation **3,3 V** est impérative ; le 5 V détruit le SoC instantanément ;
-- les pics de courant en émission peuvent atteindre **300 mA**. Une alimentation sous-dimensionnée provoque des resets aléatoires ;
-- les niveaux logiques sont également à 3,3 V : interfacer un Arduino Uno (5 V) sans pont diviseur ou level shifter peut endommager l'ESP.
-
-### Branchement avec un adaptateur USB-CH340
-
-
-
-Une fois l'ESP-01 enfiché dans l'adaptateur, ce dernier joue le rôle de pont entre le port USB de l'ordinateur et l'UART de l'ESP8266EX :
-
-- l'ordinateur voit un port série virtuel (`/dev/ttyUSB0` sous Linux, `COMx` sous Windows) ;
-- l'adaptateur fournit le 3,3 V à l'ESP-01 et relaie les octets dans les deux sens ;
-- la plupart des adaptateurs d'entrée de gamme **ne gèrent pas le passage en mode flash** : voir l'article dédié à la [modification de l'adaptateur USB vers ESP-01](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation) pour ajouter un jumper GPIO0 / GND.
-
-## Datasheet
-
-La documentation officielle est très succincte pour ce module. Les deux références utiles sont :
-
-- la **datasheet de l'ESP8266EX** (Espressif) — caractéristiques électriques, brochage du SoC, consommation :
-- la **datasheet AI-Thinker de l'ESP-01** (sommaire) — dimensions et brochage du module : disponible sur le mirroir du fabricant.
-
-
-
-Le fichier joint à cet article reprend la version condensée diffusée par AI-Thinker : [esp01.pdf](esp01.pdf)
-
-## Configurer l'IDE Arduino
-
-
-
-L'IDE Arduino ne sait pas, par défaut, compiler pour l'ESP8266. Il faut au préalable installer le **board package** correspondant.
-
-### 1. Ajouter l'URL du gestionnaire de cartes
-
-Dans `Fichier → Préférences`, ajouter dans **URL de gestionnaire de cartes supplémentaires** :
-
-```
-https://arduino.esp8266.com/stable/package_esp8266com_index.json
-```
-
-### 2. Installer le support ESP8266
-
-Ouvrir `Outils → Type de carte → Gestionnaire de cartes`, rechercher **esp8266** et installer le paquet *esp8266 by ESP8266 Community*.
-
-### 3. Sélectionner la carte et les paramètres
-
-Pour un ESP-01, choisir `Outils → Type de carte → Generic ESP8266 Module`, puis vérifier les paramètres suivants :
-
-| Paramètre | Valeur recommandée pour ESP-01 |
-|---|---|
-| **Flash Size** | `1MB (FS:64KB OTA:~470KB)` pour les ESP-01 noirs ; `512KB` pour les anciens ESP-01 bleus |
-| **Flash Mode** | `DOUT` (compatible avec la majorité des modules ; éviter `QIO` qui plante au boot sur certains lots) |
-| **Flash Frequency** | `40 MHz` |
-| **CPU Frequency** | `80 MHz` |
-| **Upload Speed** | `115200` baud (vitesse fiable ; possible de monter à 230400 ou 460800 si l'adaptateur suit) |
-| **Reset Method** | `dtr (aka nodemcu)` si l'adaptateur câble DTR ; sinon `no dtr (aka ck)` (reset manuel) |
-| **Port** | port série de l'adaptateur (`/dev/ttyUSB0`, `COM3`…) |
-
-En pratique, sur un ESP-01 récent acheté avec un adaptateur basique, seul le **port série** doit être ajusté. Les valeurs par défaut conviennent.
-
-### 4. Premier téléversement
-
-Un programme de test minimal pour valider la chaîne complète :
-
-```cpp
-void setup() {
- Serial.begin(115200);
- pinMode(LED_BUILTIN, OUTPUT);
-}
-
-void loop() {
- digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
- Serial.println("Hello ESP-01");
- delay(1000);
-}
-```
-
-Avant de lancer le téléversement :
-
-1. placer l'ESP-01 en **mode flash** (GPIO0 à GND au démarrage) ;
-2. brancher l'adaptateur sur le PC ;
-3. lancer le téléversement depuis l'IDE Arduino.
-
-Si l'opération échoue avec un message du type `Failed to connect to ESP8266: Timed out waiting for packet header`, c'est que la mise en mode flash n'a pas été effective. Voir là encore l'article sur la [modification de l'adaptateur](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation).
-
-## Pour aller plus loin
-
-- [Adaptateur USB vers ESP-01 : activer le mode programmation](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation)
-- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)
-- [Réinitialisation d'un ESP-01 : restauration du firmware AT](https://varlog.a5l.fr/post/esp8266ex-restore-commandes-at)
-```
diff --git a/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/files/dummy.png b/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/files/dummy.png
deleted file mode 100644
index 58bb881..0000000
Binary files a/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/files/dummy.png and /dev/null differ
diff --git a/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/index.md b/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/index.md
deleted file mode 100644
index 222e1a1..0000000
--- a/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/index.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# esptool
-
-
-
-**esptool** est un outil en ligne de commande développé par Espressif (le fabricant des puces ESP32, ESP8266, etc.) qui sert à flasher, programmer et interagir avec les microcontrôleurs ESP via leur port série (UART).
-
-- Espressif recommande d’installer `esptool` via `pip` si possible. [^note: https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html]
-- Ils recommandent fortement d’utiliser un **virtual environment (venv)** pour éviter de polluer l’environnement Python système.
-
-# Installation
-1. Installer le package `python3-pip` et `python3-venv` si ce n’est pas déjà fait :
-
-```BASH
-sudo apt update
-sudo apt install python3-pip python3-venv
-```
-
-2. Crée un `venv` dans votre dossier (par exemple `esptoolenv`) :
-
-```BASH
-python3 -m venv ~/esptoolenv
-```
-
-# Utilisation
-1. Activer le `venv` :
-
-```BASH
-source ~/esptoolenv/bin/activate
-```
-
-2. Installer `esptool` dans le `venv` :
-
-(si vous l'avez effectué dans une utilisation précédente, inutile de le refaire maintenant).
-
-```BASH
-pip install esptool
-```
-
-3. Vérifier que ça marche :
-
-```BASH
-esptool version
-```
-
-Ce qui donne le résultat suivant :
-
-```BASH
-(esptoolenv) cedric41a@cedric41a-MS-7C56:~$ esptool version
-esptool v5.1.0
-5.1.0
-```
-
-4. Quand vous avez fini d’utiliser `esptool`, vous pouvez désactiver le `venv` :
-
-```BASH
-deactivate
-```
\ No newline at end of file
diff --git a/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/meta.json b/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/meta.json
deleted file mode 100644
index 6652b36..0000000
--- a/aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f/meta.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "uuid": "aba42f8a-41ca-4c5f-9a9d-ba3760e10d0f",
- "slug": "esptool",
- "title": "esptool",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-19 11:43:45",
- "created_at": "2025-11-19 11:43:45",
- "updated_at": "2025-11-19 11:43:45",
- "revisions": [],
- "cover": "",
- "files_meta": [],
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Électronique"
-}
diff --git a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/files/dummy.png b/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/files/dummy.png
deleted file mode 100644
index 58bb881..0000000
Binary files a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/files/dummy.png and /dev/null differ
diff --git a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/index.md b/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/index.md
deleted file mode 100644
index dfc9e8f..0000000
--- a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/index.md
+++ /dev/null
@@ -1,157 +0,0 @@
-# Premier programme ESP-01 : afficher les informations système
-
-## Objectif
-
-Le sketch ci-dessous est un petit utilitaire de diagnostic : une fois téléversé sur un ESP-01, il publie toutes les dix secondes sur la console série un état détaillé du microcontrôleur — identifiant, fréquence, tension d'alimentation, version du SDK — ainsi qu'un état de la mémoire flash. C'est l'équivalent d'un `uname -a` couplé à un `df` pour l'ESP8266.
-
-Cet exemple sert deux objectifs :
-
-- **valider la chaîne complète** (adaptateur, mode flash, IDE, board package) en réussissant un premier téléversement ;
-- **identifier précisément le module** en main : la flash réelle ne correspond pas toujours à ce qui est annoncé par le vendeur, et il peut être utile de le constater avant d'aller plus loin.
-
-> **Prérequis** : un ESP-01 programmable depuis l'IDE Arduino. Voir les articles dédiés à l'[adaptateur USB-série](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation) et à la [configuration de l'IDE pour l'ESP-01](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas).
-
-## Le programme
-
-```cpp
-// Demande au SDK de connecter l'ADC interne à la mesure de VCC
-// plutôt qu'à la broche TOUT. Doit être déclaré en dehors de setup()
-// pour être pris en compte au démarrage.
-ADC_MODE(ADC_VCC);
-
-void setup() {
- Serial.begin(115200);
- delay(100); // petit délai pour stabiliser l'UART
-}
-
-void loop() {
- /* ----- ESP8266EX ----- */
- Serial.println("INFO ESP8266EX");
-
- Serial.printf("Numéro de série de l'ESP8266EX .....: %u\n",
- ESP.getChipId());
-
- float frequenceCpu = float(ESP.getCpuFreqMHz());
- Serial.printf("Fréquence du CPU ...................: %4.1f MHz\n",
- frequenceCpu);
-
- // getVcc() renvoie la tension en millivolts
- float vcc = float(ESP.getVcc()) / 1000.0;
- Serial.printf("Alimentation .......................: %4.2f V\n", vcc);
-
- // La version du core Arduino-ESP8266 contient des underscores
- // (ex: 2_7_4) ; on les remplace par des points pour la lisibilité.
- String coreVersion = ESP.getCoreVersion();
- coreVersion.replace('_', '.');
- Serial.print("Version du gestionnaire de carte ...: ");
- Serial.println(coreVersion);
-
- Serial.printf("Version du SDK .....................: %s\n\n",
- ESP.getSdkVersion());
-
- /* ----- Mémoire flash ----- */
- Serial.println("INFO FLASH");
-
- Serial.printf("Numéro de série du chip ............: %u\n",
- ESP.getFlashChipId());
-
- float frequenceFlash = float(ESP.getFlashChipSpeed()) / 1000000.0;
- Serial.printf("Fréquence ..........................: %4.1f MHz\n",
- frequenceFlash);
-
- Serial.printf("Capacité effective .................: %u octets\n",
- ESP.getFlashChipRealSize());
- Serial.printf("Capacité paramétrée dans l'EDI .....: %u octets\n",
- ESP.getFlashChipSize());
-
- Serial.printf("Taille du sketch ...................: %u octets\n",
- ESP.getSketchSize());
- Serial.printf("Mémoire disponible .................: %u octets\n\n\n",
- ESP.getFreeSketchSpace());
-
- delay(10000);
-}
-```
-
-## Téléverser et lire la sortie
-
-1. Sélectionner `Outils → Type de carte → Generic ESP8266 Module`.
-2. Régler le port série sur celui de l'adaptateur.
-3. Placer l'ESP-01 en mode flash (jumper GPIO0 ↔ GND), téléverser, retirer le jumper, redémarrer.
-4. Ouvrir le moniteur série à **115200 bauds**, fin de ligne **NL & CR**.
-
-Sortie attendue (les valeurs varient d'un module à l'autre) :
-
-```
-INFO ESP8266EX
-Numéro de série de l'ESP8266EX .....: 10106374
-Fréquence du CPU ...................: 80.0 MHz
-Alimentation .......................: 3.47 V
-Version du gestionnaire de carte ...: 2.7.4
-Version du SDK .....................: 2.2.2-dev(38a443e)
-
-INFO FLASH
-Numéro de série du chip ............: 1327304
-Fréquence ..........................: 40.0 MHz
-Capacité effective .................: 1048576 octets
-Capacité paramétrée dans l'EDI .....: 1048576 octets
-Taille du sketch ...................: 268288 octets
-Mémoire disponible .................: 778240 octets
-```
-
-## Lecture des informations
-
-### Bloc ESP8266EX
-
-| Information | Méthode | Commentaire |
-|---|---|---|
-| Numéro de série du SoC | `ESP.getChipId()` | Entier 24 bits dérivé de l'adresse MAC du module. Identifie de manière unique un ESP8266 donné. |
-| Fréquence du CPU | `ESP.getCpuFreqMHz()` | 80 MHz par défaut, peut passer à 160 MHz avec `system_update_cpu_freq(160)` ou via les options de carte de l'IDE. |
-| Alimentation | `ESP.getVcc()` | Tension VCC en millivolts. Nécessite `ADC_MODE(ADC_VCC)` et que la broche TOUT (ADC0) soit laissée libre. |
-| Version du core | `ESP.getCoreVersion()` | Version du board package *esp8266 by ESP8266 Community*. C'est lui qui fournit l'API Arduino utilisée ici. |
-| Version du SDK | `ESP.getSdkVersion()` | Version du SDK NONOS d'Espressif, utilisé en interne par le core. Ne pas confondre avec la version du core. |
-
-Lecture de la sortie d'exemple : le module est un ESP8266 cadencé à 80 MHz, alimenté à environ 3,47 V (légèrement au-dessus du nominal de 3,3 V, ce qui reste dans la plage tolérée 3,0–3,6 V), compilé avec le board package 2.7.4 (basé sur le SDK NONOS 2.2.2).
-
-### Bloc Flash
-
-| Information | Méthode | Commentaire |
-|---|---|---|
-| Numéro de série de la flash | `ESP.getFlashChipId()` | Concaténation du manufacturer ID et du device ID renvoyés par la commande JEDEC. Utile pour identifier la puce flash réellement soudée. |
-| Fréquence | `ESP.getFlashChipSpeed()` | Vitesse de l'horloge SPI en Hz. 40 MHz est la valeur standard ; 80 MHz est possible mais instable sur certains lots. |
-| Capacité effective | `ESP.getFlashChipRealSize()` | Taille **physique** de la puce flash, lue dans son JEDEC ID. C'est la vérité matérielle. |
-| Capacité paramétrée | `ESP.getFlashChipSize()` | Taille que l'IDE a annoncée au firmware (paramètre *Flash Size* dans `Outils`). Doit correspondre à la capacité effective. |
-| Taille du sketch | `ESP.getSketchSize()` | Place occupée par le programme actuel. |
-| Mémoire disponible | `ESP.getFreeSketchSpace()` | Place restante utilisable pour un téléversement OTA. **Pas** la RAM libre — pour cela utiliser `ESP.getFreeHeap()`. |
-
-Dans la sortie d'exemple, la flash physique fait **1 Mo** (1 048 576 octets) et l'IDE a été paramétré avec la même valeur : c'est cohérent.
-
-> **Piège classique** : si `getFlashChipRealSize()` et `getFlashChipSize()` diffèrent, le module est mal configuré dans l'IDE. Les conséquences vont de plantages aléatoires au refus de monter le système de fichiers SPIFFS/LittleFS. C'est l'un des intérêts principaux de ce sketch : détecter ce désaccord avant d'investiguer un comportement étrange.
-
-## Variante : ajouter quelques infos utiles
-
-Quelques méthodes complémentaires qu'il peut être pertinent d'ajouter au programme selon les besoins :
-
-```cpp
-Serial.printf("RAM libre (heap) ...................: %u octets\n",
- ESP.getFreeHeap());
-Serial.printf("Fragmentation du heap ..............: %u %%\n",
- ESP.getHeapFragmentation());
-Serial.printf("Plus gros bloc libre ...............: %u octets\n",
- ESP.getMaxFreeBlockSize());
-
-Serial.printf("Adresse MAC ........................: %s\n",
- WiFi.macAddress().c_str()); // nécessite #include
-Serial.printf("Cause du dernier reset .............: %s\n",
- ESP.getResetReason().c_str());
-```
-
-Ces valeurs sont particulièrement intéressantes pour diagnostiquer des plantages : `getResetReason()` indique si le module a redémarré sur un watchdog, un brown-out, un reset matériel ou une exception logicielle.
-
-## Pour aller plus loin
-
-- [L'ESP-01 : présentation et premiers pas](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas)
-- [Adaptateur USB vers ESP-01 : activer le mode programmation](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation)
-- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)
-- Documentation officielle de l'API `ESP` du core Arduino :
-```
\ No newline at end of file
diff --git a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/meta.json b/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/meta.json
deleted file mode 100644
index 1e701f8..0000000
--- a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/meta.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "uuid": "ac8515ca-400e-43dc-b5bb-08aa5e6689b5",
- "slug": "premier-programme-esp-01-afficher-les-informations-systeme",
- "title": "Premier programme ESP-01 : afficher les informations système",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2020-12-12 22:28",
- "created_at": "2020-12-12 22:28:56",
- "updated_at": "2026-05-13 18:30:19",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-13 18:30:19",
- "comment": "Titre modifié, contenu modifié",
- "title": "Premier programme ESP-01"
- }
- ],
- "cover": "",
- "files_meta": {
- "dummy.png": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Électronique"
-}
diff --git a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/revisions/0001.md b/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/revisions/0001.md
deleted file mode 100644
index b6b0e43..0000000
--- a/ac8515ca-400e-43dc-b5bb-08aa5e6689b5/revisions/0001.md
+++ /dev/null
@@ -1,162 +0,0 @@
-Voici une version retravaillée : présentation contextualisée, code commenté, sortie expliquée ligne par ligne, et quelques précisions techniques sur ce que mesurent réellement les fonctions de l'API `ESP`.
-
-```markdown
-
-
-# Premier programme ESP-01 : afficher les informations système
-
-## Objectif
-
-Le sketch ci-dessous est un petit utilitaire de diagnostic : une fois téléversé sur un ESP-01, il publie toutes les dix secondes sur la console série un état détaillé du microcontrôleur — identifiant, fréquence, tension d'alimentation, version du SDK — ainsi qu'un état de la mémoire flash. C'est l'équivalent d'un `uname -a` couplé à un `df` pour l'ESP8266.
-
-Cet exemple sert deux objectifs :
-
-- **valider la chaîne complète** (adaptateur, mode flash, IDE, board package) en réussissant un premier téléversement ;
-- **identifier précisément le module** en main : la flash réelle ne correspond pas toujours à ce qui est annoncé par le vendeur, et il peut être utile de le constater avant d'aller plus loin.
-
-> **Prérequis** : un ESP-01 programmable depuis l'IDE Arduino. Voir les articles dédiés à l'[adaptateur USB-série](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation) et à la [configuration de l'IDE pour l'ESP-01](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas).
-
-## Le programme
-
-```cpp
-// Demande au SDK de connecter l'ADC interne à la mesure de VCC
-// plutôt qu'à la broche TOUT. Doit être déclaré en dehors de setup()
-// pour être pris en compte au démarrage.
-ADC_MODE(ADC_VCC);
-
-void setup() {
- Serial.begin(115200);
- delay(100); // petit délai pour stabiliser l'UART
-}
-
-void loop() {
- /* ----- ESP8266EX ----- */
- Serial.println("INFO ESP8266EX");
-
- Serial.printf("Numéro de série de l'ESP8266EX .....: %u\n",
- ESP.getChipId());
-
- float frequenceCpu = float(ESP.getCpuFreqMHz());
- Serial.printf("Fréquence du CPU ...................: %4.1f MHz\n",
- frequenceCpu);
-
- // getVcc() renvoie la tension en millivolts
- float vcc = float(ESP.getVcc()) / 1000.0;
- Serial.printf("Alimentation .......................: %4.2f V\n", vcc);
-
- // La version du core Arduino-ESP8266 contient des underscores
- // (ex: 2_7_4) ; on les remplace par des points pour la lisibilité.
- String coreVersion = ESP.getCoreVersion();
- coreVersion.replace('_', '.');
- Serial.print("Version du gestionnaire de carte ...: ");
- Serial.println(coreVersion);
-
- Serial.printf("Version du SDK .....................: %s\n\n",
- ESP.getSdkVersion());
-
- /* ----- Mémoire flash ----- */
- Serial.println("INFO FLASH");
-
- Serial.printf("Numéro de série du chip ............: %u\n",
- ESP.getFlashChipId());
-
- float frequenceFlash = float(ESP.getFlashChipSpeed()) / 1000000.0;
- Serial.printf("Fréquence ..........................: %4.1f MHz\n",
- frequenceFlash);
-
- Serial.printf("Capacité effective .................: %u octets\n",
- ESP.getFlashChipRealSize());
- Serial.printf("Capacité paramétrée dans l'EDI .....: %u octets\n",
- ESP.getFlashChipSize());
-
- Serial.printf("Taille du sketch ...................: %u octets\n",
- ESP.getSketchSize());
- Serial.printf("Mémoire disponible .................: %u octets\n\n\n",
- ESP.getFreeSketchSpace());
-
- delay(10000);
-}
-```
-
-## Téléverser et lire la sortie
-
-1. Sélectionner `Outils → Type de carte → Generic ESP8266 Module`.
-2. Régler le port série sur celui de l'adaptateur.
-3. Placer l'ESP-01 en mode flash (jumper GPIO0 ↔ GND), téléverser, retirer le jumper, redémarrer.
-4. Ouvrir le moniteur série à **115200 bauds**, fin de ligne **NL & CR**.
-
-Sortie attendue (les valeurs varient d'un module à l'autre) :
-
-```
-INFO ESP8266EX
-Numéro de série de l'ESP8266EX .....: 10106374
-Fréquence du CPU ...................: 80.0 MHz
-Alimentation .......................: 3.47 V
-Version du gestionnaire de carte ...: 2.7.4
-Version du SDK .....................: 2.2.2-dev(38a443e)
-
-INFO FLASH
-Numéro de série du chip ............: 1327304
-Fréquence ..........................: 40.0 MHz
-Capacité effective .................: 1048576 octets
-Capacité paramétrée dans l'EDI .....: 1048576 octets
-Taille du sketch ...................: 268288 octets
-Mémoire disponible .................: 778240 octets
-```
-
-## Lecture des informations
-
-### Bloc ESP8266EX
-
-| Information | Méthode | Commentaire |
-|---|---|---|
-| Numéro de série du SoC | `ESP.getChipId()` | Entier 24 bits dérivé de l'adresse MAC du module. Identifie de manière unique un ESP8266 donné. |
-| Fréquence du CPU | `ESP.getCpuFreqMHz()` | 80 MHz par défaut, peut passer à 160 MHz avec `system_update_cpu_freq(160)` ou via les options de carte de l'IDE. |
-| Alimentation | `ESP.getVcc()` | Tension VCC en millivolts. Nécessite `ADC_MODE(ADC_VCC)` et que la broche TOUT (ADC0) soit laissée libre. |
-| Version du core | `ESP.getCoreVersion()` | Version du board package *esp8266 by ESP8266 Community*. C'est lui qui fournit l'API Arduino utilisée ici. |
-| Version du SDK | `ESP.getSdkVersion()` | Version du SDK NONOS d'Espressif, utilisé en interne par le core. Ne pas confondre avec la version du core. |
-
-Lecture de la sortie d'exemple : le module est un ESP8266 cadencé à 80 MHz, alimenté à environ 3,47 V (légèrement au-dessus du nominal de 3,3 V, ce qui reste dans la plage tolérée 3,0–3,6 V), compilé avec le board package 2.7.4 (basé sur le SDK NONOS 2.2.2).
-
-### Bloc Flash
-
-| Information | Méthode | Commentaire |
-|---|---|---|
-| Numéro de série de la flash | `ESP.getFlashChipId()` | Concaténation du manufacturer ID et du device ID renvoyés par la commande JEDEC. Utile pour identifier la puce flash réellement soudée. |
-| Fréquence | `ESP.getFlashChipSpeed()` | Vitesse de l'horloge SPI en Hz. 40 MHz est la valeur standard ; 80 MHz est possible mais instable sur certains lots. |
-| Capacité effective | `ESP.getFlashChipRealSize()` | Taille **physique** de la puce flash, lue dans son JEDEC ID. C'est la vérité matérielle. |
-| Capacité paramétrée | `ESP.getFlashChipSize()` | Taille que l'IDE a annoncée au firmware (paramètre *Flash Size* dans `Outils`). Doit correspondre à la capacité effective. |
-| Taille du sketch | `ESP.getSketchSize()` | Place occupée par le programme actuel. |
-| Mémoire disponible | `ESP.getFreeSketchSpace()` | Place restante utilisable pour un téléversement OTA. **Pas** la RAM libre — pour cela utiliser `ESP.getFreeHeap()`. |
-
-Dans la sortie d'exemple, la flash physique fait **1 Mo** (1 048 576 octets) et l'IDE a été paramétré avec la même valeur : c'est cohérent.
-
-> **Piège classique** : si `getFlashChipRealSize()` et `getFlashChipSize()` diffèrent, le module est mal configuré dans l'IDE. Les conséquences vont de plantages aléatoires au refus de monter le système de fichiers SPIFFS/LittleFS. C'est l'un des intérêts principaux de ce sketch : détecter ce désaccord avant d'investiguer un comportement étrange.
-
-## Variante : ajouter quelques infos utiles
-
-Quelques méthodes complémentaires qu'il peut être pertinent d'ajouter au programme selon les besoins :
-
-```cpp
-Serial.printf("RAM libre (heap) ...................: %u octets\n",
- ESP.getFreeHeap());
-Serial.printf("Fragmentation du heap ..............: %u %%\n",
- ESP.getHeapFragmentation());
-Serial.printf("Plus gros bloc libre ...............: %u octets\n",
- ESP.getMaxFreeBlockSize());
-
-Serial.printf("Adresse MAC ........................: %s\n",
- WiFi.macAddress().c_str()); // nécessite #include
-Serial.printf("Cause du dernier reset .............: %s\n",
- ESP.getResetReason().c_str());
-```
-
-Ces valeurs sont particulièrement intéressantes pour diagnostiquer des plantages : `getResetReason()` indique si le module a redémarré sur un watchdog, un brown-out, un reset matériel ou une exception logicielle.
-
-## Pour aller plus loin
-
-- [L'ESP-01 : présentation et premiers pas](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas)
-- [Adaptateur USB vers ESP-01 : activer le mode programmation](https://varlog.a5l.fr/post/adaptateur-usb-vers-esp-01-activer-le-mode-programmation)
-- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)
-- Documentation officielle de l'API `ESP` du core Arduino :
-```
\ No newline at end of file
diff --git a/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/index.md b/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/index.md
deleted file mode 100644
index 738a210..0000000
--- a/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/index.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Premiers pas DevOps : préparer un système Debian fraîchement installé
-
-Lorsqu'on vient de provisionner une machine Debian — que ce soit un conteneur LXC, une VM ou un serveur dédié — quelques étapes initiales sont incontournables avant de pouvoir vraiment travailler dessus. Ce petit guide reprend les gestes de base : passer en `root`, configurer les dépôts officiels, mettre le système à jour, installer `sudo`, et terminer par quelques réglages d'identification qui éviteront des surprises plus tard. Rien de sorcier, mais autant prendre de bonnes habitudes dès le départ.
-
-## Passer en utilisateur root
-
-La première étape consiste à obtenir les droits administrateur. Sur une Debian fraîche, l'utilisateur `root` existe déjà et possède un mot de passe défini lors de l'installation. Pour ouvrir une session avec son environnement complet (variables, PATH, répertoire personnel), on utilise :
-
-```bash
-su - root
-```
-
-Le tiret est important : sans lui, on hérite uniquement de l'UID de root sans charger son shell de connexion, ce qui peut donner lieu à des surprises (PATH incomplet, absence de `/sbin` dans la recherche des commandes, etc.).
-
-À noter que si `sudo` est déjà installé et que l'utilisateur courant fait partie du groupe `sudo`, on peut aussi écrire `sudo -i` pour obtenir le même résultat. Mais sur une Debian minimale tout juste installée, `sudo` n'est généralement pas présent — d'où la nécessité de passer par `su` dans un premier temps.
-
-## Configurer les dépôts officiels
-
-Debian s'appuie sur APT pour gérer ses paquets, et APT a besoin de savoir où les chercher. Cette configuration se trouve dans le fichier `/etc/apt/sources.list` (et, sur les versions récentes, éventuellement dans `/etc/apt/sources.list.d/` pour les dépôts additionnels).
-
-On l'ouvre avec un éditeur de texte :
-
-```bash
-nano /etc/apt/sources.list
-```
-
-Un contenu typique pour Debian 12 (Bookworm) ressemble à ceci :
-
-```
-deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
-deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
-deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
-```
-
-Quelques explications rapides sur les composants :
-
-- **main** contient les paquets libres officiellement supportés par Debian
-- **contrib** regroupe les paquets libres qui dépendent de logiciels non libres
-- **non-free** et **non-free-firmware** contiennent les paquets non libres (utiles notamment pour les pilotes matériels)
-
-Le dépôt `bookworm-updates` apporte les mises à jour stables non urgentes, tandis que `bookworm-security` fournit les correctifs de sécurité — celui-ci est essentiel et ne doit jamais être omis sur une machine connectée au réseau.
-
-Pour une version différente de Debian, il suffit de remplacer `bookworm` par le nom de code correspondant (`bullseye`, `trixie`, etc.).
-
-## Mettre le système à jour
-
-Une fois les dépôts configurés, on récupère la liste des paquets disponibles puis on applique les mises à jour :
-
-```bash
-apt update
-apt upgrade
-```
-
-La distinction entre les deux est importante :
-
-- `apt update` ne met rien à jour : la commande synchronise simplement l'index local des paquets avec ce que les dépôts annoncent. Sans cette étape, APT ignore l'existence des nouvelles versions.
-- `apt upgrade` installe effectivement les versions plus récentes des paquets déjà présents.
-
-Pour les mises à jour plus profondes qui peuvent ajouter ou retirer des paquets (changement de dépendances, transitions majeures), il existe aussi `apt full-upgrade`. À utiliser avec un peu plus de précaution, mais c'est ce qu'il faut pour suivre l'évolution complète d'une distribution.
-
-Sur un conteneur ou une VM fraîche, cette première mise à jour peut tirer un certain nombre de paquets. C'est normal : l'image de base est figée au moment de sa publication, et plusieurs mois de correctifs se sont souvent accumulés depuis.
-
-Petit conseil pour la suite, dès qu'on commencera à scripter ces opérations : préférer `apt-get` à `apt` dans les scripts, car son interface est garantie stable entre versions. Et pour éviter les questions interactives bloquantes lors d'installations automatisées, positionner `DEBIAN_FRONTEND=noninteractive` dans l'environnement.
-
-## Installer sudo
-
-Par défaut, Debian n'installe pas `sudo` sur un système minimal. Travailler en permanence en `root` n'est pourtant pas une bonne pratique : on perd la traçabilité des actions, et la moindre erreur de frappe peut avoir des conséquences sérieuses. L'idée derrière `sudo` est de déléguer ponctuellement des droits administrateur à un utilisateur normal, commande par commande, avec un journal des actions effectuées.
-
-L'installation se fait classiquement :
-
-```bash
-apt install sudo
-```
-
-Ensuite, il faut ajouter son utilisateur (celui avec lequel on se connectera au quotidien) au groupe `sudo` :
-
-```bash
-usermod -aG sudo nom_utilisateur
-```
-
-Le drapeau `-a` (pour *append*) est crucial : sans lui, `usermod -G` remplacerait la liste des groupes secondaires de l'utilisateur au lieu d'y ajouter `sudo`, ce qui peut avoir des effets de bord désagréables.
-
-L'utilisateur doit ensuite se déconnecter puis se reconnecter pour que sa nouvelle appartenance au groupe soit prise en compte. À partir de là, il peut préfixer ses commandes par `sudo` pour les exécuter avec les droits administrateur, en saisissant son propre mot de passe (et non celui de root).
-
-## Régler l'identité et l'horloge de la machine
-
-Deux derniers détails de configuration qui paraissent anodins, mais qui simplifient grandement la vie sur un parc qui grandit.
-
-D'abord, fixer le nom de la machine. Sur une infrastructure organisée, le hostname et le FQDN suivent généralement une convention de nommage (par exemple `dafactures.acegrp.lan` pour un projet de facturation sur un réseau interne). La commande `hostnamectl` s'en charge proprement :
-
-```bash
-hostnamectl set-hostname dafactures.acegrp.lan
-```
-
-Penser à vérifier ensuite que `/etc/hosts` contient bien une ligne associant l'IP locale au FQDN, sous peine de voir certains services (Postfix notamment, ou des outils de log) se plaindre de ne pas résoudre leur propre nom.
-
-Ensuite, le fuseau horaire. Détail souvent négligé qui complique pourtant le débogage dès qu'on croise des logs entre plusieurs machines :
-
-```bash
-timedatectl set-timezone Europe/Paris
-```
-
-La synchronisation NTP est généralement déjà active via `systemd-timesyncd` sur les Debian récentes — un `timedatectl status` permet de le vérifier.
-
-## Et après ?
-
-Une fois ces étapes franchies, la machine est dans un état sain et utilisable. Les pistes naturelles pour la suite tournent autour du durcissement (configuration SSH avec authentification par clé et désactivation de la connexion root à distance, mise en place d'un pare-feu, installation de `unattended-upgrades` pour les correctifs de sécurité automatiques), puis de l'installation des outils métier proprement dits — serveur web, base de données, runtime applicatif.
-
-Garder en tête que ces gestes initiaux, aussi triviaux paraissent-ils, méritent d'être scriptés dès qu'on les répète plus de deux ou trois fois. C'est précisément là que la démarche DevOps prend tout son sens : transformer des manipulations manuelles en code reproductible, versionné et partageable.
\ No newline at end of file
diff --git a/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/meta.json b/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/meta.json
deleted file mode 100644
index a079300..0000000
--- a/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/meta.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "uuid": "ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd",
- "slug": "post-install",
- "title": "Premiers pas DevOps : préparer un système Debian fraîchement installé",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2023-02-09 15:18",
- "created_at": "2023-02-09 15:18:57",
- "updated_at": "2026-05-12 22:57:49",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-12 22:57:49",
- "comment": "Contenu modifié",
- "title": "Premiers pas DevOps : préparer un système Debian fraîchement installé"
- }
- ],
- "cover": "cover.jpg",
- "files_meta": {
- "cover.jpg": {
- "author": "",
- "source_url": "https://3.bp.blogspot.com/-WER6d6fmIXU/WD1K9pOVoQI/AAAAAAAAGt4/47YWFQ7r7HQs2HTlkoz9KRt-1SmBXXaWwCLcB/s320/debian-logo.jpg",
- "title": "Logo Debian GNU Linux",
- "meta": {
- "mime": "image/jpeg",
- "size": 12823,
- "width": 320
- }
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Informatique"
-}
diff --git a/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/revisions/0001.md b/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/revisions/0001.md
deleted file mode 100644
index ecdefa5..0000000
--- a/ad43fd21-ddcf-4ce2-b924-fdaadc8a6cdd/revisions/0001.md
+++ /dev/null
@@ -1,107 +0,0 @@
-Lorsqu'on vient de provisionner une machine Debian — que ce soit un conteneur LXC, une VM ou un serveur dédié — quelques étapes initiales sont incontournables avant de pouvoir vraiment travailler dessus. Ce petit guide reprend les gestes de base : passer en `root`, configurer les dépôts officiels, mettre le système à jour, installer `sudo`, et terminer par quelques réglages d'identification qui éviteront des surprises plus tard. Rien de sorcier, mais autant prendre de bonnes habitudes dès le départ.
-
-## Passer en utilisateur root
-
-La première étape consiste à obtenir les droits administrateur. Sur une Debian fraîche, l'utilisateur `root` existe déjà et possède un mot de passe défini lors de l'installation. Pour ouvrir une session avec son environnement complet (variables, PATH, répertoire personnel), on utilise :
-
-```bash
-su - root
-```
-
-Le tiret est important : sans lui, on hérite uniquement de l'UID de root sans charger son shell de connexion, ce qui peut donner lieu à des surprises (PATH incomplet, absence de `/sbin` dans la recherche des commandes, etc.).
-
-À noter que si `sudo` est déjà installé et que l'utilisateur courant fait partie du groupe `sudo`, on peut aussi écrire `sudo -i` pour obtenir le même résultat. Mais sur une Debian minimale tout juste installée, `sudo` n'est généralement pas présent — d'où la nécessité de passer par `su` dans un premier temps.
-
-## Configurer les dépôts officiels
-
-Debian s'appuie sur APT pour gérer ses paquets, et APT a besoin de savoir où les chercher. Cette configuration se trouve dans le fichier `/etc/apt/sources.list` (et, sur les versions récentes, éventuellement dans `/etc/apt/sources.list.d/` pour les dépôts additionnels).
-
-On l'ouvre avec un éditeur de texte :
-
-```bash
-nano /etc/apt/sources.list
-```
-
-Un contenu typique pour Debian 12 (Bookworm) ressemble à ceci :
-
-```
-deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
-deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
-deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
-```
-
-Quelques explications rapides sur les composants :
-
-- **main** contient les paquets libres officiellement supportés par Debian
-- **contrib** regroupe les paquets libres qui dépendent de logiciels non libres
-- **non-free** et **non-free-firmware** contiennent les paquets non libres (utiles notamment pour les pilotes matériels)
-
-Le dépôt `bookworm-updates` apporte les mises à jour stables non urgentes, tandis que `bookworm-security` fournit les correctifs de sécurité — celui-ci est essentiel et ne doit jamais être omis sur une machine connectée au réseau.
-
-Pour une version différente de Debian, il suffit de remplacer `bookworm` par le nom de code correspondant (`bullseye`, `trixie`, etc.).
-
-## Mettre le système à jour
-
-Une fois les dépôts configurés, on récupère la liste des paquets disponibles puis on applique les mises à jour :
-
-```bash
-apt update
-apt upgrade
-```
-
-La distinction entre les deux est importante :
-
-- `apt update` ne met rien à jour : la commande synchronise simplement l'index local des paquets avec ce que les dépôts annoncent. Sans cette étape, APT ignore l'existence des nouvelles versions.
-- `apt upgrade` installe effectivement les versions plus récentes des paquets déjà présents.
-
-Pour les mises à jour plus profondes qui peuvent ajouter ou retirer des paquets (changement de dépendances, transitions majeures), il existe aussi `apt full-upgrade`. À utiliser avec un peu plus de précaution, mais c'est ce qu'il faut pour suivre l'évolution complète d'une distribution.
-
-Sur un conteneur ou une VM fraîche, cette première mise à jour peut tirer un certain nombre de paquets. C'est normal : l'image de base est figée au moment de sa publication, et plusieurs mois de correctifs se sont souvent accumulés depuis.
-
-Petit conseil pour la suite, dès qu'on commencera à scripter ces opérations : préférer `apt-get` à `apt` dans les scripts, car son interface est garantie stable entre versions. Et pour éviter les questions interactives bloquantes lors d'installations automatisées, positionner `DEBIAN_FRONTEND=noninteractive` dans l'environnement.
-
-## Installer sudo
-
-Par défaut, Debian n'installe pas `sudo` sur un système minimal. Travailler en permanence en `root` n'est pourtant pas une bonne pratique : on perd la traçabilité des actions, et la moindre erreur de frappe peut avoir des conséquences sérieuses. L'idée derrière `sudo` est de déléguer ponctuellement des droits administrateur à un utilisateur normal, commande par commande, avec un journal des actions effectuées.
-
-L'installation se fait classiquement :
-
-```bash
-apt install sudo
-```
-
-Ensuite, il faut ajouter son utilisateur (celui avec lequel on se connectera au quotidien) au groupe `sudo` :
-
-```bash
-usermod -aG sudo nom_utilisateur
-```
-
-Le drapeau `-a` (pour *append*) est crucial : sans lui, `usermod -G` remplacerait la liste des groupes secondaires de l'utilisateur au lieu d'y ajouter `sudo`, ce qui peut avoir des effets de bord désagréables.
-
-L'utilisateur doit ensuite se déconnecter puis se reconnecter pour que sa nouvelle appartenance au groupe soit prise en compte. À partir de là, il peut préfixer ses commandes par `sudo` pour les exécuter avec les droits administrateur, en saisissant son propre mot de passe (et non celui de root).
-
-## Régler l'identité et l'horloge de la machine
-
-Deux derniers détails de configuration qui paraissent anodins, mais qui simplifient grandement la vie sur un parc qui grandit.
-
-D'abord, fixer le nom de la machine. Sur une infrastructure organisée, le hostname et le FQDN suivent généralement une convention de nommage (par exemple `dafactures.acegrp.lan` pour un projet de facturation sur un réseau interne). La commande `hostnamectl` s'en charge proprement :
-
-```bash
-hostnamectl set-hostname dafactures.acegrp.lan
-```
-
-Penser à vérifier ensuite que `/etc/hosts` contient bien une ligne associant l'IP locale au FQDN, sous peine de voir certains services (Postfix notamment, ou des outils de log) se plaindre de ne pas résoudre leur propre nom.
-
-Ensuite, le fuseau horaire. Détail souvent négligé qui complique pourtant le débogage dès qu'on croise des logs entre plusieurs machines :
-
-```bash
-timedatectl set-timezone Europe/Paris
-```
-
-La synchronisation NTP est généralement déjà active via `systemd-timesyncd` sur les Debian récentes — un `timedatectl status` permet de le vérifier.
-
-## Et après ?
-
-Une fois ces étapes franchies, la machine est dans un état sain et utilisable. Les pistes naturelles pour la suite tournent autour du durcissement (configuration SSH avec authentification par clé et désactivation de la connexion root à distance, mise en place d'un pare-feu, installation de `unattended-upgrades` pour les correctifs de sécurité automatiques), puis de l'installation des outils métier proprement dits — serveur web, base de données, runtime applicatif.
-
-Garder en tête que ces gestes initiaux, aussi triviaux paraissent-ils, méritent d'être scriptés dès qu'on les répète plus de deux ou trois fois. C'est précisément là que la démarche DevOps prend tout son sens : transformer des manipulations manuelles en code reproductible, versionné et partageable.
\ No newline at end of file
diff --git a/b0b3ac59-87c5-4598-a549-f3168abb4429/index.md b/b0b3ac59-87c5-4598-a549-f3168abb4429/index.md
deleted file mode 100644
index 309793b..0000000
--- a/b0b3ac59-87c5-4598-a549-f3168abb4429/index.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Quand les conversations sont devenues une matière première
-
-Entre 2023 et 2024, quelque chose s'est rompu sur le web social. Pas un effondrement, pas une crise visible — plutôt un basculement discret, presque administratif, dans la manière dont les grandes plateformes ont commencé à regarder ce que produisaient leurs utilisateurs. Les messages, les fils de discussion, les commentaires sarcastiques sous une photo de chat, les longues confidences nocturnes sur Tumblr : tout cela, jusque-là considéré comme l'humus naturel des réseaux sociaux, est soudainement devenu autre chose. Une ressource. Un actif. Une matière brute.
-
-Le déclencheur s'appelle **Reddit**. Le 22 février 2024, le jour même où l'entreprise dépose son dossier d'introduction en Bourse, elle annonce un accord à 60 millions de dollars par an avec Google : le géant de la recherche pourra puiser dans les archives du forum, via son API, pour entraîner ses modèles d'intelligence artificielle. Quelques mois plus tard, OpenAI signe à son tour un accord similaire, estimé autour de 70 millions de dollars annuels par les analystes. Le message envoyé au marché est limpide : ces décennies de conversations humaines, agrégées par une communauté qui croyait simplement bavarder, valent désormais des centaines de millions de dollars. Steve Huffman, PDG de Reddit, vante un modèle économique enfin durable. Les analystes financiers, eux, parlent de mine d'or.
-
-**Tumblr** rejoint la danse une semaine plus tard, mais par effraction. Le 27 février 2024, le site spécialisé 404 Media révèle qu'Automattic — la maison mère de Tumblr et WordPress.com — finalise des accords avec OpenAI et Midjourney pour leur fournir l'accès aux contenus publiés sur ses plateformes. La fuite est embarrassante : des documents internes montrent qu'une première extraction de données a même ratissé trop large, embarquant par erreur des posts privés, des blogs supprimés et des contenus normalement exclus. Automattic publie en urgence un communiqué annonçant un système d'opt-out — la possibilité pour les utilisateurs de refuser, à condition de cocher la bonne case dans les bons paramètres. Mais la communauté Tumblr, refuge historique d'artistes, d'écrivains amateurs, de communautés queer et de fanfic, n'a pas attendu la procédure officielle pour réagir : la nouvelle déclenche une vague de fermetures de comptes et d'effacements rétroactifs.
-
-**X**, sous la direction d'Elon Musk, emprunte un chemin parallèle mais plus solitaire. Plutôt que de vendre l'accès à ses données à des concurrents, Musk a verrouillé son robinet dès 2023 — au point d'introduire des plafonds de consultation tellement absurdes que la plateforme en est devenue inutilisable pendant quelques jours — et a réservé sa matière première à xAI, sa propre société d'intelligence artificielle, pour alimenter le chatbot Grok. En octobre 2024, X annonce une refonte de ses conditions d'utilisation, effective le 15 novembre. Le nouveau texte est explicite : tout contenu publié sur la plateforme peut être utilisé pour entraîner ses modèles d'apprentissage automatique, ainsi que ceux de « partenaires tiers » non nommés. L'option qui permettait jusque-là aux utilisateurs européens de refuser que leurs posts servent à entraîner Grok est, dans la foulée, devenue inaccessible pour beaucoup. Le principe reste le même que chez Reddit — les mots des utilisateurs deviennent du carburant — mais sans le détour d'un contrat externe.
-
-Car ce qui frappe, ce n'est pas tant chaque accord pris isolément que la rapidité avec laquelle l'idée s'est imposée. En quelques mois, exploiter les mots de ses utilisateurs pour entraîner de l'IA est devenu non plus une stratégie audacieuse, mais une évidence de marché. **LinkedIn**, propriété de Microsoft — qui se trouve aussi être le principal investisseur d'OpenAI —, suit le mouvement avec une discrétion remarquable. Le 18 septembre 2024, une mise à jour silencieuse de sa politique de confidentialité révèle que la plateforme entraîne déjà ses propres modèles d'IA générative à partir des posts, articles et données de profil de ses membres, partout dans le monde — y compris au Royaume-Uni. Personne n'a été prévenu en bonne et due forme ; le paramètre permettant de refuser ne se déclenche pas par défaut.
-
-L'épisode tourne court. En 48 heures, l'Information Commissioner's Office britannique, le régulateur des données, exige un arrêt immédiat de la pratique sur le territoire. Stephen Almond, son directeur exécutif chargé des risques réglementaires, déclare publiquement que la confiance du public dans l'IA générative dépend précisément du respect des droits à la vie privée dès le départ. LinkedIn suspend le traitement au Royaume-Uni, dans l'Espace économique européen et en Suisse. Pour le reste du monde — les États-Unis, l'Asie, le Canada, l'Amérique latine —, la collecte continue, opt-out par défaut.
-
-Mais quelque chose, du côté des utilisateurs, n'a pas suivi.
-
-Sur Reddit, des modérateurs ferment leurs subreddits en protestation. D'autres remplacent leurs anciens posts par des chaînes de caractères absurdes — du sabotage de données, en somme, pour rendre leurs contributions inutilisables. Sur Tumblr, on voit ressurgir un vieux geste internet : des comptes entiers passent en privé, des années d'écriture s'effacent en quelques clics. Des forums spécialisés évoquent une « grève des données ». Une phrase circule, amère, sur plusieurs plateformes à la fois : *« Nos mots valent de l'or, mais pas pour nous. »*
-
-C'est sans doute le paradoxe le plus profond de cette séquence. Pendant deux décennies, les grandes plateformes avaient bâti leur valeur sur un contrat tacite : vous nous donnez votre temps et votre attention, nous vous offrons un espace pour exister et nous monétisons votre regard auprès des annonceurs. Le deal était imparfait, mais lisible. À partir de 2024, un second contrat se superpose au premier sans avoir été négocié : votre langage, vos conversations, vos archives intimes deviennent aussi une matière première vendable, à votre insu le plus souvent, pour entraîner des intelligences qui à terme produiront le même langage que vous — mais en série, à coût marginal nul, et au bénéfice d'autres.
-
-Le web social était entré dans une nouvelle ère. Celle où les conversations des uns sont devenues l'apprentissage des autres.
-
----
-
-## Sources
-Voici la liste des sources utilisées pour la vérification, organisée par thème pour que tu puisses les citer ou les ajouter en fin d'article.
-
-### Reddit – Google et OpenAI
-
-- **CBS News** (23 février 2024) — Annonce de l'accord à 60 M$ entre Google et Reddit
-https://www.cbsnews.com/news/google-reddit-60-million-deal-ai-training/
-
-- **Lutzker & Lutzker** (18 mars 2024) — Analyse détaillée de l'accord et de l'usage de l'API Reddit
-https://www.lutzker.com/ip_bit_pieces/reddits-licensing-agreement-with-google/
-
-- **Columbia Journalism Review** — Analyse de la stratégie globale de Reddit (mention de l'accord OpenAI à ~70 M$/an)
-https://www.cjr.org/analysis/reddit-winning-ai-licensing-deals-openai-google-gemini-answers-rsl.php
-
-### Tumblr / Automattic – OpenAI et Midjourney
-
-- **404 Media** (27 février 2024) — Article source qui a révélé l'affaire
-https://www.404media.co/tumblr-and-wordpress-to-sell-users-data-to-train-ai-tools/
-
-- **Engadget** (27 février 2024) — Reprise détaillée avec la réponse officielle d'Automattic
-https://www.engadget.com/tumblr-and-wordpress-posts-will-reportedly-be-used-for-openai-and-midjourney-training-204425798.html
-
-- **WP Tavern** (28 février 2024) — Angle communauté WordPress et critique de la politique d'opt-out
-https://wptavern.com/automattic-faces-scrutiny-over-ai-access-policy
-
-- **Popular Science** (29 février 2024) — Mise en perspective sur l'inefficacité de l'opt-out
-https://www.popsci.com/technology/openai-wordpress-tumblr/
-
-### X (Twitter) – Conditions d'utilisation et entraînement de Grok
-
-- **Social Media Today** (17 octobre 2024) — Analyse des nouvelles conditions effectives le 15 novembre 2024
-https://www.socialmediatoday.com/news/x-formerly-twitter-updates-terms-service/730223/
-
-- **CNN Business** (21 octobre 2024) — Réaction des utilisateurs et flou sur l'opt-out
-https://www.cnn.com/2024/10/21/tech/x-twitter-terms-of-service
-
-- **Cybernews** (18 octobre 2024) — Sur la disparition de l'option d'opt-out
-https://cybernews.com/ai-news/updated-x-terms/
-
-- **Gigazine** — Déta#il des clauses ajoutées concernant les « partenaires tiers »
-https://gigazine.net/gsc_news/en/20241018-x-privacy-policy-ai-training/
-
-## LinkedIn – Intervention de l'ICO britannique
-
-- **TechCrunch** (20 septembre 2024) — LinkedIn suspend l'entraînement IA au Royaume-Uni
-https://techcrunch.com/2024/09/20/linkedin-has-stopped-grabbing-u-k-users-data-for-ai/
-
-- **The Record (Recorded Future News)** (20 septembre 2024) — Le rôle de l'ICO dans l'arrêt
-https://therecord.media/uk-regulator-stops-linkedin-ai-models
-
-- **The Hacker News** (22 septembre 2024) — Synthèse incluant la mention de Meta en parallèle
-https://thehackernews.com/2024/09/linkedin-halts-ai-data-processing-in-uk.html
-
-- **Legal IT Insider** (20 septembre 2024) — Citation complète de Stephen Almond (ICO)
-https://legaltechnology.com/2024/09/20/linkedin-suspends-opt-out-ai-model-training-for-uk-following-ico-concerns/
\ No newline at end of file
diff --git a/b0b3ac59-87c5-4598-a549-f3168abb4429/meta.json b/b0b3ac59-87c5-4598-a549-f3168abb4429/meta.json
deleted file mode 100644
index c4b1884..0000000
--- a/b0b3ac59-87c5-4598-a549-f3168abb4429/meta.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "uuid": "b0b3ac59-87c5-4598-a549-f3168abb4429",
- "slug": "quand-les-conversations-sont-devenues-une-matiere-premiere",
- "title": "Quand les conversations sont devenues une matière première",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-05 07:17",
- "created_at": "2025-11-05 07:17:02",
- "updated_at": "2026-05-12 01:49:27",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-12 01:49:27",
- "comment": "",
- "title": "Quand les conversations sont devenues une matière première"
- }
- ],
- "cover": "",
- "files_meta": [],
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "loisirs"
-}
diff --git a/b0b3ac59-87c5-4598-a549-f3168abb4429/revisions/0001.md b/b0b3ac59-87c5-4598-a549-f3168abb4429/revisions/0001.md
deleted file mode 100644
index d9cda11..0000000
--- a/b0b3ac59-87c5-4598-a549-f3168abb4429/revisions/0001.md
+++ /dev/null
@@ -1,77 +0,0 @@
-Entre 2023 et 2024, quelque chose s'est rompu sur le web social. Pas un effondrement, pas une crise visible — plutôt un basculement discret, presque administratif, dans la manière dont les grandes plateformes ont commencé à regarder ce que produisaient leurs utilisateurs. Les messages, les fils de discussion, les commentaires sarcastiques sous une photo de chat, les longues confidences nocturnes sur Tumblr : tout cela, jusque-là considéré comme l'humus naturel des réseaux sociaux, est soudainement devenu autre chose. Une ressource. Un actif. Une matière brute.
-
-Le déclencheur s'appelle **Reddit**. Le 22 février 2024, le jour même où l'entreprise dépose son dossier d'introduction en Bourse, elle annonce un accord à 60 millions de dollars par an avec Google : le géant de la recherche pourra puiser dans les archives du forum, via son API, pour entraîner ses modèles d'intelligence artificielle. Quelques mois plus tard, OpenAI signe à son tour un accord similaire, estimé autour de 70 millions de dollars annuels par les analystes. Le message envoyé au marché est limpide : ces décennies de conversations humaines, agrégées par une communauté qui croyait simplement bavarder, valent désormais des centaines de millions de dollars. Steve Huffman, PDG de Reddit, vante un modèle économique enfin durable. Les analystes financiers, eux, parlent de mine d'or.
-
-**Tumblr** rejoint la danse une semaine plus tard, mais par effraction. Le 27 février 2024, le site spécialisé 404 Media révèle qu'Automattic — la maison mère de Tumblr et WordPress.com — finalise des accords avec OpenAI et Midjourney pour leur fournir l'accès aux contenus publiés sur ses plateformes. La fuite est embarrassante : des documents internes montrent qu'une première extraction de données a même ratissé trop large, embarquant par erreur des posts privés, des blogs supprimés et des contenus normalement exclus. Automattic publie en urgence un communiqué annonçant un système d'opt-out — la possibilité pour les utilisateurs de refuser, à condition de cocher la bonne case dans les bons paramètres. Mais la communauté Tumblr, refuge historique d'artistes, d'écrivains amateurs, de communautés queer et de fanfic, n'a pas attendu la procédure officielle pour réagir : la nouvelle déclenche une vague de fermetures de comptes et d'effacements rétroactifs.
-
-**X**, sous la direction d'Elon Musk, emprunte un chemin parallèle mais plus solitaire. Plutôt que de vendre l'accès à ses données à des concurrents, Musk a verrouillé son robinet dès 2023 — au point d'introduire des plafonds de consultation tellement absurdes que la plateforme en est devenue inutilisable pendant quelques jours — et a réservé sa matière première à xAI, sa propre société d'intelligence artificielle, pour alimenter le chatbot Grok. En octobre 2024, X annonce une refonte de ses conditions d'utilisation, effective le 15 novembre. Le nouveau texte est explicite : tout contenu publié sur la plateforme peut être utilisé pour entraîner ses modèles d'apprentissage automatique, ainsi que ceux de « partenaires tiers » non nommés. L'option qui permettait jusque-là aux utilisateurs européens de refuser que leurs posts servent à entraîner Grok est, dans la foulée, devenue inaccessible pour beaucoup. Le principe reste le même que chez Reddit — les mots des utilisateurs deviennent du carburant — mais sans le détour d'un contrat externe.
-
-Car ce qui frappe, ce n'est pas tant chaque accord pris isolément que la rapidité avec laquelle l'idée s'est imposée. En quelques mois, exploiter les mots de ses utilisateurs pour entraîner de l'IA est devenu non plus une stratégie audacieuse, mais une évidence de marché. **LinkedIn**, propriété de Microsoft — qui se trouve aussi être le principal investisseur d'OpenAI —, suit le mouvement avec une discrétion remarquable. Le 18 septembre 2024, une mise à jour silencieuse de sa politique de confidentialité révèle que la plateforme entraîne déjà ses propres modèles d'IA générative à partir des posts, articles et données de profil de ses membres, partout dans le monde — y compris au Royaume-Uni. Personne n'a été prévenu en bonne et due forme ; le paramètre permettant de refuser ne se déclenche pas par défaut.
-
-L'épisode tourne court. En 48 heures, l'Information Commissioner's Office britannique, le régulateur des données, exige un arrêt immédiat de la pratique sur le territoire. Stephen Almond, son directeur exécutif chargé des risques réglementaires, déclare publiquement que la confiance du public dans l'IA générative dépend précisément du respect des droits à la vie privée dès le départ. LinkedIn suspend le traitement au Royaume-Uni, dans l'Espace économique européen et en Suisse. Pour le reste du monde — les États-Unis, l'Asie, le Canada, l'Amérique latine —, la collecte continue, opt-out par défaut.
-
-Mais quelque chose, du côté des utilisateurs, n'a pas suivi.
-
-Sur Reddit, des modérateurs ferment leurs subreddits en protestation. D'autres remplacent leurs anciens posts par des chaînes de caractères absurdes — du sabotage de données, en somme, pour rendre leurs contributions inutilisables. Sur Tumblr, on voit ressurgir un vieux geste internet : des comptes entiers passent en privé, des années d'écriture s'effacent en quelques clics. Des forums spécialisés évoquent une « grève des données ». Une phrase circule, amère, sur plusieurs plateformes à la fois : *« Nos mots valent de l'or, mais pas pour nous. »*
-
-C'est sans doute le paradoxe le plus profond de cette séquence. Pendant deux décennies, les grandes plateformes avaient bâti leur valeur sur un contrat tacite : vous nous donnez votre temps et votre attention, nous vous offrons un espace pour exister et nous monétisons votre regard auprès des annonceurs. Le deal était imparfait, mais lisible. À partir de 2024, un second contrat se superpose au premier sans avoir été négocié : votre langage, vos conversations, vos archives intimes deviennent aussi une matière première vendable, à votre insu le plus souvent, pour entraîner des intelligences qui à terme produiront le même langage que vous — mais en série, à coût marginal nul, et au bénéfice d'autres.
-
-Le web social était entré dans une nouvelle ère. Celle où les conversations des uns sont devenues l'apprentissage des autres.
-
----
-
-## Sources
-Voici la liste des sources utilisées pour la vérification, organisée par thème pour que tu puisses les citer ou les ajouter en fin d'article.
-
-### Reddit – Google et OpenAI
-
-- **CBS News** (23 février 2024) — Annonce de l'accord à 60 M$ entre Google et Reddit
-https://www.cbsnews.com/news/google-reddit-60-million-deal-ai-training/
-
-- **Lutzker & Lutzker** (18 mars 2024) — Analyse détaillée de l'accord et de l'usage de l'API Reddit
-https://www.lutzker.com/ip_bit_pieces/reddits-licensing-agreement-with-google/
-
-- **Columbia Journalism Review** — Analyse de la stratégie globale de Reddit (mention de l'accord OpenAI à ~70 M$/an)
-https://www.cjr.org/analysis/reddit-winning-ai-licensing-deals-openai-google-gemini-answers-rsl.php
-
-### Tumblr / Automattic – OpenAI et Midjourney
-
-- **404 Media** (27 février 2024) — Article source qui a révélé l'affaire
-https://www.404media.co/tumblr-and-wordpress-to-sell-users-data-to-train-ai-tools/
-
-- **Engadget** (27 février 2024) — Reprise détaillée avec la réponse officielle d'Automattic
-https://www.engadget.com/tumblr-and-wordpress-posts-will-reportedly-be-used-for-openai-and-midjourney-training-204425798.html
-
-- **WP Tavern** (28 février 2024) — Angle communauté WordPress et critique de la politique d'opt-out
-https://wptavern.com/automattic-faces-scrutiny-over-ai-access-policy
-
-- **Popular Science** (29 février 2024) — Mise en perspective sur l'inefficacité de l'opt-out
-https://www.popsci.com/technology/openai-wordpress-tumblr/
-
-### X (Twitter) – Conditions d'utilisation et entraînement de Grok
-
-- **Social Media Today** (17 octobre 2024) — Analyse des nouvelles conditions effectives le 15 novembre 2024
-https://www.socialmediatoday.com/news/x-formerly-twitter-updates-terms-service/730223/
-
-- **CNN Business** (21 octobre 2024) — Réaction des utilisateurs et flou sur l'opt-out
-https://www.cnn.com/2024/10/21/tech/x-twitter-terms-of-service
-
-- **Cybernews** (18 octobre 2024) — Sur la disparition de l'option d'opt-out
-https://cybernews.com/ai-news/updated-x-terms/
-
-- **Gigazine** — Déta#il des clauses ajoutées concernant les « partenaires tiers »
-https://gigazine.net/gsc_news/en/20241018-x-privacy-policy-ai-training/
-
-## LinkedIn – Intervention de l'ICO britannique
-
-- **TechCrunch** (20 septembre 2024) — LinkedIn suspend l'entraînement IA au Royaume-Uni
-https://techcrunch.com/2024/09/20/linkedin-has-stopped-grabbing-u-k-users-data-for-ai/
-
-- **The Record (Recorded Future News)** (20 septembre 2024) — Le rôle de l'ICO dans l'arrêt
-https://therecord.media/uk-regulator-stops-linkedin-ai-models
-
-- **The Hacker News** (22 septembre 2024) — Synthèse incluant la mention de Meta en parallèle
-https://thehackernews.com/2024/09/linkedin-halts-ai-data-processing-in-uk.html
-
-- **Legal IT Insider** (20 septembre 2024) — Citation complète de Stephen Almond (ICO)
-https://legaltechnology.com/2024/09/20/linkedin-suspends-opt-out-ai-model-training-for-uk-following-ico-concerns/
\ No newline at end of file
diff --git a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/files/cover.svg b/bea327e2-9d1c-4ff6-a5a5-26748c80018b/files/cover.svg
deleted file mode 100644
index 4c7db0f..0000000
--- a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/files/cover.svg
+++ /dev/null
@@ -1,98 +0,0 @@
-
\ No newline at end of file
diff --git a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/index.md b/bea327e2-9d1c-4ff6-a5a5-26748c80018b/index.md
deleted file mode 100644
index 060c4b4..0000000
--- a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/index.md
+++ /dev/null
@@ -1,252 +0,0 @@
-# > Comment un simple script Bash peut télécharger, mettre à jour et synchroniser une bibliothèque de scripts distants — et pourquoi il faut le lire avec un œil critique.
-
-[fetch_scripts.sh](https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/commit/18c6dd9e45e57d272659da6e2c53b79048985400/scripts/fetch_scripts.sh)
-
-> 📝 **Note** — Cet article est une autocritique. Le script `fetch_scripts.sh` analysé ici est de ma propre fabrication, déployé sur mes propres machines. L'exercice consiste à le relire avec la distance d'un reviewer extérieur, pour identifier ce qui tient la route et ce qui mériterait d'être repris.
-
-## Le contexte
-
-L'idée derrière ce script est élégante : centraliser une collection de scripts utilitaires dans un dépôt Git public (ici, une instance Forgejo auto-hébergée), puis fournir un **unique point d'entrée** que l'on télécharge sur n'importe quelle machine. Ce point d'entrée se met à jour tout seul, propose à l'opérateur de choisir quels sous-ensembles de scripts récupérer, et maintient une synchronisation locale du dépôt distant.
-
-C'est typiquement le genre d'outil qui se déploie en une ligne :
-
-```bash
-wget https://git.example.fr/.../fetch_scripts.sh && bash fetch_scripts.sh
-```
-
-Décortiquons ce qu'il fait, étape par étape, puis voyons où il faudrait taper.
-
----
-
-## Étape 1 — L'auto-mise à jour
-
-```bash
-SCRIPT_URL="https://git.abonnel.fr/.../fetch_scripts.sh"
-SCRIPT_NAME=$(basename "$0")
-TMP_SCRIPT="/tmp/$SCRIPT_NAME"
-
-wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
-
-if ! cmp -s "$TMP_SCRIPT" "$0"; then
- echo "🔄 Mise à jour du script..."
- mv "$TMP_SCRIPT" "$0"
- chmod +x "$0"
- exec "$0" "$@"
-fi
-```
-
-**Ce qui se passe :** le script télécharge sa propre version distante dans `/tmp`, la compare octet-à-octet avec lui-même (`cmp -s`), et si elle diffère, il s'écrase, se rend exécutable, et **se relance** via `exec` (qui remplace le processus courant — pas d'empilement de shells).
-
-**Pourquoi c'est malin :** ça garantit qu'à chaque exécution, l'opérateur travaille avec la version canonique du dépôt. Pas besoin de mécanisme de versioning, pas de vérification de hash, pas de paquet à publier.
-
-**Pourquoi c'est risqué :** on y reviendra dans la critique, mais en résumé — l'auto-mise à jour silencieuse depuis une URL en HTTPS sans signature est une porte d'entrée pour la chaîne d'approvisionnement.
-
----
-
-## Étape 2 — Récupération du catalogue de dossiers
-
-```bash
-REPO_URL="https://git.abonnel.fr/.../scripts"
-DIR_LIST_FILE=".directories.txt"
-MANDATORY_DIR="common"
-
-TMP_DIR=$(mktemp -d)
-wget -q -O "$TMP_DIR/$DIR_LIST_FILE" "$REPO_URL/$DIR_LIST_FILE"
-mapfile -t AVAILABLE_DIRS < "$TMP_DIR/$DIR_LIST_FILE"
-```
-
-Le dépôt distant contient un fichier `.directories.txt` qui liste les catégories de scripts disponibles (par exemple : `common`, `proxmox`, `php`, `monitoring`…). Ce fichier est la **source de vérité** : ajouter une catégorie côté serveur la rend immédiatement disponible côté client.
-
-`mapfile` (alias `readarray`) lit le fichier ligne à ligne dans un tableau Bash. Plus propre qu'une boucle `while read`.
-
-Un dossier `common` est marqué comme obligatoire — il sera toujours téléchargé, sans demander à l'utilisateur.
-
----
-
-## Étape 3 — Mémoire de la sélection précédente
-
-```bash
-SELECTED_DIRS_FILE=".selected_dirs.txt"
-
-if [ -f "$SELECTED_DIRS_FILE" ]; then
- mapfile -t PREVIOUS_SELECTION < "$SELECTED_DIRS_FILE"
-else
- PREVIOUS_SELECTION=()
-fi
-```
-
-À chaque exécution, le script relit la sélection de la fois précédente. C'est ce qui permet à l'interface graphique (étape suivante) de **pré-cocher** les bons dossiers : on n'a pas à refaire son choix à chaque mise à jour.
-
----
-
-## Étape 4 — L'interface `whiptail`
-
-```bash
-CHOICES=()
-for dir in "${AVAILABLE_DIRS[@]}"; do
- if [ "$dir" == "$MANDATORY_DIR" ]; then
- continue
- fi
- if [[ " ${PREVIOUS_SELECTION[*]} " =~ " $dir " ]]; then
- CHOICES+=("$dir" "" ON)
- else
- CHOICES+=("$dir" "" OFF)
- fi
-done
-
-SELECTED_DIRS=$(whiptail --title "Sélection des dossiers" --checklist \
- "Sélectionnez les dossiers à télécharger :" 20 60 10 \
- "${CHOICES[@]}" 3>&1 1>&2 2>&3)
-```
-
-`whiptail` est l'outil de dialogue ncurses standard sur Debian/Ubuntu — il affiche cette boîte bleue familière avec des cases à cocher, navigable au clavier. Idéal en SSH.
-
-La gymnastique `3>&1 1>&2 2>&3` est un classique : `whiptail` écrit son interface sur stdout et sa réponse sur stderr. Il faut donc **échanger les deux** pour capturer la sélection dans `$SELECTED_DIRS` tout en laissant l'interface s'afficher.
-
-L'expression `[[ " ${ARRAY[*]} " =~ " $dir " ]]` est une astuce courante pour tester l'appartenance à un tableau Bash — on entoure d'espaces pour éviter les correspondances partielles (`web` qui matcherait `web-server`).
-
----
-
-## Étape 5 — Synchronisation : ajouts et suppressions
-
-```bash
-SELECTED_DIRS_ARRAY=("$MANDATORY_DIR" $(echo "$SELECTED_DIRS" | tr -d '"'))
-echo "${SELECTED_DIRS_ARRAY[@]}" > "$SELECTED_DIRS_FILE"
-
-for dir in "${PREVIOUS_SELECTION[@]}"; do
- if [[ ! " ${SELECTED_DIRS_ARRAY[*]} " =~ " $dir " ]]; then
- echo "🗑 Suppression du dossier $dir..."
- rm -rf "$dir"
- fi
-done
-```
-
-Logique de diff : tout ce qui était sélectionné avant et ne l'est plus est **supprimé du disque**. Ça maintient le répertoire local propre — pas de scripts orphelins qui traînent.
-
-`whiptail` renvoie la sélection sous forme de chaîne entre guillemets (`"dir1" "dir2"`), d'où le `tr -d '"'` pour les retirer avant de constituer le tableau.
-
----
-
-## Étape 6 — Téléchargement des fichiers de chaque dossier
-
-```bash
-for TARGET_DIR in "${SELECTED_DIRS_ARRAY[@]}"; do
- wget -q -O "$LIST_PATH" "$REPO_URL/$TARGET_DIR/.list_files.txt"
- mkdir -p "$TARGET_DIR"
-
- while read -r file; do
- wget -q -O "$TARGET_DIR/$(basename "$file")" "$REPO_URL/$TARGET_DIR/$file"
- done < "$LIST_PATH"
-
- for existing_file in "$TARGET_DIR"/*; do
- if [ -f "$existing_file" ] && ! grep -qx "$(basename "$existing_file")" "$LIST_PATH"; then
- rm "$existing_file"
- fi
- done
-
- chmod +x "$TARGET_DIR"/*.sh
-done
-```
-
-Même logique récursive d'un niveau plus bas : chaque dossier contient son propre `.list_files.txt` listant ses fichiers. On télécharge ceux qui y figurent, on supprime ceux qui n'y figurent plus, et on rend tout exécutable.
-
-C'est une forme de `rsync` artisanal, basé sur des manifestes plats. Ça fonctionne sans avoir à installer `git` sur la machine cible — seuls `wget` et `whiptail` sont requis.
-
----
-
-## Critique : ce qui marche, ce qui inquiète
-
-### Les bons côtés
-
-**La logique d'idempotence** est solide. Le script peut tourner cent fois de suite, il convergera toujours vers le même état : les dossiers sélectionnés contiendront exactement les fichiers du manifeste, ni plus, ni moins. C'est le bon réflexe DevOps.
-
-**L'auto-bootstrap** est ergonomique. Une seule URL à retenir, tout le reste se télécharge tout seul. Pour une bibliothèque personnelle de scripts d'admin, c'est imbattable en simplicité.
-
-**Pas de dépendances exotiques.** `wget`, `whiptail`, `mapfile` : tout est disponible nativement sur Debian. Le script tourne aussi bien sur un conteneur LXC fraîchement provisionné que sur une machine établie.
-
-**Le manifeste séparé** (`.directories.txt` et `.list_files.txt`) découple la liste des fichiers de leur contenu. C'est plus simple qu'un parsing HTML de l'index Git, et ça reste sous contrôle éditorial.
-
-### Les angles morts
-
-#### 1. Aucune vérification d'intégrité
-
-C'est **le** point critique. Le script télécharge du code exécutable en HTTPS, sans vérifier :
-- ni signature GPG,
-- ni hash SHA256,
-- ni même que le serveur a bien répondu correctement.
-
-`wget -q` en mode silencieux **n'échoue pas visiblement** : si la requête renvoie une page d'erreur 404 ou une page de connexion captive Wi-Fi en HTML, elle sera écrite dans le fichier de destination. La vérification suivante (`cmp -s`) considérera ce HTML comme « différent », fera le `mv`, et au prochain `exec` le shell essaiera d'exécuter du HTML. Au mieux ça crashe, au pire ça exécute des balises interprétables.
-
-**Pire encore pour l'auto-update :** si quelqu'un compromet l'instance Forgejo (ou interpose un proxy malveillant capable de servir un certificat valide pour `git.abonnel.fr`), le prochain `fetch_scripts.sh` télécharge et exécute du code arbitraire avec les privilèges de l'utilisateur courant — souvent root pour ce genre d'outils d'admin.
-
-**Correctif minimal :** publier un fichier `.sha256sums` signé GPG dans le dépôt, le télécharger, vérifier sa signature avec une clé connue localement, puis valider chaque fichier téléchargé contre ce manifeste.
-
-#### 2. `wget` sans gestion d'erreur
-
-```bash
-wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
-if ! cmp -s "$TMP_SCRIPT" "$0"; then
-```
-
-Si `wget` échoue (réseau coupé, DNS HS, certificat expiré), `$TMP_SCRIPT` sera soit vide soit absent. `cmp -s` retournera « différent », et le script **écrasera la version locale par un fichier vide**. À la prochaine exécution, plus rien ne fonctionne.
-
-**Correctif :** vérifier le code de retour de `wget`, vérifier que le fichier téléchargé n'est pas vide, et vérifier qu'il commence bien par `#!/bin/bash` avant d'écraser quoi que ce soit.
-
-```bash
-if ! wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"; then
- echo "❌ Téléchargement échoué, on garde la version actuelle"
-elif [ ! -s "$TMP_SCRIPT" ] || ! head -n1 "$TMP_SCRIPT" | grep -q "^#!"; then
- echo "❌ Fichier téléchargé invalide"
- rm -f "$TMP_SCRIPT"
-elif ! cmp -s "$TMP_SCRIPT" "$0"; then
- # ...
-fi
-```
-
-#### 3. Le `exec "$0" "$@"` perd les modifications de l'environnement
-
-Si le script a été lancé par `bash fetch_scripts.sh` (donc sans le bit exécutable, sans shebang utilisé), `$0` vaut `fetch_scripts.sh`. Après `mv`, on `exec` un fichier qui pourrait ne pas être dans le `$PATH`. En pratique ça marche parce qu'on est dans le bon répertoire, mais c'est fragile — un `cd` quelque part dans le script suffirait à le casser.
-
-#### 4. Injection via les noms de fichiers du manifeste
-
-```bash
-while read -r file; do
- wget -q -O "$TARGET_DIR/$(basename "$file")" "$REPO_URL/$TARGET_DIR/$file"
-done < "$LIST_PATH"
-```
-
-Le contenu de `.list_files.txt` est utilisé directement dans une URL et dans un chemin de fichier local. Si quelqu'un peut écrire dans ce fichier manifeste (ce qui revient à pouvoir pousser sur le dépôt Forgejo), il peut y mettre des chemins comme `../../../etc/cron.d/backdoor` et écrire en dehors du répertoire prévu.
-
-`basename` neutralise partiellement la chose côté nom local, mais l'URL côté distant accepte n'importe quoi. C'est moins critique que la première faille, mais ça mérite un filtre regex (`[a-zA-Z0-9._-]+` uniquement).
-
-#### 5. `whiptail` et la sélection vide
-
-Si l'utilisateur ne coche rien et valide, `$SELECTED_DIRS` est vide. Le script continue avec seulement `common`, ce qui est probablement le comportement attendu. Mais si `whiptail` n'est pas installé (rare mais possible, par exemple sur Alpine ou un Debian minimal sans `whiptail`), le script échoue avec une erreur peu explicite. Un test préalable `command -v whiptail` éviterait la déconvenue.
-
-#### 6. Pas de log, pas de mode dry-run
-
-Pour un outil qui supprime des fichiers (`rm -rf "$dir"`), l'absence d'option `--dry-run` qui afficherait ce qui *serait* fait sans rien toucher est gênante. Une frappe distraite sur la checklist, et un dossier entier disparaît sans warning.
-
-#### 7. Le verrou manquant
-
-Rien n'empêche deux instances de `fetch_scripts.sh` de tourner en parallèle (par exemple via `cron` et un opérateur en interactif). Un `flock` sur un fichier de lock éviterait des courses sur les opérations de download/delete.
-
----
-
-## Verdict
-
-C'est un script **utile, lisible, et bien construit pour un usage personnel** sur des machines de confiance. La logique de synchronisation est saine, l'ergonomie `whiptail` est appréciable, l'auto-bootstrap est élégant.
-
-Mais dès qu'on franchit la frontière du « j'utilise ça sur mes propres machines avec mon propre dépôt », les manques se font sentir : **pas de vérification d'intégrité, pas de gestion d'erreur réseau, pas d'option de récupération**. Dans un contexte d'équipe ou de production, ces points sont bloquants.
-
-### Pistes d'évolution prioritaires
-
-1. **Signature ou checksum** : publier un `MANIFEST.sha256` signé GPG, le vérifier avant tout `mv` ou exécution.
-2. **`set -euo pipefail`** en tête de script pour faire échouer proprement à la première erreur.
-3. **Vérifier `wget`** : code de retour, fichier non vide, shebang présent.
-4. **Backup avant écrasement** : conserver la version précédente (`fetch_scripts.sh.bak`) pour pouvoir revenir en arrière.
-5. **Option `--dry-run`** pour visualiser sans appliquer.
-6. **Filtre regex** sur les noms de fichiers du manifeste pour éviter les traversées de chemin.
-7. **Lock file** via `flock` pour éviter les exécutions concurrentes.
-
-Avec ces ajouts, on passe d'un script « pratique » à un outil de déploiement digne de ce nom — sans rien perdre de sa simplicité initiale.
\ No newline at end of file
diff --git a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/meta.json b/bea327e2-9d1c-4ff6-a5a5-26748c80018b/meta.json
deleted file mode 100644
index a6ccaa7..0000000
--- a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/meta.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "uuid": "bea327e2-9d1c-4ff6-a5a5-26748c80018b",
- "slug": "anatomie-d-un-script-d-auto-deploiement-bash-fetch-scripts-sh",
- "title": "Script Bash d'auto-déploiement : `fetch_scripts.sh`",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2026-05-04 07:04",
- "created_at": "2026-05-12 10:55:39",
- "updated_at": "2026-05-12 11:10:51",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-12 11:08:57",
- "comment": "Catégorie modifiée, contenu modifié, article publié, couverture modifiée",
- "title": "Script Bash d'auto-déploiement : `fetch_scripts.sh`"
- },
- {
- "n": 2,
- "date": "2026-05-12 11:10:51",
- "comment": "Contenu modifié : mention autocritique",
- "title": "Script Bash d'auto-déploiement : `fetch_scripts.sh`"
- }
- ],
- "cover": "cover.svg",
- "files_meta": {
- "d6ea4554c9fbfc14-23663.svg": {
- "author": "",
- "source_url": ""
- },
- "cover.svg": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [
- {
- "url": "https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/commit/18c6dd9e45e57d272659da6e2c53b79048985400/scripts/fetch_scripts.sh",
- "name": "Script bash fetch_scripts.sh dans sa version 18c6dd9e45e57d272659da6e2c53b79048985400",
- "added_at": "2026-05-12 11:07:42",
- "meta": {
- "mime": "text/plain",
- "size": 4334
- }
- }
- ],
- "seo_title": "",
- "seo_description": "Auto analyse pédagogique et critique du script Bash d'auto-mise à jour qui synchronise des scripts depuis un dépôt Forgejo. Sept failles identifiées, sept correctifs à effectuer.",
- "og_image": "https://varlog.a5l.fr/file?uuid=bea327e2-9d1c-4ff6-a5a5-26748c80018b&name=cover.svg",
- "category": "informatique"
-}
diff --git a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/revisions/0001.md b/bea327e2-9d1c-4ff6-a5a5-26748c80018b/revisions/0001.md
deleted file mode 100644
index e0b61fe..0000000
--- a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/revisions/0001.md
+++ /dev/null
@@ -1,250 +0,0 @@
-# > Comment un simple script Bash peut télécharger, mettre à jour et synchroniser une bibliothèque de scripts distants — et pourquoi il faut le lire avec un œil critique.
-
-[fetch_scripts.sh](https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/commit/18c6dd9e45e57d272659da6e2c53b79048985400/scripts/fetch_scripts.sh)
-
-## Le contexte
-
-L'idée derrière ce script est élégante : centraliser une collection de scripts utilitaires dans un dépôt Git public (ici, une instance Forgejo auto-hébergée), puis fournir un **unique point d'entrée** que l'on télécharge sur n'importe quelle machine. Ce point d'entrée se met à jour tout seul, propose à l'opérateur de choisir quels sous-ensembles de scripts récupérer, et maintient une synchronisation locale du dépôt distant.
-
-C'est typiquement le genre d'outil qui se déploie en une ligne :
-
-```bash
-wget https://git.example.fr/.../fetch_scripts.sh && bash fetch_scripts.sh
-```
-
-Décortiquons ce qu'il fait, étape par étape, puis voyons où il faudrait taper.
-
----
-
-## Étape 1 — L'auto-mise à jour
-
-```bash
-SCRIPT_URL="https://git.abonnel.fr/.../fetch_scripts.sh"
-SCRIPT_NAME=$(basename "$0")
-TMP_SCRIPT="/tmp/$SCRIPT_NAME"
-
-wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
-
-if ! cmp -s "$TMP_SCRIPT" "$0"; then
- echo "🔄 Mise à jour du script..."
- mv "$TMP_SCRIPT" "$0"
- chmod +x "$0"
- exec "$0" "$@"
-fi
-```
-
-**Ce qui se passe :** le script télécharge sa propre version distante dans `/tmp`, la compare octet-à-octet avec lui-même (`cmp -s`), et si elle diffère, il s'écrase, se rend exécutable, et **se relance** via `exec` (qui remplace le processus courant — pas d'empilement de shells).
-
-**Pourquoi c'est malin :** ça garantit qu'à chaque exécution, l'opérateur travaille avec la version canonique du dépôt. Pas besoin de mécanisme de versioning, pas de vérification de hash, pas de paquet à publier.
-
-**Pourquoi c'est risqué :** on y reviendra dans la critique, mais en résumé — l'auto-mise à jour silencieuse depuis une URL en HTTPS sans signature est une porte d'entrée pour la chaîne d'approvisionnement.
-
----
-
-## Étape 2 — Récupération du catalogue de dossiers
-
-```bash
-REPO_URL="https://git.abonnel.fr/.../scripts"
-DIR_LIST_FILE=".directories.txt"
-MANDATORY_DIR="common"
-
-TMP_DIR=$(mktemp -d)
-wget -q -O "$TMP_DIR/$DIR_LIST_FILE" "$REPO_URL/$DIR_LIST_FILE"
-mapfile -t AVAILABLE_DIRS < "$TMP_DIR/$DIR_LIST_FILE"
-```
-
-Le dépôt distant contient un fichier `.directories.txt` qui liste les catégories de scripts disponibles (par exemple : `common`, `proxmox`, `php`, `monitoring`…). Ce fichier est la **source de vérité** : ajouter une catégorie côté serveur la rend immédiatement disponible côté client.
-
-`mapfile` (alias `readarray`) lit le fichier ligne à ligne dans un tableau Bash. Plus propre qu'une boucle `while read`.
-
-Un dossier `common` est marqué comme obligatoire — il sera toujours téléchargé, sans demander à l'utilisateur.
-
----
-
-## Étape 3 — Mémoire de la sélection précédente
-
-```bash
-SELECTED_DIRS_FILE=".selected_dirs.txt"
-
-if [ -f "$SELECTED_DIRS_FILE" ]; then
- mapfile -t PREVIOUS_SELECTION < "$SELECTED_DIRS_FILE"
-else
- PREVIOUS_SELECTION=()
-fi
-```
-
-À chaque exécution, le script relit la sélection de la fois précédente. C'est ce qui permet à l'interface graphique (étape suivante) de **pré-cocher** les bons dossiers : on n'a pas à refaire son choix à chaque mise à jour.
-
----
-
-## Étape 4 — L'interface `whiptail`
-
-```bash
-CHOICES=()
-for dir in "${AVAILABLE_DIRS[@]}"; do
- if [ "$dir" == "$MANDATORY_DIR" ]; then
- continue
- fi
- if [[ " ${PREVIOUS_SELECTION[*]} " =~ " $dir " ]]; then
- CHOICES+=("$dir" "" ON)
- else
- CHOICES+=("$dir" "" OFF)
- fi
-done
-
-SELECTED_DIRS=$(whiptail --title "Sélection des dossiers" --checklist \
- "Sélectionnez les dossiers à télécharger :" 20 60 10 \
- "${CHOICES[@]}" 3>&1 1>&2 2>&3)
-```
-
-`whiptail` est l'outil de dialogue ncurses standard sur Debian/Ubuntu — il affiche cette boîte bleue familière avec des cases à cocher, navigable au clavier. Idéal en SSH.
-
-La gymnastique `3>&1 1>&2 2>&3` est un classique : `whiptail` écrit son interface sur stdout et sa réponse sur stderr. Il faut donc **échanger les deux** pour capturer la sélection dans `$SELECTED_DIRS` tout en laissant l'interface s'afficher.
-
-L'expression `[[ " ${ARRAY[*]} " =~ " $dir " ]]` est une astuce courante pour tester l'appartenance à un tableau Bash — on entoure d'espaces pour éviter les correspondances partielles (`web` qui matcherait `web-server`).
-
----
-
-## Étape 5 — Synchronisation : ajouts et suppressions
-
-```bash
-SELECTED_DIRS_ARRAY=("$MANDATORY_DIR" $(echo "$SELECTED_DIRS" | tr -d '"'))
-echo "${SELECTED_DIRS_ARRAY[@]}" > "$SELECTED_DIRS_FILE"
-
-for dir in "${PREVIOUS_SELECTION[@]}"; do
- if [[ ! " ${SELECTED_DIRS_ARRAY[*]} " =~ " $dir " ]]; then
- echo "🗑 Suppression du dossier $dir..."
- rm -rf "$dir"
- fi
-done
-```
-
-Logique de diff : tout ce qui était sélectionné avant et ne l'est plus est **supprimé du disque**. Ça maintient le répertoire local propre — pas de scripts orphelins qui traînent.
-
-`whiptail` renvoie la sélection sous forme de chaîne entre guillemets (`"dir1" "dir2"`), d'où le `tr -d '"'` pour les retirer avant de constituer le tableau.
-
----
-
-## Étape 6 — Téléchargement des fichiers de chaque dossier
-
-```bash
-for TARGET_DIR in "${SELECTED_DIRS_ARRAY[@]}"; do
- wget -q -O "$LIST_PATH" "$REPO_URL/$TARGET_DIR/.list_files.txt"
- mkdir -p "$TARGET_DIR"
-
- while read -r file; do
- wget -q -O "$TARGET_DIR/$(basename "$file")" "$REPO_URL/$TARGET_DIR/$file"
- done < "$LIST_PATH"
-
- for existing_file in "$TARGET_DIR"/*; do
- if [ -f "$existing_file" ] && ! grep -qx "$(basename "$existing_file")" "$LIST_PATH"; then
- rm "$existing_file"
- fi
- done
-
- chmod +x "$TARGET_DIR"/*.sh
-done
-```
-
-Même logique récursive d'un niveau plus bas : chaque dossier contient son propre `.list_files.txt` listant ses fichiers. On télécharge ceux qui y figurent, on supprime ceux qui n'y figurent plus, et on rend tout exécutable.
-
-C'est une forme de `rsync` artisanal, basé sur des manifestes plats. Ça fonctionne sans avoir à installer `git` sur la machine cible — seuls `wget` et `whiptail` sont requis.
-
----
-
-## Critique : ce qui marche, ce qui inquiète
-
-### Les bons côtés
-
-**La logique d'idempotence** est solide. Le script peut tourner cent fois de suite, il convergera toujours vers le même état : les dossiers sélectionnés contiendront exactement les fichiers du manifeste, ni plus, ni moins. C'est le bon réflexe DevOps.
-
-**L'auto-bootstrap** est ergonomique. Une seule URL à retenir, tout le reste se télécharge tout seul. Pour une bibliothèque personnelle de scripts d'admin, c'est imbattable en simplicité.
-
-**Pas de dépendances exotiques.** `wget`, `whiptail`, `mapfile` : tout est disponible nativement sur Debian. Le script tourne aussi bien sur un conteneur LXC fraîchement provisionné que sur une machine établie.
-
-**Le manifeste séparé** (`.directories.txt` et `.list_files.txt`) découple la liste des fichiers de leur contenu. C'est plus simple qu'un parsing HTML de l'index Git, et ça reste sous contrôle éditorial.
-
-### Les angles morts
-
-#### 1. Aucune vérification d'intégrité
-
-C'est **le** point critique. Le script télécharge du code exécutable en HTTPS, sans vérifier :
-- ni signature GPG,
-- ni hash SHA256,
-- ni même que le serveur a bien répondu correctement.
-
-`wget -q` en mode silencieux **n'échoue pas visiblement** : si la requête renvoie une page d'erreur 404 ou une page de connexion captive Wi-Fi en HTML, elle sera écrite dans le fichier de destination. La vérification suivante (`cmp -s`) considérera ce HTML comme « différent », fera le `mv`, et au prochain `exec` le shell essaiera d'exécuter du HTML. Au mieux ça crashe, au pire ça exécute des balises interprétables.
-
-**Pire encore pour l'auto-update :** si quelqu'un compromet l'instance Forgejo (ou interpose un proxy malveillant capable de servir un certificat valide pour `git.abonnel.fr`), le prochain `fetch_scripts.sh` télécharge et exécute du code arbitraire avec les privilèges de l'utilisateur courant — souvent root pour ce genre d'outils d'admin.
-
-**Correctif minimal :** publier un fichier `.sha256sums` signé GPG dans le dépôt, le télécharger, vérifier sa signature avec une clé connue localement, puis valider chaque fichier téléchargé contre ce manifeste.
-
-#### 2. `wget` sans gestion d'erreur
-
-```bash
-wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
-if ! cmp -s "$TMP_SCRIPT" "$0"; then
-```
-
-Si `wget` échoue (réseau coupé, DNS HS, certificat expiré), `$TMP_SCRIPT` sera soit vide soit absent. `cmp -s` retournera « différent », et le script **écrasera la version locale par un fichier vide**. À la prochaine exécution, plus rien ne fonctionne.
-
-**Correctif :** vérifier le code de retour de `wget`, vérifier que le fichier téléchargé n'est pas vide, et vérifier qu'il commence bien par `#!/bin/bash` avant d'écraser quoi que ce soit.
-
-```bash
-if ! wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"; then
- echo "❌ Téléchargement échoué, on garde la version actuelle"
-elif [ ! -s "$TMP_SCRIPT" ] || ! head -n1 "$TMP_SCRIPT" | grep -q "^#!"; then
- echo "❌ Fichier téléchargé invalide"
- rm -f "$TMP_SCRIPT"
-elif ! cmp -s "$TMP_SCRIPT" "$0"; then
- # ...
-fi
-```
-
-#### 3. Le `exec "$0" "$@"` perd les modifications de l'environnement
-
-Si le script a été lancé par `bash fetch_scripts.sh` (donc sans le bit exécutable, sans shebang utilisé), `$0` vaut `fetch_scripts.sh`. Après `mv`, on `exec` un fichier qui pourrait ne pas être dans le `$PATH`. En pratique ça marche parce qu'on est dans le bon répertoire, mais c'est fragile — un `cd` quelque part dans le script suffirait à le casser.
-
-#### 4. Injection via les noms de fichiers du manifeste
-
-```bash
-while read -r file; do
- wget -q -O "$TARGET_DIR/$(basename "$file")" "$REPO_URL/$TARGET_DIR/$file"
-done < "$LIST_PATH"
-```
-
-Le contenu de `.list_files.txt` est utilisé directement dans une URL et dans un chemin de fichier local. Si quelqu'un peut écrire dans ce fichier manifeste (ce qui revient à pouvoir pousser sur le dépôt Forgejo), il peut y mettre des chemins comme `../../../etc/cron.d/backdoor` et écrire en dehors du répertoire prévu.
-
-`basename` neutralise partiellement la chose côté nom local, mais l'URL côté distant accepte n'importe quoi. C'est moins critique que la première faille, mais ça mérite un filtre regex (`[a-zA-Z0-9._-]+` uniquement).
-
-#### 5. `whiptail` et la sélection vide
-
-Si l'utilisateur ne coche rien et valide, `$SELECTED_DIRS` est vide. Le script continue avec seulement `common`, ce qui est probablement le comportement attendu. Mais si `whiptail` n'est pas installé (rare mais possible, par exemple sur Alpine ou un Debian minimal sans `whiptail`), le script échoue avec une erreur peu explicite. Un test préalable `command -v whiptail` éviterait la déconvenue.
-
-#### 6. Pas de log, pas de mode dry-run
-
-Pour un outil qui supprime des fichiers (`rm -rf "$dir"`), l'absence d'option `--dry-run` qui afficherait ce qui *serait* fait sans rien toucher est gênante. Une frappe distraite sur la checklist, et un dossier entier disparaît sans warning.
-
-#### 7. Le verrou manquant
-
-Rien n'empêche deux instances de `fetch_scripts.sh` de tourner en parallèle (par exemple via `cron` et un opérateur en interactif). Un `flock` sur un fichier de lock éviterait des courses sur les opérations de download/delete.
-
----
-
-## Verdict
-
-C'est un script **utile, lisible, et bien construit pour un usage personnel** sur des machines de confiance. La logique de synchronisation est saine, l'ergonomie `whiptail` est appréciable, l'auto-bootstrap est élégant.
-
-Mais dès qu'on franchit la frontière du « j'utilise ça sur mes propres machines avec mon propre dépôt », les manques se font sentir : **pas de vérification d'intégrité, pas de gestion d'erreur réseau, pas d'option de récupération**. Dans un contexte d'équipe ou de production, ces points sont bloquants.
-
-### Pistes d'évolution prioritaires
-
-1. **Signature ou checksum** : publier un `MANIFEST.sha256` signé GPG, le vérifier avant tout `mv` ou exécution.
-2. **`set -euo pipefail`** en tête de script pour faire échouer proprement à la première erreur.
-3. **Vérifier `wget`** : code de retour, fichier non vide, shebang présent.
-4. **Backup avant écrasement** : conserver la version précédente (`fetch_scripts.sh.bak`) pour pouvoir revenir en arrière.
-5. **Option `--dry-run`** pour visualiser sans appliquer.
-6. **Filtre regex** sur les noms de fichiers du manifeste pour éviter les traversées de chemin.
-7. **Lock file** via `flock` pour éviter les exécutions concurrentes.
-
-Avec ces ajouts, on passe d'un script « pratique » à un outil de déploiement digne de ce nom — sans rien perdre de sa simplicité initiale.
\ No newline at end of file
diff --git a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/revisions/0002.md b/bea327e2-9d1c-4ff6-a5a5-26748c80018b/revisions/0002.md
deleted file mode 100644
index 9f76320..0000000
--- a/bea327e2-9d1c-4ff6-a5a5-26748c80018b/revisions/0002.md
+++ /dev/null
@@ -1,260 +0,0 @@
-# > Comment un simple script Bash peut télécharger, mettre à jour et synchroniser une bibliothèque de scripts distants — et pourquoi il faut le lire avec un œil critique.
-
-[fetch_scripts.sh](https://git.abonnel.fr/cedricAbonnel/notes-techniques/raw/commit/18c6dd9e45e57d272659da6e2c53b79048985400/scripts/fetch_scripts.sh)
-
-Il s'agit d'ajouter une mention indiquant que cet article est une autocritique — le script analysé étant l'œuvre de l'auteur lui-même.
-
-Quelques options selon l'effet recherché :
-
-**En sous-titre, sous le titre principal :**
-> *Autocritique d'un script maison : ce que j'ai bien fait, et où j'aurais dû taper plus fort.*
-
-**En encart d'introduction, juste avant « Le contexte » :**
-> 📝 **Note** — Cet article est une autocritique. Le script `fetch_scripts.sh` analysé ici est de ma propre fabrication, déployé sur mes propres machines. L'exercice consiste à le relire avec la distance d'un reviewer extérieur, pour identifier ce qui tient la route et ce qui mériterait d'être repris.
-
-## Le contexte
-
-L'idée derrière ce script est élégante : centraliser une collection de scripts utilitaires dans un dépôt Git public (ici, une instance Forgejo auto-hébergée), puis fournir un **unique point d'entrée** que l'on télécharge sur n'importe quelle machine. Ce point d'entrée se met à jour tout seul, propose à l'opérateur de choisir quels sous-ensembles de scripts récupérer, et maintient une synchronisation locale du dépôt distant.
-
-C'est typiquement le genre d'outil qui se déploie en une ligne :
-
-```bash
-wget https://git.example.fr/.../fetch_scripts.sh && bash fetch_scripts.sh
-```
-
-Décortiquons ce qu'il fait, étape par étape, puis voyons où il faudrait taper.
-
----
-
-## Étape 1 — L'auto-mise à jour
-
-```bash
-SCRIPT_URL="https://git.abonnel.fr/.../fetch_scripts.sh"
-SCRIPT_NAME=$(basename "$0")
-TMP_SCRIPT="/tmp/$SCRIPT_NAME"
-
-wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
-
-if ! cmp -s "$TMP_SCRIPT" "$0"; then
- echo "🔄 Mise à jour du script..."
- mv "$TMP_SCRIPT" "$0"
- chmod +x "$0"
- exec "$0" "$@"
-fi
-```
-
-**Ce qui se passe :** le script télécharge sa propre version distante dans `/tmp`, la compare octet-à-octet avec lui-même (`cmp -s`), et si elle diffère, il s'écrase, se rend exécutable, et **se relance** via `exec` (qui remplace le processus courant — pas d'empilement de shells).
-
-**Pourquoi c'est malin :** ça garantit qu'à chaque exécution, l'opérateur travaille avec la version canonique du dépôt. Pas besoin de mécanisme de versioning, pas de vérification de hash, pas de paquet à publier.
-
-**Pourquoi c'est risqué :** on y reviendra dans la critique, mais en résumé — l'auto-mise à jour silencieuse depuis une URL en HTTPS sans signature est une porte d'entrée pour la chaîne d'approvisionnement.
-
----
-
-## Étape 2 — Récupération du catalogue de dossiers
-
-```bash
-REPO_URL="https://git.abonnel.fr/.../scripts"
-DIR_LIST_FILE=".directories.txt"
-MANDATORY_DIR="common"
-
-TMP_DIR=$(mktemp -d)
-wget -q -O "$TMP_DIR/$DIR_LIST_FILE" "$REPO_URL/$DIR_LIST_FILE"
-mapfile -t AVAILABLE_DIRS < "$TMP_DIR/$DIR_LIST_FILE"
-```
-
-Le dépôt distant contient un fichier `.directories.txt` qui liste les catégories de scripts disponibles (par exemple : `common`, `proxmox`, `php`, `monitoring`…). Ce fichier est la **source de vérité** : ajouter une catégorie côté serveur la rend immédiatement disponible côté client.
-
-`mapfile` (alias `readarray`) lit le fichier ligne à ligne dans un tableau Bash. Plus propre qu'une boucle `while read`.
-
-Un dossier `common` est marqué comme obligatoire — il sera toujours téléchargé, sans demander à l'utilisateur.
-
----
-
-## Étape 3 — Mémoire de la sélection précédente
-
-```bash
-SELECTED_DIRS_FILE=".selected_dirs.txt"
-
-if [ -f "$SELECTED_DIRS_FILE" ]; then
- mapfile -t PREVIOUS_SELECTION < "$SELECTED_DIRS_FILE"
-else
- PREVIOUS_SELECTION=()
-fi
-```
-
-À chaque exécution, le script relit la sélection de la fois précédente. C'est ce qui permet à l'interface graphique (étape suivante) de **pré-cocher** les bons dossiers : on n'a pas à refaire son choix à chaque mise à jour.
-
----
-
-## Étape 4 — L'interface `whiptail`
-
-```bash
-CHOICES=()
-for dir in "${AVAILABLE_DIRS[@]}"; do
- if [ "$dir" == "$MANDATORY_DIR" ]; then
- continue
- fi
- if [[ " ${PREVIOUS_SELECTION[*]} " =~ " $dir " ]]; then
- CHOICES+=("$dir" "" ON)
- else
- CHOICES+=("$dir" "" OFF)
- fi
-done
-
-SELECTED_DIRS=$(whiptail --title "Sélection des dossiers" --checklist \
- "Sélectionnez les dossiers à télécharger :" 20 60 10 \
- "${CHOICES[@]}" 3>&1 1>&2 2>&3)
-```
-
-`whiptail` est l'outil de dialogue ncurses standard sur Debian/Ubuntu — il affiche cette boîte bleue familière avec des cases à cocher, navigable au clavier. Idéal en SSH.
-
-La gymnastique `3>&1 1>&2 2>&3` est un classique : `whiptail` écrit son interface sur stdout et sa réponse sur stderr. Il faut donc **échanger les deux** pour capturer la sélection dans `$SELECTED_DIRS` tout en laissant l'interface s'afficher.
-
-L'expression `[[ " ${ARRAY[*]} " =~ " $dir " ]]` est une astuce courante pour tester l'appartenance à un tableau Bash — on entoure d'espaces pour éviter les correspondances partielles (`web` qui matcherait `web-server`).
-
----
-
-## Étape 5 — Synchronisation : ajouts et suppressions
-
-```bash
-SELECTED_DIRS_ARRAY=("$MANDATORY_DIR" $(echo "$SELECTED_DIRS" | tr -d '"'))
-echo "${SELECTED_DIRS_ARRAY[@]}" > "$SELECTED_DIRS_FILE"
-
-for dir in "${PREVIOUS_SELECTION[@]}"; do
- if [[ ! " ${SELECTED_DIRS_ARRAY[*]} " =~ " $dir " ]]; then
- echo "🗑 Suppression du dossier $dir..."
- rm -rf "$dir"
- fi
-done
-```
-
-Logique de diff : tout ce qui était sélectionné avant et ne l'est plus est **supprimé du disque**. Ça maintient le répertoire local propre — pas de scripts orphelins qui traînent.
-
-`whiptail` renvoie la sélection sous forme de chaîne entre guillemets (`"dir1" "dir2"`), d'où le `tr -d '"'` pour les retirer avant de constituer le tableau.
-
----
-
-## Étape 6 — Téléchargement des fichiers de chaque dossier
-
-```bash
-for TARGET_DIR in "${SELECTED_DIRS_ARRAY[@]}"; do
- wget -q -O "$LIST_PATH" "$REPO_URL/$TARGET_DIR/.list_files.txt"
- mkdir -p "$TARGET_DIR"
-
- while read -r file; do
- wget -q -O "$TARGET_DIR/$(basename "$file")" "$REPO_URL/$TARGET_DIR/$file"
- done < "$LIST_PATH"
-
- for existing_file in "$TARGET_DIR"/*; do
- if [ -f "$existing_file" ] && ! grep -qx "$(basename "$existing_file")" "$LIST_PATH"; then
- rm "$existing_file"
- fi
- done
-
- chmod +x "$TARGET_DIR"/*.sh
-done
-```
-
-Même logique récursive d'un niveau plus bas : chaque dossier contient son propre `.list_files.txt` listant ses fichiers. On télécharge ceux qui y figurent, on supprime ceux qui n'y figurent plus, et on rend tout exécutable.
-
-C'est une forme de `rsync` artisanal, basé sur des manifestes plats. Ça fonctionne sans avoir à installer `git` sur la machine cible — seuls `wget` et `whiptail` sont requis.
-
----
-
-## Critique : ce qui marche, ce qui inquiète
-
-### Les bons côtés
-
-**La logique d'idempotence** est solide. Le script peut tourner cent fois de suite, il convergera toujours vers le même état : les dossiers sélectionnés contiendront exactement les fichiers du manifeste, ni plus, ni moins. C'est le bon réflexe DevOps.
-
-**L'auto-bootstrap** est ergonomique. Une seule URL à retenir, tout le reste se télécharge tout seul. Pour une bibliothèque personnelle de scripts d'admin, c'est imbattable en simplicité.
-
-**Pas de dépendances exotiques.** `wget`, `whiptail`, `mapfile` : tout est disponible nativement sur Debian. Le script tourne aussi bien sur un conteneur LXC fraîchement provisionné que sur une machine établie.
-
-**Le manifeste séparé** (`.directories.txt` et `.list_files.txt`) découple la liste des fichiers de leur contenu. C'est plus simple qu'un parsing HTML de l'index Git, et ça reste sous contrôle éditorial.
-
-### Les angles morts
-
-#### 1. Aucune vérification d'intégrité
-
-C'est **le** point critique. Le script télécharge du code exécutable en HTTPS, sans vérifier :
-- ni signature GPG,
-- ni hash SHA256,
-- ni même que le serveur a bien répondu correctement.
-
-`wget -q` en mode silencieux **n'échoue pas visiblement** : si la requête renvoie une page d'erreur 404 ou une page de connexion captive Wi-Fi en HTML, elle sera écrite dans le fichier de destination. La vérification suivante (`cmp -s`) considérera ce HTML comme « différent », fera le `mv`, et au prochain `exec` le shell essaiera d'exécuter du HTML. Au mieux ça crashe, au pire ça exécute des balises interprétables.
-
-**Pire encore pour l'auto-update :** si quelqu'un compromet l'instance Forgejo (ou interpose un proxy malveillant capable de servir un certificat valide pour `git.abonnel.fr`), le prochain `fetch_scripts.sh` télécharge et exécute du code arbitraire avec les privilèges de l'utilisateur courant — souvent root pour ce genre d'outils d'admin.
-
-**Correctif minimal :** publier un fichier `.sha256sums` signé GPG dans le dépôt, le télécharger, vérifier sa signature avec une clé connue localement, puis valider chaque fichier téléchargé contre ce manifeste.
-
-#### 2. `wget` sans gestion d'erreur
-
-```bash
-wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"
-if ! cmp -s "$TMP_SCRIPT" "$0"; then
-```
-
-Si `wget` échoue (réseau coupé, DNS HS, certificat expiré), `$TMP_SCRIPT` sera soit vide soit absent. `cmp -s` retournera « différent », et le script **écrasera la version locale par un fichier vide**. À la prochaine exécution, plus rien ne fonctionne.
-
-**Correctif :** vérifier le code de retour de `wget`, vérifier que le fichier téléchargé n'est pas vide, et vérifier qu'il commence bien par `#!/bin/bash` avant d'écraser quoi que ce soit.
-
-```bash
-if ! wget -q -O "$TMP_SCRIPT" "$SCRIPT_URL"; then
- echo "❌ Téléchargement échoué, on garde la version actuelle"
-elif [ ! -s "$TMP_SCRIPT" ] || ! head -n1 "$TMP_SCRIPT" | grep -q "^#!"; then
- echo "❌ Fichier téléchargé invalide"
- rm -f "$TMP_SCRIPT"
-elif ! cmp -s "$TMP_SCRIPT" "$0"; then
- # ...
-fi
-```
-
-#### 3. Le `exec "$0" "$@"` perd les modifications de l'environnement
-
-Si le script a été lancé par `bash fetch_scripts.sh` (donc sans le bit exécutable, sans shebang utilisé), `$0` vaut `fetch_scripts.sh`. Après `mv`, on `exec` un fichier qui pourrait ne pas être dans le `$PATH`. En pratique ça marche parce qu'on est dans le bon répertoire, mais c'est fragile — un `cd` quelque part dans le script suffirait à le casser.
-
-#### 4. Injection via les noms de fichiers du manifeste
-
-```bash
-while read -r file; do
- wget -q -O "$TARGET_DIR/$(basename "$file")" "$REPO_URL/$TARGET_DIR/$file"
-done < "$LIST_PATH"
-```
-
-Le contenu de `.list_files.txt` est utilisé directement dans une URL et dans un chemin de fichier local. Si quelqu'un peut écrire dans ce fichier manifeste (ce qui revient à pouvoir pousser sur le dépôt Forgejo), il peut y mettre des chemins comme `../../../etc/cron.d/backdoor` et écrire en dehors du répertoire prévu.
-
-`basename` neutralise partiellement la chose côté nom local, mais l'URL côté distant accepte n'importe quoi. C'est moins critique que la première faille, mais ça mérite un filtre regex (`[a-zA-Z0-9._-]+` uniquement).
-
-#### 5. `whiptail` et la sélection vide
-
-Si l'utilisateur ne coche rien et valide, `$SELECTED_DIRS` est vide. Le script continue avec seulement `common`, ce qui est probablement le comportement attendu. Mais si `whiptail` n'est pas installé (rare mais possible, par exemple sur Alpine ou un Debian minimal sans `whiptail`), le script échoue avec une erreur peu explicite. Un test préalable `command -v whiptail` éviterait la déconvenue.
-
-#### 6. Pas de log, pas de mode dry-run
-
-Pour un outil qui supprime des fichiers (`rm -rf "$dir"`), l'absence d'option `--dry-run` qui afficherait ce qui *serait* fait sans rien toucher est gênante. Une frappe distraite sur la checklist, et un dossier entier disparaît sans warning.
-
-#### 7. Le verrou manquant
-
-Rien n'empêche deux instances de `fetch_scripts.sh` de tourner en parallèle (par exemple via `cron` et un opérateur en interactif). Un `flock` sur un fichier de lock éviterait des courses sur les opérations de download/delete.
-
----
-
-## Verdict
-
-C'est un script **utile, lisible, et bien construit pour un usage personnel** sur des machines de confiance. La logique de synchronisation est saine, l'ergonomie `whiptail` est appréciable, l'auto-bootstrap est élégant.
-
-Mais dès qu'on franchit la frontière du « j'utilise ça sur mes propres machines avec mon propre dépôt », les manques se font sentir : **pas de vérification d'intégrité, pas de gestion d'erreur réseau, pas d'option de récupération**. Dans un contexte d'équipe ou de production, ces points sont bloquants.
-
-### Pistes d'évolution prioritaires
-
-1. **Signature ou checksum** : publier un `MANIFEST.sha256` signé GPG, le vérifier avant tout `mv` ou exécution.
-2. **`set -euo pipefail`** en tête de script pour faire échouer proprement à la première erreur.
-3. **Vérifier `wget`** : code de retour, fichier non vide, shebang présent.
-4. **Backup avant écrasement** : conserver la version précédente (`fetch_scripts.sh.bak`) pour pouvoir revenir en arrière.
-5. **Option `--dry-run`** pour visualiser sans appliquer.
-6. **Filtre regex** sur les noms de fichiers du manifeste pour éviter les traversées de chemin.
-7. **Lock file** via `flock` pour éviter les exécutions concurrentes.
-
-Avec ces ajouts, on passe d'un script « pratique » à un outil de déploiement digne de ce nom — sans rien perdre de sa simplicité initiale.
\ No newline at end of file
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_035b34dd014ac80f-635197.jpg b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_035b34dd014ac80f-635197.jpg
deleted file mode 100644
index ac0c81a..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_035b34dd014ac80f-635197.jpg and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_5913d9738c966833-30567.jpg b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_5913d9738c966833-30567.jpg
deleted file mode 100644
index 54ec9c9..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_5913d9738c966833-30567.jpg and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_7d6ba93f6ce840e7-13566.webp b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_7d6ba93f6ce840e7-13566.webp
deleted file mode 100644
index fc9ad23..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_7d6ba93f6ce840e7-13566.webp and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_d5dde33b48cd2761-66620.jpg b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_d5dde33b48cd2761-66620.jpg
deleted file mode 100644
index c15f74d..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_d5dde33b48cd2761-66620.jpg and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_e99b946f131256b8-49943.jpg b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_e99b946f131256b8-49943.jpg
deleted file mode 100644
index 7686c81..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_e99b946f131256b8-49943.jpg and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_fb5a5b1ffa000d12-30780.png b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_fb5a5b1ffa000d12-30780.png
deleted file mode 100644
index bcaf159..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/_thumb_fb5a5b1ffa000d12-30780.png and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/cover.jpg b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/cover.jpg
deleted file mode 100644
index 3cfadc3..0000000
Binary files a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/files/cover.jpg and /dev/null differ
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/index.md b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/index.md
deleted file mode 100644
index a87fc04..0000000
--- a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/index.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# LEGO : La brique qui répond
-
-## La brique qui répond
-
-À première vue c'est une brique LEGO comme une autre. Un parallélépipède de plastique gris, le format classique, deux par quatre tenons sur le dessus. On pourrait la prendre, l'emboîter dans un mur, et ne rien remarquer. Sauf que celle-là parle. Elle fait du bruit, elle clignote, elle sait si vous la secouez ou si vous la posez à plat. À l'intérieur, LEGO a réussi à caser un accéléromètre, un capteur de lumière, un capteur de couleur, un haut-parleur miniature et une puce sur mesure plus petite qu'un seul tenon. C'est la **LEGO Smart Brick**, et elle est arrivée en boutique le 1ᵉʳ mars 2026.
-
-Il faut tout de suite tordre le cou à un malentendu. La Smart Brick, ce n'est pas un Mindstorms. Ce n'est pas du LEGO éducatif, ce n'est pas une plateforme pour apprendre à coder, et on ne programme rien du tout avec. C'est un objet beaucoup plus simple dans son intention : faire en sorte qu'un set LEGO réagisse quand on joue avec. Vous prenez le X-Wing de Luke Skywalker, vous le faites basculer pour décoller, le brique embarquée détecte le mouvement et joue le bruit du moteur. Vous posez la minifigurine de Dark Vador à côté, la brique la reconnaît grâce à un Smart Tag (une petite tuile codée), et elle déclenche la respiration emblématique du Seigneur Sith. C'est tout. Mais c'est déjà beaucoup.
-
-LEGO appelle cet écosystème **Smart Play**. Il repose sur trois éléments. La Smart Brick elle-même, qui est le cerveau et le haut-parleur. Les Smart Tags, des tuiles plates qu'on accroche aux constructions et qui disent à la brique ce qu'elle doit faire à cet endroit (« ici tu joues un bruit de tir laser », « ici tu fais le bruit du réacteur »). Et les Smart Minifigures, des figurines avec un identifiant intégré, que la brique détecte quand on les approche. Le tout communique en local, sans appli obligatoire, sans écran, via un système maison que LEGO a baptisé BrickNet. C'est important : le pari est explicitement de faire de la techno **invisible**, pas de coller un smartphone entre l'enfant et le jouet.
-
-Côté pratique, la brique se recharge sans fil. Elle tient environ deux heures et demie en jeu actif, se met en veille au bout de trois minutes d'inactivité et se réveille quand on la secoue. Au-delà d'une dizaine d'heures de veille, il faut la remettre sur son chargeur. Une application gratuite, **LEGO SMART Assist**, sert à régler le volume, donner un nom à ses briques, gérer plusieurs appareils, et surtout mettre à jour le firmware — parce que oui, une brique LEGO peut maintenant recevoir des mises à jour logicielles. On y est.
-
-Pour le lancement, LEGO a choisi Star Wars, et l'offre est un peu plus subtile qu'il n'y paraît. **Huit sets** sortent le 1ᵉʳ mars, mais seulement **trois contiennent réellement une Smart Brick**. Ce sont les coffrets dits *All-In-One*, qui embarquent la brique, son chargeur, des tags et des figurines intelligentes :
-
-- **75421 — Chasseur TIE de Dark Vador** : 69,99 €, le ticket d'entrée.
-- **75423 — Le X-Wing rouge de Luke Skywalker** : 89,99 €.
-- **75427 — Duel dans la salle du trône & A-Wing** : 159,99 €, le plus gros, avec **deux** Smart Bricks.
-
-Les cinq autres sets — Millennium Falcon, Mos Eisley Cantina, AT-ST Endor, hutte de Yoda, Landspeeder de Luke — sont étiquetés Smart Play mais ne contiennent **pas** de brique. Ils embarquent juste des tags et des figurines compatibles. Pour qu'ils s'animent, il faut posséder une brique achetée dans l'un des trois coffrets *All-In-One*, et la déplacer d'un set à l'autre. C'est un choix commercial qu'on peut critiquer : un parent ou un grand-parent qui voit *Smart Play* sur la boîte de la Mos Eisley Cantina à 79,99 € a de quoi être surpris en rentrant à la maison.
-
-Géographiquement, le lancement est restreint. Six pays seulement à l'ouverture : États-Unis, Royaume-Uni, France, Allemagne, Pologne, Australie. Le reste du monde attendra.
-
-Pourquoi est-ce intéressant au-delà du cas Star Wars ? Parce que LEGO ne fait pas ça pour vendre trois sets. La marque parle de **plus de vingt brevets** déposés sur la techno, et de la « plus grande évolution du système LEGO depuis l'introduction de la minifigurine en 1978 ». Le ton est ambitieux, et il y a déjà des rumeurs de déclinaisons sur les gammes Pokémon et Animal Crossing. Si le pari réussit, on parle d'une plateforme qui peut s'étendre à toute la production LEGO sur dix ou vingt ans. Si elle échoue, ce sera la deuxième tentative ratée après les Mindstorms et la gamme Boost, dans la longue liste des essais LEGO pour marier l'électronique au plastique.
-
-Le point qui me semble vraiment réussi, c'est la philosophie sans écran. Là où la plupart des jouets connectés exigent une tablette pour fonctionner, où l'enfant finit en pratique à regarder un iPad plutôt qu'à jouer avec l'objet physique, LEGO a fait le choix inverse : l'application existe mais elle est facultative, toute l'interaction se passe entre les mains et les briques. C'est moins spectaculaire dans une démo marketing, mais c'est probablement plus juste pour des gamins de huit ans.
-
-Reste à voir ce que ça donne en vrai, sur le tapis du salon, après six mois d'utilisation, quand la batterie sera moins fringante et que la nouveauté se sera émoussée. C'est toujours là que se joue la vraie partie pour ce genre de produit. Mais sur le papier, et c'est rare, LEGO a sorti quelque chose qui ne ressemble à rien d'autre.
\ No newline at end of file
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/meta.json b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/meta.json
deleted file mode 100644
index 251bb52..0000000
--- a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/meta.json
+++ /dev/null
@@ -1,152 +0,0 @@
-{
- "uuid": "c8fa250e-d8b5-453a-a06a-799d53c3b6d1",
- "slug": "la-smart-brick-de-lego-quand-la-brique-devient-intelligente",
- "title": "LEGO : La brique qui répond",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2026-01-13 20:26",
- "created_at": "2026-01-13 20:26:53",
- "updated_at": "2026-05-11 22:45:23",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-11 21:54:06",
- "comment": "",
- "title": "LEGO : La brique qui répond"
- },
- {
- "n": 2,
- "date": "2026-05-11 22:45:23",
- "comment": "",
- "title": "LEGO : La brique qui répond"
- }
- ],
- "cover": "cover.jpg",
- "files_meta": {
- "cover.jpg": {
- "author": "",
- "source_url": "https://thegadgetflow.com/wp-content/uploads/2026/01/LEGO-Interactive-smart-brick-featured-image-1.jpg"
- },
- "_thumb_035b34dd014ac80f-635197.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_5913d9738c966833-30567.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_7d6ba93f6ce840e7-13566.webp": {
- "author": "",
- "source_url": ""
- },
- "_thumb_d5dde33b48cd2761-66620.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_e99b946f131256b8-49943.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_fb5a5b1ffa000d12-30780.png": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [
- {
- "url": "https://www.begeek.fr/lego-smart-brick-les-briques-de-la-marque-danoise-deviennent-interactives-426477",
- "name": "LEGO Smart Brick : les briques de la marque danoise deviennent interactives",
- "added_at": "2026-05-11 21:47:32",
- "meta": {
- "mime": "text/html",
- "size": 36385,
- "description": "Avec les Smart Bricks, LEGO transforme chaque construction en une expérience connectée grâce à des capteurs, haut-parleurs et LED intégrés.",
- "og_image": "/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_5913d9738c966833-30567.jpg",
- "site_name": "Begeek",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2026-01-07T13:00:51+00:00",
- "canonical": "https://www.begeek.fr/lego-smart-brick-les-briques-de-la-marque-danoise-deviennent-interactives-426477"
- }
- },
- {
- "url": "https://www.mac4ever.com/divers/193948-lego-devoile-une-etonnante-brique-intelligente-au-ces-2026",
- "name": "LEGO dévoile une étonnante brique intelligente au CES 2026",
- "added_at": "2026-05-11 21:47:50",
- "meta": {
- "mime": "text/html",
- "size": 121071,
- "description": "Pour sa première apparition au CES de Las Vegas, LEGO frappe fort avec Smart Play, une nouvelle plateforme qui intègre de l'électronique miniaturisée…",
- "og_image": "/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_7d6ba93f6ce840e7-13566.webp",
- "site_name": "Mac4Ever",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2026-01-06T09:36:39+01:00",
- "canonical": "https://www.mac4ever.com/divers/193948-lego-devoile-une-etonnante-brique-intelligente-au-ces-2026"
- }
- },
- {
- "url": "https://www.clubic.com/actualite-593794-lego-devoile-smart-play-sa-plus-grosse-innovation-depuis-toujours.html",
- "name": "LEGO dévoile Smart Play, sa plus grosse innovation \"depuis... toujours\" !",
- "added_at": "2026-05-11 21:48:05",
- "meta": {
- "mime": "text/html",
- "size": 251642,
- "description": "Dans les couloirs du CES de Las Vegas, la marque LEGO a tenu à dévoiler une toute nouvelle brique intelligente : Smart Brick. Une brique qui va se charger de réagir de manière intelligente (et autonome) à son environnement, sans la moindre application ou écran externe.",
- "og_image": "/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_d5dde33b48cd2761-66620.jpg",
- "site_name": "clubic.com",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2026-01-07T09:56:00+01:00",
- "canonical": "https://www.clubic.com/actualite-593794-lego-devoile-smart-play-sa-plus-grosse-innovation-depuis-toujours.html"
- }
- },
- {
- "url": "https://www.solutions-magazine.com/lego-smart-brick/",
- "name": "LEGO lance sa « smart brick » - Solutions Magazine",
- "added_at": "2026-05-11 21:48:23",
- "meta": {
- "mime": "text/html",
- "size": 582486,
- "description": "Au CES, Lego a dévoilé un ensemble de nouvelles technologies insérées dans ses futurs jouets. Notamment sa « smart brick »",
- "og_image": "/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_e99b946f131256b8-49943.jpg",
- "site_name": "Solutions Magazine",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2026-01-10T15:56:46+00:00",
- "canonical": "https://www.solutions-magazine.com/lego-smart-brick/"
- }
- },
- {
- "url": "https://www.lesnumeriques.com/jouet/lego-smart-play-on-a-mis-nos-gros-doigts-sur-la-petite-brique-magique-et-c-est-bluffant-n249358.html",
- "name": "Lego Smart Play : on a mis nos gros doigts sur la petite brique magique, et c'est bluffant ! - Les Numériques",
- "added_at": "2026-05-11 21:48:38",
- "meta": {
- "mime": "text/html",
- "size": 219016,
- "description": "Présentée il y a quelques jours au CES en exclusivité, la brique Lego connectée Smart Brick s'est dévoilée un peu plus à Paris. Après quelques minutes de démonstration, avouons-le : nous regrettons de ne plus avoir 8 ans pour jouer avec sans scrupule.",
- "keywords": "lego",
- "og_image": "/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_035b34dd014ac80f-635197.jpg",
- "og_type": "article",
- "date": "2026-01-11T06:00:00Z",
- "canonical": "https://www.lesnumeriques.com/jouet/lego-smart-play-on-a-mis-nos-gros-doigts-sur-la-petite-brique-magique-et-c-est-bluffant-n249358.html"
- }
- },
- {
- "url": "https://www.lego.com/fr-fr/smart-play",
- "name": "Système LEGO® SMART Play™ | Boutique LEGO® officielle FR",
- "added_at": "2026-05-11 21:48:47",
- "meta": {
- "mime": "text/html",
- "size": 1219325,
- "description": "Voici le système LEGO® SMART Play™, conçu pour stimuler la créativité des enfants. Découvrez cette évolution du jeu LEGO® qui vous répond à l’infini ! Plus d’informations ici",
- "canonical": "https://www.lego.com/fr-fr/smart-play",
- "og_image": "/file?uuid=c8fa250e-d8b5-453a-a06a-799d53c3b6d1&name=_thumb_fb5a5b1ffa000d12-30780.png"
- }
- }
- ],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "loisirs"
-}
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/revisions/0001.md b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/revisions/0001.md
deleted file mode 100644
index 3494d6e..0000000
--- a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/revisions/0001.md
+++ /dev/null
@@ -1,25 +0,0 @@
-## La brique qui répond
-
-À première vue c'est une brique LEGO comme une autre. Un parallélépipède de plastique gris, le format classique, deux par quatre tenons sur le dessus. On pourrait la prendre, l'emboîter dans un mur, et ne rien remarquer. Sauf que celle-là parle. Elle fait du bruit, elle clignote, elle sait si vous la secouez ou si vous la posez à plat. À l'intérieur, LEGO a réussi à caser un accéléromètre, un capteur de lumière, un capteur de couleur, un haut-parleur miniature et une puce sur mesure plus petite qu'un seul tenon. C'est la **LEGO Smart Brick**, et elle est arrivée en boutique le 1ᵉʳ mars 2026.
-
-Il faut tout de suite tordre le cou à un malentendu. La Smart Brick, ce n'est pas un Mindstorms. Ce n'est pas du LEGO éducatif, ce n'est pas une plateforme pour apprendre à coder, et on ne programme rien du tout avec. C'est un objet beaucoup plus simple dans son intention : faire en sorte qu'un set LEGO réagisse quand on joue avec. Vous prenez le X-Wing de Luke Skywalker, vous le faites basculer pour décoller, le brique embarquée détecte le mouvement et joue le bruit du moteur. Vous posez la minifigurine de Dark Vador à côté, la brique la reconnaît grâce à un Smart Tag (une petite tuile codée), et elle déclenche la respiration emblématique du Seigneur Sith. C'est tout. Mais c'est déjà beaucoup.
-
-LEGO appelle cet écosystème **Smart Play**. Il repose sur trois éléments. La Smart Brick elle-même, qui est le cerveau et le haut-parleur. Les Smart Tags, des tuiles plates qu'on accroche aux constructions et qui disent à la brique ce qu'elle doit faire à cet endroit (« ici tu joues un bruit de tir laser », « ici tu fais le bruit du réacteur »). Et les Smart Minifigures, des figurines avec un identifiant intégré, que la brique détecte quand on les approche. Le tout communique en local, sans appli obligatoire, sans écran, via un système maison que LEGO a baptisé BrickNet. C'est important : le pari est explicitement de faire de la techno **invisible**, pas de coller un smartphone entre l'enfant et le jouet.
-
-Côté pratique, la brique se recharge sans fil. Elle tient environ deux heures et demie en jeu actif, se met en veille au bout de trois minutes d'inactivité et se réveille quand on la secoue. Au-delà d'une dizaine d'heures de veille, il faut la remettre sur son chargeur. Une application gratuite, **LEGO SMART Assist**, sert à régler le volume, donner un nom à ses briques, gérer plusieurs appareils, et surtout mettre à jour le firmware — parce que oui, une brique LEGO peut maintenant recevoir des mises à jour logicielles. On y est.
-
-Pour le lancement, LEGO a choisi Star Wars, et l'offre est un peu plus subtile qu'il n'y paraît. **Huit sets** sortent le 1ᵉʳ mars, mais seulement **trois contiennent réellement une Smart Brick**. Ce sont les coffrets dits *All-In-One*, qui embarquent la brique, son chargeur, des tags et des figurines intelligentes :
-
-- **75421 — Chasseur TIE de Dark Vador** : 69,99 €, le ticket d'entrée.
-- **75423 — Le X-Wing rouge de Luke Skywalker** : 89,99 €.
-- **75427 — Duel dans la salle du trône & A-Wing** : 159,99 €, le plus gros, avec **deux** Smart Bricks.
-
-Les cinq autres sets — Millennium Falcon, Mos Eisley Cantina, AT-ST Endor, hutte de Yoda, Landspeeder de Luke — sont étiquetés Smart Play mais ne contiennent **pas** de brique. Ils embarquent juste des tags et des figurines compatibles. Pour qu'ils s'animent, il faut posséder une brique achetée dans l'un des trois coffrets *All-In-One*, et la déplacer d'un set à l'autre. C'est un choix commercial qu'on peut critiquer : un parent ou un grand-parent qui voit *Smart Play* sur la boîte de la Mos Eisley Cantina à 79,99 € a de quoi être surpris en rentrant à la maison.
-
-Géographiquement, le lancement est restreint. Six pays seulement à l'ouverture : États-Unis, Royaume-Uni, France, Allemagne, Pologne, Australie. Le reste du monde attendra.
-
-Pourquoi est-ce intéressant au-delà du cas Star Wars ? Parce que LEGO ne fait pas ça pour vendre trois sets. La marque parle de **plus de vingt brevets** déposés sur la techno, et de la « plus grande évolution du système LEGO depuis l'introduction de la minifigurine en 1978 ». Le ton est ambitieux, et il y a déjà des rumeurs de déclinaisons sur les gammes Pokémon et Animal Crossing. Si le pari réussit, on parle d'une plateforme qui peut s'étendre à toute la production LEGO sur dix ou vingt ans. Si elle échoue, ce sera la deuxième tentative ratée après les Mindstorms et la gamme Boost, dans la longue liste des essais LEGO pour marier l'électronique au plastique.
-
-Le point qui me semble vraiment réussi, c'est la philosophie sans écran. Là où la plupart des jouets connectés exigent une tablette pour fonctionner, où l'enfant finit en pratique à regarder un iPad plutôt qu'à jouer avec l'objet physique, LEGO a fait le choix inverse : l'application existe mais elle est facultative, toute l'interaction se passe entre les mains et les briques. C'est moins spectaculaire dans une démo marketing, mais c'est probablement plus juste pour des gamins de huit ans.
-
-Reste à voir ce que ça donne en vrai, sur le tapis du salon, après six mois d'utilisation, quand la batterie sera moins fringante et que la nouveauté se sera émoussée. C'est toujours là que se joue la vraie partie pour ce genre de produit. Mais sur le papier, et c'est rare, LEGO a sorti quelque chose qui ne ressemble à rien d'autre.
\ No newline at end of file
diff --git a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/revisions/0002.md b/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/revisions/0002.md
deleted file mode 100644
index 6b9d6aa..0000000
--- a/c8fa250e-d8b5-453a-a06a-799d53c3b6d1/revisions/0002.md
+++ /dev/null
@@ -1,25 +0,0 @@
-## La brique qui répond
-
-À première vue c'est une brique LEGO comme une autre. Un parallélépipède de plastique gris, le format classique, deux par quatre tenons sur le dessus. On pourrait la prendre, l'emboîter dans un mur, et ne rien remarquer. Sauf que celle-là parle. Elle fait du bruit, elle clignote, elle sait si vous la secouez ou si vous la posez à plat. À l'intérieur, LEGO a réussi à caser un accéléromètre, un capteur de lumière, un capteur de couleur, un haut-parleur miniature et une puce sur mesure plus petite qu'un seul tenon. C'est la **LEGO Smart Brick**, et elle est arrivée en boutique le 1ᵉʳ mars 2026.
-
-Il faut tout de suite tordre le cou à un malentendu. La Smart Brick, ce n'est pas un Mindstorms. Ce n'est pas du LEGO éducatif, ce n'est pas une plateforme pour apprendre à coder, et on ne programme rien du tout avec. C'est un objet beaucoup plus simple dans son intention : faire en sorte qu'un set LEGO réagisse quand on joue avec. Vous prenez le X-Wing de Luke Skywalker, vous le faites basculer pour décoller, le brique embarquée détecte le mouvement et joue le bruit du moteur. Vous posez la minifigurine de Dark Vador à côté, la brique la reconnaît grâce à un Smart Tag (une petite tuile codée), et elle déclenche la respiration emblématique du Seigneur Sith. C'est tout. Mais c'est déjà beaucoup.
-
-LEGO appelle cet écosystème **Smart Play**. Il repose sur trois éléments. La Smart Brick elle-même, qui est le cerveau et le haut-parleur. Les Smart Tags, des tuiles plates qu'on accroche aux constructions et qui disent à la brique ce qu'elle doit faire à cet endroit (« ici tu joues un bruit de tir laser », « ici tu fais le bruit du réacteur »). Et les Smart Minifigures, des figurines avec un identifiant intégré, que la brique détecte quand on les approche. Le tout communique en local, sans appli obligatoire, sans écran, via un système maison que LEGO a baptisé BrickNet. C'est important : le pari est explicitement de faire de la techno **invisible**, pas de coller un smartphone entre l'enfant et le jouet.
-
-Côté pratique, la brique se recharge sans fil. Elle tient environ deux heures et demie en jeu actif, se met en veille au bout de trois minutes d'inactivité et se réveille quand on la secoue. Au-delà d'une dizaine d'heures de veille, il faut la remettre sur son chargeur. Une application gratuite, **LEGO SMART Assist**, sert à régler le volume, donner un nom à ses briques, gérer plusieurs appareils, et surtout mettre à jour le firmware — parce que oui, une brique LEGO peut maintenant recevoir des mises à jour logicielles. On y est.
-
-Pour le lancement, LEGO a choisi Star Wars, et l'offre est un peu plus subtile qu'il n'y paraît. **Huit sets** sortent le 1ᵉʳ mars, mais seulement **trois contiennent réellement une Smart Brick**. Ce sont les coffrets dits *All-In-One*, qui embarquent la brique, son chargeur, des tags et des figurines intelligentes :
-
-- **75421 — Chasseur TIE de Dark Vador** : 69,99 €, le ticket d'entrée.
-- **75423 — Le X-Wing rouge de Luke Skywalker** : 89,99 €.
-- **75427 — Duel dans la salle du trône & A-Wing** : 159,99 €, le plus gros, avec **deux** Smart Bricks.
-
-Les cinq autres sets — Millennium Falcon, Mos Eisley Cantina, AT-ST Endor, hutte de Yoda, Landspeeder de Luke — sont étiquetés Smart Play mais ne contiennent **pas** de brique. Ils embarquent juste des tags et des figurines compatibles. Pour qu'ils s'animent, il faut posséder une brique achetée dans l'un des trois coffrets *All-In-One*, et la déplacer d'un set à l'autre. C'est un choix commercial qu'on peut critiquer : un parent ou un grand-parent qui voit *Smart Play* sur la boîte de la Mos Eisley Cantina à 79,99 € a de quoi être surpris en rentrant à la maison.
-
-Géographiquement, le lancement est restreint. Six pays seulement à l'ouverture : États-Unis, Royaume-Uni, France, Allemagne, Pologne, Australie. Le reste du monde attendra.
-
-Pourquoi est-ce intéressant au-delà du cas Star Wars ? Parce que LEGO ne fait pas ça pour vendre trois sets. La marque parle de **plus de vingt brevets** déposés sur la techno, et de la « plus grande évolution du système LEGO depuis l'introduction de la minifigurine en 1978 ». Le ton est ambitieux, et il y a déjà des rumeurs de déclinaisons sur les gammes Pokémon et Animal Crossing. Si le pari réussit, on parle d'une plateforme qui peut s'étendre à toute la production LEGO sur dix ou vingt ans. Si elle échoue, ce sera la deuxième tentative ratée après les Mindstorms et la gamme Boost, dans la longue liste des essais LEGO pour marier l'électronique au plastique.
-
-Le point qui me semble vraiment réussi, c'est la philosophie sans écran. Là où la plupart des jouets connectés exigent une tablette pour fonctionner, où l'enfant finit en pratique à regarder un iPad plutôt qu'à jouer avec l'objet physique, LEGO a fait le choix inverse : l'application existe mais elle est facultative, toute l'interaction se passe entre les mains et les briques. C'est moins spectaculaire dans une démo marketing, mais c'est probablement plus juste pour des gamins de huit ans.
-
-Reste à voir ce que ça donne en vrai, sur le tapis du salon, après six mois d'utilisation, quand la batterie sera moins fringante et que la nouveauté se sera émoussée. C'est toujours là que se joue la vraie partie pour ce genre de produit. Mais sur le papier, et c'est rare, LEGO a sorti quelque chose qui ne ressemble à rien d'autre.
\ No newline at end of file
diff --git a/c9796eff-43b9-4e51-b613-8eec21a8c352/index.md b/c9796eff-43b9-4e51-b613-8eec21a8c352/index.md
deleted file mode 100644
index 9f18005..0000000
--- a/c9796eff-43b9-4e51-b613-8eec21a8c352/index.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# gitea, prérequis
-
-Voici les **pré-requis système** (processeur, mémoire, etc.) pour installer **Gitea** sur une distribution **Debian**
-
----
-
-### **1. Exigences minimales**
-
-Ces valeurs sont suffisantes pour un petit déploiement personnel ou une petite équipe.
-
-| Ressource | Minimum recommandé | Détails |
-| ------------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------- |
-| **CPU** | 2+ vCPU / cœur | Gitea est léger, même un petit processeur type Atom ou 1 vCPU cloud suffit. |
-| **RAM** | 1 Go ou + | Le binaire Go est efficace. 1 Go est sûr pour un usage personnel. 2 Go ou plus (pour plusieurs utilisateurs) |
-| **Stockage** | ≥ 1 Go libre | Le binaire Gitea fait ~100 Mo, plus les dépôts Git (prévoir plus selon le nombre de projets). |
-| **OS** | Debian 12 (Bookworm) ou Debian 13 | Gitea fournit des binaires compatibles. |
-| **Base de données** | SQLite, MariaDB/MySQL, PostgreSQL | SQLite pour test/local, PostgreSQL ou MariaDB en prod. |
-| **Reverse proxy** | nginx, Caddy, Apache ... avec HTTPS |
-| **Utilisateur système** | `git` (non root) pour exécuter le service |
-
----
-
-### **2. Vérification rapide des ressources**
-
-Tu peux vérifier ta machine avec :
-
-```bash
-lscpu | grep "Model name"
-free -h
-df -h /
-```
diff --git a/c9796eff-43b9-4e51-b613-8eec21a8c352/meta.json b/c9796eff-43b9-4e51-b613-8eec21a8c352/meta.json
deleted file mode 100644
index 2baca1f..0000000
--- a/c9796eff-43b9-4e51-b613-8eec21a8c352/meta.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "uuid": "c9796eff-43b9-4e51-b613-8eec21a8c352",
- "slug": "gitea-prerequis",
- "title": "gitea, prérequis",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-07 10:57:33",
- "created_at": "2025-11-07 10:57:33",
- "updated_at": "2025-11-07 10:57:33",
- "revisions": [],
- "cover": "cover.jpg",
- "category": "informatique"
-}
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/20220128-104522.png b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/20220128-104522.png
deleted file mode 100644
index f895ee3..0000000
Binary files a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/20220128-104522.png and /dev/null differ
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/ai-thinker.png b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/ai-thinker.png
deleted file mode 100644
index 40930d8..0000000
Binary files a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/ai-thinker.png and /dev/null differ
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/espressif-logo-pratik-panda-clients-2.png b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/espressif-logo-pratik-panda-clients-2.png
deleted file mode 100644
index 045ac96..0000000
Binary files a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/espressif-logo-pratik-panda-clients-2.png and /dev/null differ
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/nodemcuv3.0-pinout.jpg b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/nodemcuv3.0-pinout.jpg
deleted file mode 100644
index a5d2733..0000000
Binary files a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/files/nodemcuv3.0-pinout.jpg and /dev/null differ
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/index.md b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/index.md
deleted file mode 100644
index 1af856b..0000000
--- a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/index.md
+++ /dev/null
@@ -1,148 +0,0 @@
-# ESP8266 : panorama du SoC, des modules et des cartes de développement
-
-## Présentation
-
-L'**ESP8266** est un microcontrôleur économique intégrant nativement une interface **Wi-Fi 2,4 GHz** (IEEE 802.11 b/g/n) et une pile **TCP/IP**. Il est conçu et commercialisé par **Espressif Systems**, une société chinoise basée à Shanghai et présente à l'international (États-Unis, Inde, République tchèque, Brésil, Singapour).
-
-Lancé fin **2014**, l'ESP8266 a connu un succès très rapide grâce à un rapport prix / fonctionnalités sans précédent : pour quelques euros, il met à disposition un microcontrôleur 32 bits cadencé à 80 MHz et une connectivité Wi-Fi complète. Sa version la plus connue, l'**ESP-01**, est devenue la porte d'entrée standard vers l'IoT pour le grand public.
-
-Le SoC a depuis été complété par la famille **ESP32** (cœur Xtensa LX6/LX7 dual-core, Bluetooth en plus du Wi-Fi), puis par les **ESP32-Cx / ESP32-Sx / ESP32-Hx**, mais l'ESP8266 reste massivement utilisé pour les projets simples et peu gourmands.
-
-## Trois niveaux à ne pas confondre
-
-Avant d'entrer dans les spécifications, une clarification utile sur le vocabulaire — fréquemment mélangé dans la documentation amateur :
-
-| Niveau | Définition | Exemples |
-|---|---|---|
-| **SoC** *(System on Chip)* | Le circuit intégré nu, vendu par Espressif. | ESP8266EX |
-| **Module** | Un petit PCB qui embarque le SoC, sa flash, son antenne et un brochage standardisé. | ESP-01, ESP-12E, ESP-WROOM-02 |
-| **Carte de développement** | Une carte plus large qui embarque un module + un USB-série + un régulateur + des boutons + des broches au pas standard. | NodeMCU, WeMos D1 mini, Adafruit HUZZAH |
-
-L'ESP-01 est donc un *module* (vendu par AI-Thinker), pas un SoC ni une carte de développement à proprement parler.
-
-## Spécifications techniques du SoC ESP8266EX
-
-### Processeur
-
-- cœur **Tensilica Xtensa LX106**, RISC 32 bits ;
-- cadencé à **80 MHz** par défaut, **160 MHz** en mode overclock logiciel.
-
-### Mémoire
-
-- **32 Kio** d'IRAM (instructions) ;
-- **32 Kio** de cache d'instructions ;
-- **80 Kio** de RAM utilisateur ;
-- **16 Kio** de RAM système réservée à l'ETS ;
-- pas de ROM ni de flash interne : le code est chargé depuis une **flash SPI externe** (QSPI) pouvant atteindre **16 Mio**, généralement comprise entre 512 Kio et 4 Mio sur les modules vendus.
-
-### Radio Wi-Fi
-
-- norme **IEEE 802.11 b/g/n** (2,4 GHz uniquement) ;
-- chiffrement **WEP, WPA, WPA2** (mais pas WPA3) ;
-- modes **station**, **point d'accès** et **mixte (STA+AP)** ;
-- bloc RF intégré (TR switch, balun, LNA, PA, matching network) — le module n'a besoin que de son antenne.
-
-### Périphériques
-
-- **17 GPIO** théoriques au niveau du SoC (mais beaucoup sont préemptées par la flash SPI ou non exposées sur les modules courants) ;
-- **SPI** matériel ;
-- **I²C** logiciel (bit-banging, pas de contrôleur dédié) ;
-- **I²S** avec DMA ;
-- **UART** matérielle complète sur des broches dédiées ; un second UART en émission seule peut être activé sur GPIO2 ;
-- un **ADC 10 bits** unique, par approximations successives, lisible sur la broche TOUT/ADC0.
-
-### Alimentation
-
-- tension d'alimentation **3,0 à 3,6 V** (nominal 3,3 V) ;
-- pics de courant pouvant atteindre **environ 300 mA** lors des émissions Wi-Fi.
-
-## Modules à base d'ESP8266
-
-Deux familles principales coexistent. AI-Thinker a inondé le marché avec la série « ESP-0x / ESP-1x », pendant qu'Espressif a publié sa propre gamme « ESP-WROOM » plus tardive.
-
-### Modules AI-Thinker
-
-
-
-AI-Thinker a produit une longue série de modules, qui se distinguent essentiellement par leur **facteur de forme**, leur **antenne** (PCB, céramique, IPEX), leur **nombre de broches exposées** et la **taille de la flash** soudée.
-
-Les plus connus :
-
-| Module | Particularités |
-|---|---|
-| **ESP-01** | Le plus compact, 8 broches, antenne PCB, 1 Mo de flash sur les versions noires. Le plus économique, mais GPIO très limités. |
-| **ESP-01S** | Version améliorée de l'ESP-01, généralement 1 Mo de flash et LED câblée différemment. |
-| **ESP-07** | 16 broches, antenne céramique + connecteur IPEX pour antenne externe, blindage RF. |
-| **ESP-12E / ESP-12F / ESP-12S** | Format SMD 22 broches, blindé, antenne PCB. Base de la quasi-totalité des cartes NodeMCU et WeMos. |
-
-Les autres références (ESP-02 à ESP-11, ESP-13, ESP-14) existent mais ont peu percé en pratique. La plupart sont aujourd'hui difficiles à trouver et n'ont pas d'intérêt particulier face aux ESP-12x.
-
-### Modules Espressif
-
-
-
-Espressif a publié sa propre gamme « WROOM » certifiée FCC/CE, souvent privilégiée pour les produits commerciaux :
-
-| Module | Antenne |
-|---|---|
-| **ESP-WROOM-02** | PCB |
-| **ESP-WROOM-02D** | PCB (version révisée) |
-| **ESP-WROOM-02U** | Connecteur U.FL pour antenne externe |
-| **ESP-WROOM-S2** | Variante avec SDIO |
-
-Liste détaillée et historique des modules sur Wikipédia :
-
-## Cartes de développement
-
-Les cartes de développement embarquent un module ESP8266 et tout le nécessaire pour démarrer immédiatement : convertisseur USB-série, régulateur 3,3 V, boutons RESET et FLASH, broches au pas de 2,54 mm, parfois LED utilisateur.
-
-### NodeMCU
-
-
-
-La carte la plus populaire de la famille. Elle existe en plusieurs révisions :
-
-- **v0.9** : module ESP-12, format « large » 47 mm de large ;
-- **v1.0** (DEVKIT v1.0) : module ESP-12E, USB-série CP2102, format normalisé ;
-- **v3** (« LoLin » et clones) : module ESP-12E ou ESP-12F, USB-série CH340. C'est la version la plus répandue, bien que la numérotation « v3 » soit purement commerciale (non officielle).
-
-La carte expose la plupart des GPIO du module sous des noms **D0 à D8** propres à NodeMCU, qui ne correspondent **pas** directement aux numéros GPIO de l'ESP8266. Une table de correspondance est indispensable :
-
-| Étiquette NodeMCU | GPIO ESP8266 |
-|---|---|
-| D0 | GPIO16 |
-| D1 | GPIO5 |
-| D2 | GPIO4 |
-| D3 | GPIO0 |
-| D4 | GPIO2 (LED interne) |
-| D5 | GPIO14 |
-| D6 | GPIO12 |
-| D7 | GPIO13 |
-| D8 | GPIO15 |
-
-### WeMos D1 mini
-
-Format compact (34 × 25 mm), module ESP-12F, USB-série CH340. Compatible mécaniquement avec un large écosystème de **shields** empilables (relais, OLED, batterie, capteur DHT…). C'est aujourd'hui la carte la plus utilisée pour des projets domotiques.
-
-### Adafruit HUZZAH
-
-Carte haut de gamme avec module ESP-12E, régulateur 500 mA, niveau logique compatible avec une logique 5 V via résistances de pull-up. Idéale pour prototyper de manière fiable, mais plus chère et nécessite un FTDI externe sur la version sans USB.
-
-### Espressif ESP-12E (module)
-
-Le module ESP-12E n'est pas une carte de développement à proprement parler : c'est le module SMD soudé sur la majorité des NodeMCU et WeMos. Son brochage est cependant utile à connaître lorsqu'on veut concevoir sa propre carte autour de lui.
-
-
-
-### DOIT ESP-12F
-
-Carte de prototypage à base de module ESP-12F, comparable à une NodeMCU v3, parfois vendue sous le nom **DOIT DevKit V1**.
-
-## Pour aller plus loin
-
-- [L'ESP-01 : présentation et premiers pas](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas)
-- [Premier programme ESP-01 : afficher les informations système](https://varlog.a5l.fr/post/esp-01-premier-programme)
-- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)
-- Documentation officielle Espressif :
-- Article Wikipédia (en anglais), plus complet :
-```
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/meta.json b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/meta.json
deleted file mode 100644
index 57d17e1..0000000
--- a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/meta.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "uuid": "cb93c086-4b6f-4c32-82a5-208adb14d0bf",
- "slug": "esp8266-panorama-du-soc-des-modules-et-des-cartes-de-developpement",
- "title": "ESP8266 : panorama du SoC, des modules et des cartes de développement",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2022-01-28 10:47",
- "created_at": "2022-01-28 10:47:26",
- "updated_at": "2026-05-13 18:32:46",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-13 18:32:46",
- "comment": "Titre modifié, contenu modifié",
- "title": "Spécifications de l'ESP8266"
- }
- ],
- "cover": "",
- "files_meta": {
- "20220128-104522.png": {
- "author": "",
- "source_url": ""
- },
- "ai-thinker.png": {
- "author": "",
- "source_url": ""
- },
- "espressif-logo-pratik-panda-clients-2.png": {
- "author": "",
- "source_url": ""
- },
- "nodemcuv3.0-pinout.jpg": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Électronique"
-}
diff --git a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/revisions/0001.md b/cb93c086-4b6f-4c32-82a5-208adb14d0bf/revisions/0001.md
deleted file mode 100644
index e576546..0000000
--- a/cb93c086-4b6f-4c32-82a5-208adb14d0bf/revisions/0001.md
+++ /dev/null
@@ -1,153 +0,0 @@
-Voici une version remaniée : structure clarifiée, données factuelles vérifiées et complétées, distinction nette entre **SoC**, **modules** et **cartes de développement**, et plusieurs corrections importantes.
-
-```markdown
-
-
-# L'ESP8266 : panorama du SoC, des modules et des cartes de développement
-
-## Présentation
-
-L'**ESP8266** est un microcontrôleur économique intégrant nativement une interface **Wi-Fi 2,4 GHz** (IEEE 802.11 b/g/n) et une pile **TCP/IP**. Il est conçu et commercialisé par **Espressif Systems**, une société chinoise basée à Shanghai et présente à l'international (États-Unis, Inde, République tchèque, Brésil, Singapour).
-
-Lancé fin **2014**, l'ESP8266 a connu un succès très rapide grâce à un rapport prix / fonctionnalités sans précédent : pour quelques euros, il met à disposition un microcontrôleur 32 bits cadencé à 80 MHz et une connectivité Wi-Fi complète. Sa version la plus connue, l'**ESP-01**, est devenue la porte d'entrée standard vers l'IoT pour le grand public.
-
-Le SoC a depuis été complété par la famille **ESP32** (cœur Xtensa LX6/LX7 dual-core, Bluetooth en plus du Wi-Fi), puis par les **ESP32-Cx / ESP32-Sx / ESP32-Hx**, mais l'ESP8266 reste massivement utilisé pour les projets simples et peu gourmands.
-
-## Trois niveaux à ne pas confondre
-
-Avant d'entrer dans les spécifications, une clarification utile sur le vocabulaire — fréquemment mélangé dans la documentation amateur :
-
-| Niveau | Définition | Exemples |
-|---|---|---|
-| **SoC** *(System on Chip)* | Le circuit intégré nu, vendu par Espressif. | ESP8266EX |
-| **Module** | Un petit PCB qui embarque le SoC, sa flash, son antenne et un brochage standardisé. | ESP-01, ESP-12E, ESP-WROOM-02 |
-| **Carte de développement** | Une carte plus large qui embarque un module + un USB-série + un régulateur + des boutons + des broches au pas standard. | NodeMCU, WeMos D1 mini, Adafruit HUZZAH |
-
-L'ESP-01 est donc un *module* (vendu par AI-Thinker), pas un SoC ni une carte de développement à proprement parler.
-
-## Spécifications techniques du SoC ESP8266EX
-
-### Processeur
-
-- cœur **Tensilica Xtensa LX106**, RISC 32 bits ;
-- cadencé à **80 MHz** par défaut, **160 MHz** en mode overclock logiciel.
-
-### Mémoire
-
-- **32 Kio** d'IRAM (instructions) ;
-- **32 Kio** de cache d'instructions ;
-- **80 Kio** de RAM utilisateur ;
-- **16 Kio** de RAM système réservée à l'ETS ;
-- pas de ROM ni de flash interne : le code est chargé depuis une **flash SPI externe** (QSPI) pouvant atteindre **16 Mio**, généralement comprise entre 512 Kio et 4 Mio sur les modules vendus.
-
-### Radio Wi-Fi
-
-- norme **IEEE 802.11 b/g/n** (2,4 GHz uniquement) ;
-- chiffrement **WEP, WPA, WPA2** (mais pas WPA3) ;
-- modes **station**, **point d'accès** et **mixte (STA+AP)** ;
-- bloc RF intégré (TR switch, balun, LNA, PA, matching network) — le module n'a besoin que de son antenne.
-
-### Périphériques
-
-- **17 GPIO** théoriques au niveau du SoC (mais beaucoup sont préemptées par la flash SPI ou non exposées sur les modules courants) ;
-- **SPI** matériel ;
-- **I²C** logiciel (bit-banging, pas de contrôleur dédié) ;
-- **I²S** avec DMA ;
-- **UART** matérielle complète sur des broches dédiées ; un second UART en émission seule peut être activé sur GPIO2 ;
-- un **ADC 10 bits** unique, par approximations successives, lisible sur la broche TOUT/ADC0.
-
-### Alimentation
-
-- tension d'alimentation **3,0 à 3,6 V** (nominal 3,3 V) ;
-- pics de courant pouvant atteindre **environ 300 mA** lors des émissions Wi-Fi.
-
-## Modules à base d'ESP8266
-
-Deux familles principales coexistent. AI-Thinker a inondé le marché avec la série « ESP-0x / ESP-1x », pendant qu'Espressif a publié sa propre gamme « ESP-WROOM » plus tardive.
-
-### Modules AI-Thinker
-
-
-
-AI-Thinker a produit une longue série de modules, qui se distinguent essentiellement par leur **facteur de forme**, leur **antenne** (PCB, céramique, IPEX), leur **nombre de broches exposées** et la **taille de la flash** soudée.
-
-Les plus connus :
-
-| Module | Particularités |
-|---|---|
-| **ESP-01** | Le plus compact, 8 broches, antenne PCB, 1 Mo de flash sur les versions noires. Le plus économique, mais GPIO très limités. |
-| **ESP-01S** | Version améliorée de l'ESP-01, généralement 1 Mo de flash et LED câblée différemment. |
-| **ESP-07** | 16 broches, antenne céramique + connecteur IPEX pour antenne externe, blindage RF. |
-| **ESP-12E / ESP-12F / ESP-12S** | Format SMD 22 broches, blindé, antenne PCB. Base de la quasi-totalité des cartes NodeMCU et WeMos. |
-
-Les autres références (ESP-02 à ESP-11, ESP-13, ESP-14) existent mais ont peu percé en pratique. La plupart sont aujourd'hui difficiles à trouver et n'ont pas d'intérêt particulier face aux ESP-12x.
-
-### Modules Espressif
-
-
-
-Espressif a publié sa propre gamme « WROOM » certifiée FCC/CE, souvent privilégiée pour les produits commerciaux :
-
-| Module | Antenne |
-|---|---|
-| **ESP-WROOM-02** | PCB |
-| **ESP-WROOM-02D** | PCB (version révisée) |
-| **ESP-WROOM-02U** | Connecteur U.FL pour antenne externe |
-| **ESP-WROOM-S2** | Variante avec SDIO |
-
-Liste détaillée et historique des modules sur Wikipédia :
-
-## Cartes de développement
-
-Les cartes de développement embarquent un module ESP8266 et tout le nécessaire pour démarrer immédiatement : convertisseur USB-série, régulateur 3,3 V, boutons RESET et FLASH, broches au pas de 2,54 mm, parfois LED utilisateur.
-
-### NodeMCU
-
-
-
-La carte la plus populaire de la famille. Elle existe en plusieurs révisions :
-
-- **v0.9** : module ESP-12, format « large » 47 mm de large ;
-- **v1.0** (DEVKIT v1.0) : module ESP-12E, USB-série CP2102, format normalisé ;
-- **v3** (« LoLin » et clones) : module ESP-12E ou ESP-12F, USB-série CH340. C'est la version la plus répandue, bien que la numérotation « v3 » soit purement commerciale (non officielle).
-
-La carte expose la plupart des GPIO du module sous des noms **D0 à D8** propres à NodeMCU, qui ne correspondent **pas** directement aux numéros GPIO de l'ESP8266. Une table de correspondance est indispensable :
-
-| Étiquette NodeMCU | GPIO ESP8266 |
-|---|---|
-| D0 | GPIO16 |
-| D1 | GPIO5 |
-| D2 | GPIO4 |
-| D3 | GPIO0 |
-| D4 | GPIO2 (LED interne) |
-| D5 | GPIO14 |
-| D6 | GPIO12 |
-| D7 | GPIO13 |
-| D8 | GPIO15 |
-
-### WeMos D1 mini
-
-Format compact (34 × 25 mm), module ESP-12F, USB-série CH340. Compatible mécaniquement avec un large écosystème de **shields** empilables (relais, OLED, batterie, capteur DHT…). C'est aujourd'hui la carte la plus utilisée pour des projets domotiques.
-
-### Adafruit HUZZAH
-
-Carte haut de gamme avec module ESP-12E, régulateur 500 mA, niveau logique compatible avec une logique 5 V via résistances de pull-up. Idéale pour prototyper de manière fiable, mais plus chère et nécessite un FTDI externe sur la version sans USB.
-
-### Espressif ESP-12E (module)
-
-Le module ESP-12E n'est pas une carte de développement à proprement parler : c'est le module SMD soudé sur la majorité des NodeMCU et WeMos. Son brochage est cependant utile à connaître lorsqu'on veut concevoir sa propre carte autour de lui.
-
-
-
-### DOIT ESP-12F
-
-Carte de prototypage à base de module ESP-12F, comparable à une NodeMCU v3, parfois vendue sous le nom **DOIT DevKit V1**.
-
-## Pour aller plus loin
-
-- [L'ESP-01 : présentation et premiers pas](https://varlog.a5l.fr/post/esp-01-presentation-premiers-pas)
-- [Premier programme ESP-01 : afficher les informations système](https://varlog.a5l.fr/post/esp-01-premier-programme)
-- [ESP8266 : commandes AT](https://varlog.a5l.fr/post/esp8266-commandes-at)
-- Documentation officielle Espressif :
-- Article Wikipédia (en anglais), plus complet :
-```
diff --git a/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/files/cover.png b/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/files/cover.png
deleted file mode 100644
index c814f06..0000000
Binary files a/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/files/cover.png and /dev/null differ
diff --git a/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/index.md b/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/index.md
deleted file mode 100644
index 899c5e5..0000000
--- a/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Forum Alpinux
-
-Hier soir se tenait le *Repair du Libre* et le *Forum Alpinux* à Chambéry.
-
-Lors du *Repair du Libre*, une personne est venue pour faire diagnostiquer son ordinateur. Trois points ont été vérifiés : la batterie, le disque dur et l’espace de stockage. La batterie, âgée de plus de 4 ans, était hors service. En revanche, le disque dur était en bon état selon *SmartControl*, et l’espace disque disponible était suffisant.
-
-Nous avons également tenté d’installer **Linux Mint 22.1** sur un PC sans UEFI, mais l’opération s’est révélée complexe. L’installateur *Ubiquity* prépare le disque en mode GPT, ce qui n’est pas compatible avec une machine équipée d’un BIOS classique, entraînant l’échec de l’installation.
-
-Par ailleurs, un autre ordinateur présentait un problème de connexion Wi-Fi : le pilote ne se chargeait pas à cause de *Secure Boot*. Une fois ce dernier désactivé, la connexion devrait fonctionner normalement.
-
-Enfin, avec l’aide de Brice, nous avons échangé autour d’*OpenStreetMap*, *StreetComplete* et *OSMAND~* pendant le *Forum Alpinux*. Une contribution collective via *StreetComplete* est prévue en juin par Alpinux à Chambéry.
diff --git a/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/meta.json b/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/meta.json
deleted file mode 100644
index 8c2b829..0000000
--- a/cd0a1ad7-7559-40e0-96b3-0bfbf4734d18/meta.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "uuid": "cd0a1ad7-7559-40e0-96b3-0bfbf4734d18",
- "slug": "forum-alpinux",
- "title": "Forum Alpinux",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-04-04 07:45",
- "created_at": "2025-04-04 07:45:00",
- "updated_at": "2026-05-12 09:42:07",
- "revisions": [],
- "cover": "cover.png",
- "files_meta": {
- "571f5db24ca3ff68-74792.png": {
- "author": "Alpinux",
- "source_url": ""
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "linux"
-}
diff --git a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/files/dummy.png b/cfe738e9-7ac2-4c7e-9205-dab4957835c6/files/dummy.png
deleted file mode 100644
index 58bb881..0000000
Binary files a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/files/dummy.png and /dev/null differ
diff --git a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/index.md b/cfe738e9-7ac2-4c7e-9205-dab4957835c6/index.md
deleted file mode 100644
index 60c8270..0000000
--- a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/index.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Décoder les infos de la TIC et les communiquer
-
-## Choix du Raspberry Pi
-
-L'objectif est de récupérer automatiquement et à intervalles réguliers les informations émises par un compteur Linky, puis de les rendre accessibles depuis l'extérieur du Raspberry Pi.
-
-Trois prérequis matériels s'imposent donc :
-
-- une **connexion réseau**, pour exposer ou transmettre les données collectées ;
-- un **espace de stockage**, suffisant pour l'OS, les outils et l'historique des relevés ;
-- une **liaison série**, pour dialoguer avec la sortie TIC du compteur.
-
-Le choix s'est porté sur un **Raspberry Pi 3**, qui couvre ces trois besoins sans surcoût ni complexité supplémentaire. Le stockage est assuré par une carte SD, la liaison série est exposée sur le port GPIO, et la connectivité réseau bénéficie d'un atout pratique : l'armoire de brassage de la maison se trouve à quelques mètres du compteur électrique, ce qui permet d'envisager un raccordement filaire fiable plutôt qu'un lien sans fil.
-
-Côté logiciel, le système retenu est **Raspberry Pi OS** (anciennement Raspbian), recommandé par défaut sur cette plateforme. Cette distribution dérivée de Debian apporte tout l'écosystème GNU/Linux nécessaire : pile réseau TCP/IP, accès distant par SSH, synchronisation horaire NTP, gestion de bases de données, serveur web, interpréteurs PHP et Python. Autant de briques qui serviront aux étapes ultérieures du projet.
-
-## Câblage
-
-Le compteur Linky émet la trame TIC sous forme d'un **signal modulé en ASK** (Amplitude Shift Keying). Ce signal n'est pas directement exploitable par l'UART du Raspberry Pi, qui attend un niveau logique TTL stable.
-
-Un **démodulateur ASK** est donc intercalé entre le compteur et le Raspberry Pi. Son rôle est de récupérer la porteuse modulée et de restituer en sortie un signal binaire TTL propre, directement lisible par le port série.
-
-La chaîne complète est la suivante :
-
-```
-Compteur Linky → Démodulateur ASK → UART du Raspberry Pi
-```
-
-Le câblage côté Raspberry Pi se résume à trois fils :
-
-| Broche | Signal | Rôle |
-|---|---|---|
-| Pin 1 | **3V3** | Alimentation du démodulateur |
-| Pin 6 | **GND** | Masse commune |
-| Pin 10 | **RX (GPIO15)** | Lecture de la sortie TTL du démodulateur |
-
-### Schéma de câblage
-
-```
- ┌─────────────────────────┐
- │ Compteur Linky │
- │ sortie TIC (ASK) │
- └───────────┬─────────────┘
- │ signal TIC modulé
- ▼
- ┌─────────────────────────┐
- │ Démodulateur ASK │
- │ │
- │ IN ← TIC data │
- │ GND ← TIC GND │
- │ │
- │ VCC ─────────────────────► Pin 1 (3V3)
- │ GND ─────────────────────► Pin 6 (GND)
- │ OUT ─────────────────────► Pin 10 (RX / GPIO15)
- └─────────────────────────┘ Raspberry Pi 3
-```
-
-## Installation de l'OS
-
-Le déploiement de Raspberry Pi OS sur la carte SD suit la procédure standard décrite dans l'article [à compléter]. Un point d'attention : **activer le service SSH** dès la préparation de l'image, faute de quoi aucun accès distant ne sera possible au premier démarrage.
-
-Une fois le Raspberry Pi mis sous tension et raccordé au réseau, son adresse IP n'est pas connue à l'avance. Un balayage du réseau local avec `nmap` permet de l'identifier :
-
-```bash
-nmap -sn 192.168.1.0/24
-```
-
-> Note : la cible passée à `nmap` est l'adresse du réseau (`.0/24`), pas celle de la passerelle. Le `/24` indique le masque de sous-réseau et délimite la plage scannée.
-
-Une fois l'adresse repérée, la connexion s'établit avec le compte `pi` et le mot de passe par défaut `raspberry` :
-
-```bash
-ssh pi@192.168.1.68
-```
-
-> Premier réflexe sécurité : changer immédiatement le mot de passe du compte `pi` avec `passwd`, voire désactiver ce compte au profit d'un utilisateur dédié. Les identifiants par défaut sont connus de tous les scans automatisés.
diff --git a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/meta.json b/cfe738e9-7ac2-4c7e-9205-dab4957835c6/meta.json
deleted file mode 100644
index 846a6cd..0000000
--- a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/meta.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "uuid": "cfe738e9-7ac2-4c7e-9205-dab4957835c6",
- "slug": "preparation-du-raspberry-pi",
- "title": "Décoder les infos de la TIC et les communiquer",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-19 06:48",
- "created_at": "2025-11-19 06:48:01",
- "updated_at": "2026-05-12 17:38:19",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-12 17:38:19",
- "comment": "Contenu modifié",
- "title": "Décoder les infos de la TIC et les communiquer"
- }
- ],
- "cover": "",
- "files_meta": {
- "dummy.png": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Électronique"
-}
diff --git a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/revisions/0001.md b/cfe738e9-7ac2-4c7e-9205-dab4957835c6/revisions/0001.md
deleted file mode 100644
index c040130..0000000
--- a/cfe738e9-7ac2-4c7e-9205-dab4957835c6/revisions/0001.md
+++ /dev/null
@@ -1,74 +0,0 @@
-## Choix du Raspberry Pi
-
-L'objectif est de récupérer automatiquement et à intervalles réguliers les informations émises par un compteur Linky, puis de les rendre accessibles depuis l'extérieur du Raspberry Pi.
-
-Trois prérequis matériels s'imposent donc :
-
-- une **connexion réseau**, pour exposer ou transmettre les données collectées ;
-- un **espace de stockage**, suffisant pour l'OS, les outils et l'historique des relevés ;
-- une **liaison série**, pour dialoguer avec la sortie TIC du compteur.
-
-Le choix s'est porté sur un **Raspberry Pi 3**, qui couvre ces trois besoins sans surcoût ni complexité supplémentaire. Le stockage est assuré par une carte SD, la liaison série est exposée sur le port GPIO, et la connectivité réseau bénéficie d'un atout pratique : l'armoire de brassage de la maison se trouve à quelques mètres du compteur électrique, ce qui permet d'envisager un raccordement filaire fiable plutôt qu'un lien sans fil.
-
-Côté logiciel, le système retenu est **Raspberry Pi OS** (anciennement Raspbian), recommandé par défaut sur cette plateforme. Cette distribution dérivée de Debian apporte tout l'écosystème GNU/Linux nécessaire : pile réseau TCP/IP, accès distant par SSH, synchronisation horaire NTP, gestion de bases de données, serveur web, interpréteurs PHP et Python. Autant de briques qui serviront aux étapes ultérieures du projet.
-
-## Câblage
-
-Le compteur Linky émet la trame TIC sous forme d'un **signal modulé en ASK** (Amplitude Shift Keying). Ce signal n'est pas directement exploitable par l'UART du Raspberry Pi, qui attend un niveau logique TTL stable.
-
-Un **démodulateur ASK** est donc intercalé entre le compteur et le Raspberry Pi. Son rôle est de récupérer la porteuse modulée et de restituer en sortie un signal binaire TTL propre, directement lisible par le port série.
-
-La chaîne complète est la suivante :
-
-```
-Compteur Linky → Démodulateur ASK → UART du Raspberry Pi
-```
-
-Le câblage côté Raspberry Pi se résume à trois fils :
-
-| Broche | Signal | Rôle |
-|---|---|---|
-| Pin 1 | **3V3** | Alimentation du démodulateur |
-| Pin 6 | **GND** | Masse commune |
-| Pin 10 | **RX (GPIO15)** | Lecture de la sortie TTL du démodulateur |
-
-### Schéma de câblage
-
-```
- ┌─────────────────────────┐
- │ Compteur Linky │
- │ sortie TIC (ASK) │
- └───────────┬─────────────┘
- │ signal TIC modulé
- ▼
- ┌─────────────────────────┐
- │ Démodulateur ASK │
- │ │
- │ IN ← TIC data │
- │ GND ← TIC GND │
- │ │
- │ VCC ─────────────────────► Pin 1 (3V3)
- │ GND ─────────────────────► Pin 6 (GND)
- │ OUT ─────────────────────► Pin 10 (RX / GPIO15)
- └─────────────────────────┘ Raspberry Pi 3
-```
-
-## Installation de l'OS
-
-Le déploiement de Raspberry Pi OS sur la carte SD suit la procédure standard décrite dans l'article [à compléter]. Un point d'attention : **activer le service SSH** dès la préparation de l'image, faute de quoi aucun accès distant ne sera possible au premier démarrage.
-
-Une fois le Raspberry Pi mis sous tension et raccordé au réseau, son adresse IP n'est pas connue à l'avance. Un balayage du réseau local avec `nmap` permet de l'identifier :
-
-```bash
-nmap -sn 192.168.1.0/24
-```
-
-> Note : la cible passée à `nmap` est l'adresse du réseau (`.0/24`), pas celle de la passerelle. Le `/24` indique le masque de sous-réseau et délimite la plage scannée.
-
-Une fois l'adresse repérée, la connexion s'établit avec le compte `pi` et le mot de passe par défaut `raspberry` :
-
-```bash
-ssh pi@192.168.1.68
-```
-
-> Premier réflexe sécurité : changer immédiatement le mot de passe du compte `pi` avec `passwd`, voire désactiver ce compte au profit d'un utilisateur dédié. Les identifiants par défaut sont connus de tous les scans automatisés.
diff --git a/d6571053-2261-4e6e-ab39-3c327ff2e8e4/index.md b/d6571053-2261-4e6e-ab39-3c327ff2e8e4/index.md
deleted file mode 100644
index 76a05b2..0000000
--- a/d6571053-2261-4e6e-ab39-3c327ff2e8e4/index.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Les stratégies de migration 4G
-
-### Pression progressive sur la 3G
-
-Depuis le déploiement massif de la 4G, les opérateurs français ont mis en place des **stratégies ciblées pour inciter les utilisateurs à migrer depuis la 3G**. Même lorsque la 3G suffisait pour des usages quotidiens (email, surf, visioconférence légère), plusieurs leviers ont été utilisés :
-
-* **Bridage progressif des débits 3G** : réduction systématique des vitesses en itinérance ou sur réseaux saturés.
-* **Promotion active de la 4G** : campagnes marketing, forfaits 4G plus attractifs.
-* **Optimisation du spectre** : récupération des fréquences 3G (900/1800/2100 MHz) pour augmenter la capacité 4G.
-* **Réduction du coût par bit** : la 4G transmet plus de données avec un coût énergétique et matériel inférieur à la 3G, incitant les opérateurs à concentrer les ressources sur la 4G.
-
-Ces stratégies combinent aspects **techniques, économiques et commerciaux** pour rendre la migration quasi inévitable.
-
----
-
-### Cas opérateurs : Free, Orange, SFR, Bouygues
-
-| Opérateur | 3G moyen (Mbit/s) | 4G moyen (Mbit/s) |
-| --------- | ----------------- | ----------------- |
-| Free | 0,384 | 50–150 |
-| Orange | 0,5–1 | 60–200 |
-| SFR | 0,5 | 50–150 |
-| Bouygues | 0,5 | 50–150 |
-
-* **Free Mobile** : itinérance 3G bridée à 384 kbit/s pour les abonnés hors 4G, couverture 4G déjà très étendue.
-* **Orange** : maintien de la 3G dans les zones rurales, mais réduction progressive des débits pour favoriser la 4G.
-* **SFR et Bouygues** : bridage partiel et incitations tarifaires à passer à la 4G.
-
-> Le tableau montre l’écart spectaculaire entre la 3G bridée et les débits moyens 4G, un argument indirect pour pousser les abonnés vers la nouvelle génération.
-
----
-
-### Graphique suggéré : part des abonnés 4G vs 3G (2015–2025)
-
-```mermaid
-%% Simulation de la part des abonnés 3G vs 4G
-%% Remarque : données représentatives
-pie
- title Part des abonnés 3G vs 4G (France)
- "3G 2015": 70
- "4G 2015": 30
- "3G 2020": 25
- "4G 2020": 75
- "3G 2025": 5
- "4G 2025": 95
-```
-
-* Ce graphique illustre la **migration progressive** : alors que la 3G dominait en 2015, elle devient marginale en 2025.
-* La stratégie opérateur a donc porté ses fruits : libération de spectre et concentration des ressources sur la 4G.
-
----
-
-### Narratif
-
-Même si la 3G suffisait pour de nombreux usages quotidiens, **les opérateurs ont utilisé le bridage et la mise en avant de la 4G comme leviers indirects pour forcer la migration**.
-
-* **Libération du spectre** : les fréquences 3G peuvent être utilisées pour la 4G et préparer la 5G.
-* **Réduction des coûts** : maintenir la 3G est plus coûteux que concentrer les investissements sur la 4G.
-* **Pression subtile sur l’utilisateur** : le simple fait de ralentir la 3G encourage la migration sans hausse tarifaire directe.
-
-> En pratique, cela signifie que la 4G n’est pas seulement une amélioration technique, mais aussi un outil stratégique pour redéployer les ressources et moderniser le réseau.
-
diff --git a/d6571053-2261-4e6e-ab39-3c327ff2e8e4/meta.json b/d6571053-2261-4e6e-ab39-3c327ff2e8e4/meta.json
deleted file mode 100644
index 4b27521..0000000
--- a/d6571053-2261-4e6e-ab39-3c327ff2e8e4/meta.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "uuid": "d6571053-2261-4e6e-ab39-3c327ff2e8e4",
- "slug": "les-strategies-de-migration-4g",
- "title": "Les stratégies de migration 4G",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-05 08:43:31",
- "created_at": "2025-11-05 08:43:31",
- "updated_at": "2025-11-05 08:43:31",
- "revisions": [],
- "cover": "cover.jpg",
- "category": "télécom"
-}
diff --git a/da1b3cec-980d-458c-9d2b-0c950d278f22/index.md b/da1b3cec-980d-458c-9d2b-0c950d278f22/index.md
deleted file mode 100644
index 213c29d..0000000
--- a/da1b3cec-980d-458c-9d2b-0c950d278f22/index.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Domotique : les vrais problèmes en domotique Zigbee & Home Assistant
-
-Je suis en train de préparer une vidéo un peu différente de celle que j’ai faite sur *Zigbee, Zigbee2MQTT et Home Assistant*. Cette fois, je veux parler des **problèmes concrets** que je rencontre **au quotidien**, dans une installation domotique qui fonctionne… mais pas toujours comme prévu.
-
-Par exemple, mon antenne Zigbee — une clé que j’utilise avec Zigbee2MQTT — se **déconnecte régulièrement**, toutes les 5 à 15 minutes. C’est intermittent, difficile à diagnostiquer, et surtout très frustrant. Parfois, elle réapparaît toute seule. D’autres fois, elle oblige à redémarrer le service ou la machine. Et évidemment, quand le Zigbee tombe, **toute la chaîne domotique en dépend** : capteurs inaccessibles, automatisations qui ne se déclenchent plus, etc.
-
-Je parlerai aussi des **problèmes côté serveur**, comme certaines **mises à jour** de Home Assistant ou d’addons qui ne se passent pas bien : dépendances cassées, redémarrages partiels, ou intégrations qui ne répondent plus comme avant. Ce sont des situations qu’on rencontre tôt ou tard quand on auto-héberge, surtout dans un système évolutif et modulaire comme Home Assistant.
-
-Problèmes coté objets connectés :
-* pile HS
-* valeurs incomplètes : il manque par exemple la puissance instantanée
-* valeurs incorrectes : la valeur retournée n'est plus du tout correcte (il fait 9°C dehors et la capteur indique -1°), l'energie totale consommée passe de 1234 kW à 950 kW
-* répondant de l'objet connecté : l'action n'est pas transmise ou avec avec beaucoup de retard à l'objet connecté quand l'objet de perd pas le réseau. Résolu avec la configuration de Zigbee2MQTT.
-* perte de réseau : peut poser des problème lorsqu'on pilote des radiateurs
-
-Outils nécessaires :
-* ssh
-* multimètre
-
-L’objectif de cette vidéo, ce n’est pas de me plaindre ni de critiquer les outils que j’utilise. Au contraire. J’ai choisi cette approche justement parce qu’elle me laisse la main. Mais je veux **montrer aussi la réalité terrain**, au-delà des démonstrations propres et des installations idéales. Parce que ce sont dans ces moments-là — quand on cherche, qu’on teste, qu’on tâtonne — qu’on apprend vraiment comment tout fonctionne.
-
-Et si je partage ça, c’est aussi pour que **d’autres qui rencontrent les mêmes soucis puissent comparer, proposer, ou tout simplement se rassurer**. Ce n’est pas parfait, mais ça tourne. Et parfois, savoir qu’on n’est pas seul à rencontrer un bug, c’est déjà beaucoup.
\ No newline at end of file
diff --git a/da1b3cec-980d-458c-9d2b-0c950d278f22/meta.json b/da1b3cec-980d-458c-9d2b-0c950d278f22/meta.json
deleted file mode 100644
index ee7c7b6..0000000
--- a/da1b3cec-980d-458c-9d2b-0c950d278f22/meta.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "uuid": "da1b3cec-980d-458c-9d2b-0c950d278f22",
- "slug": "domotique-les-vrais-problemes-en-domotique-zigbee-home-assistant",
- "title": "Domotique : les vrais problèmes en domotique Zigbee & Home Assistant",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2026-05-22 18:00:00",
- "created_at": "2026-05-22 18:00:00",
- "updated_at": "2025-05-01 06:11:58",
- "revisions": [],
- "cover": "cover.jpg",
- "category": "domotique"
-}
diff --git a/da406813-bf15-4f4e-a700-2752550224bb/index.md b/da406813-bf15-4f4e-a700-2752550224bb/index.md
deleted file mode 100644
index 128a24a..0000000
--- a/da406813-bf15-4f4e-a700-2752550224bb/index.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# Quand la 3G suffisait… et qu’on vous fait basculer
-
-Une plongée scientifique et technologique dans l’évolution des réseaux mobiles et la stratégie des opérateurs.
-
----
-
-## Introduction
-
-> En 2015, votre 3G suffisait pour le télétravail, la visioconférence et le streaming léger. Aujourd’hui, même pour un simple email, certaines zones semblent plus lentes qu’avant.
-
-L’histoire des télécommunications mobiles est jalonnée de révolutions techniques. Chaque génération de réseau – de la 2G à la 5G – a apporté des débits supérieurs, des latences réduites et de nouveaux usages. Pourtant, derrière la façade technologique, une stratégie commerciale se dessine : la **migration forcée** des utilisateurs vers les nouvelles générations. Ce dossier examine comment la 3G, la 4G et la 5G se succèdent, comment les opérateurs orchestrent le passage d’une technologie à l’autre, et quels impacts cela a sur l’expérience utilisateur.
-
----
-
-## La 3G : une technologie encore performante… bridée par les opérateurs
-
-### Définition et usages
-
-La 3G (UMTS/HSPA) a marqué un saut qualitatif par rapport à la 2G. Développée à la fin des années 1990 et déployée massivement à partir de 2004, elle permettait :
-
-* des débits théoriques de 384 kbit/s jusqu’à 42 Mbit/s pour les variantes HSPA+ ;
-* des applications comme le surf web, la messagerie instantanée, les appels VoIP et la visioconférence légère ;
-* une latence moyenne de 150–200 ms, suffisante pour la plupart des usages bureautiques.
-
-Pour l’utilisateur lambda, la 3G suffisait amplement. Pourtant, à partir de 2016–2017, certains opérateurs ont commencé à **réduire volontairement les performances**.
-
-### Exemple concret : Free Mobile
-
-Free Mobile, en itinérance sur le réseau Orange, a progressivement **bridé les débits 3G** :
-
-| Année | Débit descendant | Débit montant |
-| ----- | ---------------- | ------------- |
-| 2016 | ~5 Mbit/s | 0,5–1 Mbit/s |
-| 2017 | ~1 Mbit/s | 0,5 Mbit/s |
-| 2019 | 768 kbit/s | 384 kbit/s |
-| 2020 | 384 kbit/s | 384 kbit/s |
-
-> Source : [01net – Free Mobile et bridage 3G](https://www.01net.com/actualites/free-mobile-l-itinerance-3g-orange-sera-plus-lente-des-le-1er-janvier-avant-de-disparaitre-1833059.html)
-
-Les utilisateurs constatent alors que leur expérience, auparavant fluide, devient frustrante : ralentissement du web, vidéos qui ne se chargent pas correctement, visioconférences de qualité médiocre.
-
-### Pourquoi un bridage ?
-
-Le bridage de la 3G s’explique par plusieurs facteurs :
-
-1. **Refarming du spectre** : libérer les fréquences 900/1800/2100 MHz pour la 4G et la 5G ;
-2. **Coût d’entretien** : maintenir un réseau 3G coûteux pour des utilisateurs minoritaires n’est plus rentable ;
-3. **Incitation à migrer** : les abonnés passent naturellement aux nouvelles technologies pour profiter de meilleurs débits.
-
-**Schéma suggéré :** flux de données et coût par bit en 3G vs 4G.
-
----
-
-## La 4G : la révolution nécessaire
-
-### Définition technique
-
-La 4G, ou LTE (Long Term Evolution), est une avancée majeure :
-
-* Débits théoriques : 100 Mbit/s → 1 Gbit/s ;
-* Latence : 30–50 ms ;
-* Architecture optimisée : eNodeB remplace le contrôleur RNC de la 3G pour réduire les goulots d’étranglement ;
-* Utilisations : streaming HD, cloud computing, jeux en ligne, IoT.
-
-> La 4G a donc transformé l’expérience mobile et a rendu certaines limitations 3G plus visibles que jamais.
-
-### Stratégies de migration
-
-Les opérateurs incitent à la migration par :
-
-* le **bridage des anciennes générations** ;
-* la publicité sur les débits 4G/5G ;
-* le lancement de forfaits “4G-only”.
-
-| Opérateur | 3G moyen (Mbit/s) | 4G moyen (Mbit/s) |
-| --------- | ----------------- | ----------------- |
-| Free | 0,384 | 50–150 |
-| Orange | 0,5–1 | 60–200 |
-| SFR | 0,5 | 50–150 |
-| Bouygues | 0,5 | 50–150 |
-
-> Graphique suggéré : part des abonnés 4G vs 3G (2015–2025).
-
----
-
-## La 5G : promesse et réalité
-
-### Les promesses
-
-* Débits : 100 Mbit/s → 10 Gbit/s selon fréquence et densité d’antennes ;
-* Latence ultra faible : 1–10 ms ;
-* Fréquences : 700 MHz → 26 GHz (mmWave) ;
-* Usages : cloud gaming, véhicules autonomes, IoT à grande échelle.
-
-### L’expérience utilisateur
-
-Même scénario qu’avec la 3G : certaines zones restent en 4G bridée, incitant les utilisateurs à passer à la 5G. La promesse de la 5G ne se réalise pleinement que dans les zones très denses ou les zones pilotes.
-
-**Schéma suggéré :** architecture 4G vs 5G.
-
----
-
-## Conséquences pour l’utilisateur
-
-* **Scénarios pratiques :** visioconférence, streaming, cloud computing, IoT ;
-* **Expérience variable selon réseau :** frustration sur 3G bridée, fluidité sur 4G/5G ;
-* **Témoignages utilisateurs :** Reddit, forums français, témoignages directs.
-
-> “Dès qu’on tombe en 3G, rien ne charge correctement… le réseau est volontairement dégradé.” – Reddit
-
----
-
-## Synthèse scientifique
-
-| Génération | Débit théorique | Latence | Couverture | Usages possibles | Coût par bit | Bridage existant |
-| ---------- | ---------------------- | ---------- | ---------- | -------------------------------------- | ------------ | ---------------------- |
-| 3G | 384 kbit/s → 42 Mbit/s | 150–200 ms | Très large | Email, surf, visio légère | Élevé | Itinérance bridée Free |
-| 4G | 100 Mbit/s → 1 Gbit/s | 30–50 ms | Large | Streaming HD, jeux, cloud | Moyen | Bridage minoritaire |
-| 5G | 100 Mbit/s → 10 Gbit/s | 1–10 ms | Variable | IoT, cloud gaming, véhicules autonomes | Faible | Pas encore |
-
-> Le bridage apparaît comme une stratégie commerciale autant qu’une conséquence technique, visant à préparer l’utilisateur à migrer vers de nouvelles technologies.
-
----
-
-## Perspectives et conseils
-
-* Vérifier la couverture et la technologie disponible selon votre zone ;
-* Questionner son opérateur :
-
- 1. Suis-je sur le réseau propre ou en itinérance ?
- 2. Quels sont les débits effectifs en 3G et 4G ?
- 3. Quand la 3G sera-t-elle désactivée ?
-* Anticiper le passage à la 5G pour certains usages exigeants (IoT, cloud gaming, télétravail intensif).
-
-> Vous pouvez encore profiter de votre 3G… mais à quel prix ?
-
----
-
-## Références principales
-
-1. [01net – Free Mobile et bridage 3G](https://www.01net.com/actualites/free-mobile-l-itinerance-3g-orange-sera-plus-lente-des-le-1er-janvier-avant-de-disparaitre-1833059.html)
-2. [Univers Freebox – Bridage 3G](https://www.universfreebox.com/article/47917/Free-Mobile-continue-de-brider-l-itinerance-3G-Orange)
-3. [ARCEP – Gestion spectre et couverture](https://www.arcep.fr/)
-4. Free Mobile – Fiche information standardisée 2020 ([PDF](https://mobile.free.fr/docs/fis/Fiche_information_standardisee_2020-12-15.pdf))
diff --git a/da406813-bf15-4f4e-a700-2752550224bb/meta.json b/da406813-bf15-4f4e-a700-2752550224bb/meta.json
deleted file mode 100644
index 30de07b..0000000
--- a/da406813-bf15-4f4e-a700-2752550224bb/meta.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "uuid": "da406813-bf15-4f4e-a700-2752550224bb",
- "slug": "quand-la-3g-suffisait-et-qu-on-vous-fait-basculer",
- "title": "Quand la 3G suffisait… et qu’on vous fait basculer",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-05 08:38:25",
- "created_at": "2025-11-05 08:38:25",
- "updated_at": "2025-11-05 08:38:25",
- "revisions": [],
- "cover": "cover.jpg",
- "category": "télécom"
-}
diff --git a/ddb53aae-7214-4e3c-8af5-e42da60d8429/files/cover.jpg b/ddb53aae-7214-4e3c-8af5-e42da60d8429/files/cover.jpg
deleted file mode 100644
index 575fb91..0000000
Binary files a/ddb53aae-7214-4e3c-8af5-e42da60d8429/files/cover.jpg and /dev/null differ
diff --git a/ddb53aae-7214-4e3c-8af5-e42da60d8429/index.md b/ddb53aae-7214-4e3c-8af5-e42da60d8429/index.md
deleted file mode 100644
index 7b920bb..0000000
--- a/ddb53aae-7214-4e3c-8af5-e42da60d8429/index.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Kobo Elipsa 2E : le cahier A4 numérique qu'on attendait, à quelques détails près
-
-## Une liseuse qui n'en est plus tout à fait une
-
-Pendant longtemps, le marché des liseuses s'est tenu à une règle non écrite : une liseuse, c'est petit, c'est noir et blanc, c'est fait pour lire des romans dans le métro. Les tentatives de sortir de ce cadre — Sony DPT-RP1, Onyx Boox, ReMarkable — restaient soit confidentielles, soit positionnées comme des outils de prise de notes pure, sans véritable identité de liseuse. Avec l'**Elipsa 2E**, Kobo assume frontalement l'hybridation. Ce n'est pas une liseuse à laquelle on a ajouté un stylet ; c'est un objet pensé dès le départ comme un *cahier numérique qui sait aussi lire des livres*.
-
-L'engin est imposant. Écran E-Ink Carta 1200 de 10,3 pouces, résolution 1404 × 1872 pour 227 ppi, processeur dual-core 2 GHz et 32 Go de stockage. Côté tarif, TechRadar la situe autour de 399 dollars ou 349 livres, ce qui la place dans une catégorie où on n'achète plus sur un coup de tête : à ce prix, on attend un usage précis, pas un gadget de chevet.
-
-## Le format change tout
-
-Tenir l'Elipsa 2E pour la première fois, c'est comprendre instantanément à qui elle parle. À 10,3 pouces, on est très proche d'une feuille A5, voire d'un cahier d'étudiant — un format qui colle naturellement aux PDF et aux documents grand format. Et c'est là que tout se joue.
-
-Quiconque a déjà tenté de lire un PDF technique sur une liseuse 6 ou 7 pouces sait à quel point l'exercice est frustrant : on zoome, on déplace, on perd la mise en page, les schémas explosent en morceaux. Avec l'Elipsa 2E, un PDF A4 passe à l'écran à une taille parfaitement lisible, sans gymnastique. Les manuels techniques, les articles scientifiques, les supports de cours, les rapports d'entreprise : tout ce qui était pénible devient confortable. C'est moins spectaculaire que la couleur d'une Libra Colour, mais sur un usage professionnel ou étudiant intensif, le format change littéralement la nature de l'objet.
-
-## Le stylet, atout central — mais imparfait
-
-Le stylet est inclus dans la boîte. Détail qui n'a l'air de rien mais qui mérite d'être souligné, parce que l'usage prévu est clairement l'annotation directe sur les e-books et la prise de notes manuscrites. Pas de Kobo Stylus 2 à racheter en option, pas de configuration séparée : on déballe, on écrit.
-
-L'utilisation est exactement ce qu'on en attend. On peut surligner dans n'importe quel ePub, écrire dans la marge, créer des carnets vierges pour des notes manuscrites, dessiner des schémas à main levée. Tout ce qu'on griffonne reste dans le fichier, et — point essentiel — peut être ressorti ensuite. Le système prend en charge ePub, PDF, et accepte sans broncher les fichiers déposés par USB-C, Wi-Fi ou Bluetooth.
-
-Mais il faut être honnête : la sensation d'écriture n'est pas au niveau de ce que proposent les meilleurs concurrents. eWritable est même cinglant, qualifiant l'expérience tactile d'« horrible » et pointant le choix par Kobo du protocole Microsoft Pen Protocol (MPP 2.0) plutôt que la technologie Wacom qui équipe le ReMarkable 2 et reste la référence du secteur. Concrètement, qu'est-ce que ça veut dire ? Que la pointe glisse un peu trop sur le verre, qu'il manque cette résistance subtile qui fait penser au crayon sur papier, et qu'à très haute vitesse d'écriture la latence devient perceptible. Pour quelqu'un qui annote ses lectures, surligne, prend des notes ponctuelles, c'est largement suffisant. Pour quelqu'un qui veut remplacer son carnet Moleskine en cours magistral et écrire trois pages d'affilée à vitesse normale, ce sera frustrant.
-
-C'est une différence de positionnement, pas un défaut technique grave : l'Elipsa 2E est d'abord une liseuse qui annote, pas un cahier qui sait aussi lire.
-
-## L'export des annotations, ce qui fait vraiment la différence
-
-C'est probablement le point sur lequel Kobo creuse l'écart avec ses concurrents, et notamment avec le Kindle Scribe. Le manuel officiel explique qu'on peut exporter ses annotations sous forme de fichier .txt et le récupérer sur son ordinateur, mais en réalité l'écosystème va plus loin : les PDF annotés ressortent avec les annotations intégrées à la page, prêts à être imprimés ou partagés.
-
-Ce flux, en apparence banal, change tout pour qui travaille sérieusement avec ses lectures. Un étudiant peut annoter ses cours et imprimer la version surlignée pour les révisions. Un enseignant peut corriger des copies en PDF et renvoyer le fichier annoté à l'élève. Un consultant peut lire un rapport, le commenter en marge, le réintégrer dans sa documentation projet. Aucune annotation perdue, aucune resaisie. Là où Kindle Scribe limite encore largement l'export de ses annotations, Kobo joue le jeu de l'ouverture.
-
-## Le talon d'Achille : l'entrée des fichiers
-
-C'est ici que l'Elipsa 2E montre ses limites les plus tangibles, et il faut le savoir avant d'acheter. Contrairement à Kindle, il n'existe pas d'adresse e-mail officielle « envoyer à ma liseuse » : il faut transférer les fichiers manuellement, par USB ou via un service tiers comme Dropbox. Pour qui s'envoie régulièrement des articles ou des e-books depuis son ordinateur ou son téléphone, ce manque crée une vraie friction quotidienne.
-
-Les workarounds existent, à condition d'accepter de mettre un peu les mains dans le moteur. Un projet open source baptisé KoboMail propose un système d'envoi par e-mail pour certaines Kobo, et plus intéressant encore, un daemon Nextcloud-Kobo permet de synchroniser automatiquement un dossier Nextcloud via WebDAV vers la liseuse. C'est ouvert, c'est élégant, ça respecte le principe d'auto-hébergement — mais ce n'est pas du *plug and play*. Il faut un serveur Nextcloud opérationnel, savoir configurer une connexion WebDAV, et accepter que l'installation se fasse dans le dossier `/mnt/onboard/.adds/` du système Kobo. Bref, c'est superbe pour qui maîtrise déjà son infrastructure ; c'est rédhibitoire pour qui veut juste une solution clé en main.
-
-Sur ce point précis, Kobo et Amazon proposent deux philosophies opposées : le confort immédiat d'un écosystème fermé contre la liberté d'un écosystème ouvert mais exigeant. À vous de voir où vous vous situez.
-
-## Pour qui ce produit a-t-il du sens ?
-
-L'Elipsa 2E est faite pour vous si vous lisez beaucoup de documents grand format — PDF techniques, cours universitaires, rapports professionnels, partitions — et si l'idée d'annoter ces documents fait partie intégrante de votre flux de travail. Elle est faite pour vous si vous voulez un objet unique au lieu de jongler entre une liseuse classique et un cahier papier. Elle est faite pour vous, aussi, si vous avez déjà (ou êtes prêt à monter) un Nextcloud ou un Dropbox pour synchroniser vos fichiers proprement.
-
-Elle ne l'est pas si votre priorité est la prise de notes manuscrite intensive et fluide : sur ce terrain, un ReMarkable 2 ou un Supernote restent supérieurs. Elle ne l'est pas non plus si vous attendez le confort de l'envoi par e-mail à la Kindle, ou si l'idée d'installer un plugin communautaire pour combler un manque officiel vous donne de l'urticaire. Et elle est sans doute disproportionnée si vous lisez essentiellement des romans : à ce moment-là, une Clara BW à 150 € vous donnera plus de plaisir, dans un format de poche.
-
-## Mon avis
-
-L'Elipsa 2E est un produit ambitieux qui réussit l'essentiel et trébuche sur quelques détails finalement révélateurs. L'essentiel, c'est le format, la qualité de l'écran, l'export des annotations, l'ouverture du système et l'autonomie typique d'une liseuse — autant de raisons qui en font la meilleure proposition du marché pour un usage documentaire sérieux à ce niveau de prix.
-
-Les détails, ce sont le ressenti perfectible du stylet et l'absence d'un système d'entrée des fichiers digne de 2026. Kobo aurait pu intégrer nativement WebDAV — ça lui coûterait à peu près rien — et opter pour une dalle Wacom — ça lui coûterait plus cher mais lui ferait gagner une catégorie entière d'utilisateurs. À la place, on hérite d'un produit excellent à 80 %, et qui demande qu'on accepte ses zones grises sur les 20 % restants.
-
-Pour qui cherche un véritable cahier A4 numérique sans basculer dans une tablette Android Onyx — plus chère, plus complexe, et au confort de lecture moindre — l'Elipsa 2E reste, à mes yeux, le meilleur compromis du moment. Pas le produit parfait. Le meilleur compromis. Ce n'est pas la même chose, et c'est très bien aussi.
\ No newline at end of file
diff --git a/ddb53aae-7214-4e3c-8af5-e42da60d8429/meta.json b/ddb53aae-7214-4e3c-8af5-e42da60d8429/meta.json
deleted file mode 100644
index 7bc0e71..0000000
--- a/ddb53aae-7214-4e3c-8af5-e42da60d8429/meta.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "uuid": "ddb53aae-7214-4e3c-8af5-e42da60d8429",
- "slug": "kobo-elipsa-2e-le-cahier-a4-numerique-qu-on-attendait-a-quelques-details-pres",
- "title": "Kobo Elipsa 2E : le cahier A4 numérique qu'on attendait, à quelques détails près",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-09 12:07",
- "created_at": "2025-11-09 12:07:00",
- "updated_at": "2026-05-12 01:43:39",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-12 01:43:39",
- "comment": "",
- "title": "Kobo Elipsa 2E : le cahier A4 numérique qu'on attendait, à quelques détails près"
- }
- ],
- "cover": "cover.jpg",
- "files_meta": {
- "cover.jpg": {
- "author": "",
- "source_url": "https://fwd.nl/app/uploads/Kobo-Elipsa-2E-620x410.jpg"
- }
- },
- "external_links": [
- {
- "url": "https://fwd.nl/app/uploads/Kobo-Elipsa-2E-620x410.jpg",
- "name": "Kobo Eclipse",
- "added_at": "2026-05-12 01:42:43",
- "meta": {
- "mime": "image/jpeg",
- "size": 48877,
- "width": 620
- }
- }
- ],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "loisirs"
-}
diff --git a/ddb53aae-7214-4e3c-8af5-e42da60d8429/revisions/0001.md b/ddb53aae-7214-4e3c-8af5-e42da60d8429/revisions/0001.md
deleted file mode 100644
index 2dcf064..0000000
--- a/ddb53aae-7214-4e3c-8af5-e42da60d8429/revisions/0001.md
+++ /dev/null
@@ -1,49 +0,0 @@
-## Une liseuse qui n'en est plus tout à fait une
-
-Pendant longtemps, le marché des liseuses s'est tenu à une règle non écrite : une liseuse, c'est petit, c'est noir et blanc, c'est fait pour lire des romans dans le métro. Les tentatives de sortir de ce cadre — Sony DPT-RP1, Onyx Boox, ReMarkable — restaient soit confidentielles, soit positionnées comme des outils de prise de notes pure, sans véritable identité de liseuse. Avec l'**Elipsa 2E**, Kobo assume frontalement l'hybridation. Ce n'est pas une liseuse à laquelle on a ajouté un stylet ; c'est un objet pensé dès le départ comme un *cahier numérique qui sait aussi lire des livres*.
-
-L'engin est imposant. Écran E-Ink Carta 1200 de 10,3 pouces, résolution 1404 × 1872 pour 227 ppi, processeur dual-core 2 GHz et 32 Go de stockage. Côté tarif, TechRadar la situe autour de 399 dollars ou 349 livres, ce qui la place dans une catégorie où on n'achète plus sur un coup de tête : à ce prix, on attend un usage précis, pas un gadget de chevet.
-
-## Le format change tout
-
-Tenir l'Elipsa 2E pour la première fois, c'est comprendre instantanément à qui elle parle. À 10,3 pouces, on est très proche d'une feuille A5, voire d'un cahier d'étudiant — un format qui colle naturellement aux PDF et aux documents grand format. Et c'est là que tout se joue.
-
-Quiconque a déjà tenté de lire un PDF technique sur une liseuse 6 ou 7 pouces sait à quel point l'exercice est frustrant : on zoome, on déplace, on perd la mise en page, les schémas explosent en morceaux. Avec l'Elipsa 2E, un PDF A4 passe à l'écran à une taille parfaitement lisible, sans gymnastique. Les manuels techniques, les articles scientifiques, les supports de cours, les rapports d'entreprise : tout ce qui était pénible devient confortable. C'est moins spectaculaire que la couleur d'une Libra Colour, mais sur un usage professionnel ou étudiant intensif, le format change littéralement la nature de l'objet.
-
-## Le stylet, atout central — mais imparfait
-
-Le stylet est inclus dans la boîte. Détail qui n'a l'air de rien mais qui mérite d'être souligné, parce que l'usage prévu est clairement l'annotation directe sur les e-books et la prise de notes manuscrites. Pas de Kobo Stylus 2 à racheter en option, pas de configuration séparée : on déballe, on écrit.
-
-L'utilisation est exactement ce qu'on en attend. On peut surligner dans n'importe quel ePub, écrire dans la marge, créer des carnets vierges pour des notes manuscrites, dessiner des schémas à main levée. Tout ce qu'on griffonne reste dans le fichier, et — point essentiel — peut être ressorti ensuite. Le système prend en charge ePub, PDF, et accepte sans broncher les fichiers déposés par USB-C, Wi-Fi ou Bluetooth.
-
-Mais il faut être honnête : la sensation d'écriture n'est pas au niveau de ce que proposent les meilleurs concurrents. eWritable est même cinglant, qualifiant l'expérience tactile d'« horrible » et pointant le choix par Kobo du protocole Microsoft Pen Protocol (MPP 2.0) plutôt que la technologie Wacom qui équipe le ReMarkable 2 et reste la référence du secteur. Concrètement, qu'est-ce que ça veut dire ? Que la pointe glisse un peu trop sur le verre, qu'il manque cette résistance subtile qui fait penser au crayon sur papier, et qu'à très haute vitesse d'écriture la latence devient perceptible. Pour quelqu'un qui annote ses lectures, surligne, prend des notes ponctuelles, c'est largement suffisant. Pour quelqu'un qui veut remplacer son carnet Moleskine en cours magistral et écrire trois pages d'affilée à vitesse normale, ce sera frustrant.
-
-C'est une différence de positionnement, pas un défaut technique grave : l'Elipsa 2E est d'abord une liseuse qui annote, pas un cahier qui sait aussi lire.
-
-## L'export des annotations, ce qui fait vraiment la différence
-
-C'est probablement le point sur lequel Kobo creuse l'écart avec ses concurrents, et notamment avec le Kindle Scribe. Le manuel officiel explique qu'on peut exporter ses annotations sous forme de fichier .txt et le récupérer sur son ordinateur, mais en réalité l'écosystème va plus loin : les PDF annotés ressortent avec les annotations intégrées à la page, prêts à être imprimés ou partagés.
-
-Ce flux, en apparence banal, change tout pour qui travaille sérieusement avec ses lectures. Un étudiant peut annoter ses cours et imprimer la version surlignée pour les révisions. Un enseignant peut corriger des copies en PDF et renvoyer le fichier annoté à l'élève. Un consultant peut lire un rapport, le commenter en marge, le réintégrer dans sa documentation projet. Aucune annotation perdue, aucune resaisie. Là où Kindle Scribe limite encore largement l'export de ses annotations, Kobo joue le jeu de l'ouverture.
-
-## Le talon d'Achille : l'entrée des fichiers
-
-C'est ici que l'Elipsa 2E montre ses limites les plus tangibles, et il faut le savoir avant d'acheter. Contrairement à Kindle, il n'existe pas d'adresse e-mail officielle « envoyer à ma liseuse » : il faut transférer les fichiers manuellement, par USB ou via un service tiers comme Dropbox. Pour qui s'envoie régulièrement des articles ou des e-books depuis son ordinateur ou son téléphone, ce manque crée une vraie friction quotidienne.
-
-Les workarounds existent, à condition d'accepter de mettre un peu les mains dans le moteur. Un projet open source baptisé KoboMail propose un système d'envoi par e-mail pour certaines Kobo, et plus intéressant encore, un daemon Nextcloud-Kobo permet de synchroniser automatiquement un dossier Nextcloud via WebDAV vers la liseuse. C'est ouvert, c'est élégant, ça respecte le principe d'auto-hébergement — mais ce n'est pas du *plug and play*. Il faut un serveur Nextcloud opérationnel, savoir configurer une connexion WebDAV, et accepter que l'installation se fasse dans le dossier `/mnt/onboard/.adds/` du système Kobo. Bref, c'est superbe pour qui maîtrise déjà son infrastructure ; c'est rédhibitoire pour qui veut juste une solution clé en main.
-
-Sur ce point précis, Kobo et Amazon proposent deux philosophies opposées : le confort immédiat d'un écosystème fermé contre la liberté d'un écosystème ouvert mais exigeant. À vous de voir où vous vous situez.
-
-## Pour qui ce produit a-t-il du sens ?
-
-L'Elipsa 2E est faite pour vous si vous lisez beaucoup de documents grand format — PDF techniques, cours universitaires, rapports professionnels, partitions — et si l'idée d'annoter ces documents fait partie intégrante de votre flux de travail. Elle est faite pour vous si vous voulez un objet unique au lieu de jongler entre une liseuse classique et un cahier papier. Elle est faite pour vous, aussi, si vous avez déjà (ou êtes prêt à monter) un Nextcloud ou un Dropbox pour synchroniser vos fichiers proprement.
-
-Elle ne l'est pas si votre priorité est la prise de notes manuscrite intensive et fluide : sur ce terrain, un ReMarkable 2 ou un Supernote restent supérieurs. Elle ne l'est pas non plus si vous attendez le confort de l'envoi par e-mail à la Kindle, ou si l'idée d'installer un plugin communautaire pour combler un manque officiel vous donne de l'urticaire. Et elle est sans doute disproportionnée si vous lisez essentiellement des romans : à ce moment-là, une Clara BW à 150 € vous donnera plus de plaisir, dans un format de poche.
-
-## Mon avis
-
-L'Elipsa 2E est un produit ambitieux qui réussit l'essentiel et trébuche sur quelques détails finalement révélateurs. L'essentiel, c'est le format, la qualité de l'écran, l'export des annotations, l'ouverture du système et l'autonomie typique d'une liseuse — autant de raisons qui en font la meilleure proposition du marché pour un usage documentaire sérieux à ce niveau de prix.
-
-Les détails, ce sont le ressenti perfectible du stylet et l'absence d'un système d'entrée des fichiers digne de 2026. Kobo aurait pu intégrer nativement WebDAV — ça lui coûterait à peu près rien — et opter pour une dalle Wacom — ça lui coûterait plus cher mais lui ferait gagner une catégorie entière d'utilisateurs. À la place, on hérite d'un produit excellent à 80 %, et qui demande qu'on accepte ses zones grises sur les 20 % restants.
-
-Pour qui cherche un véritable cahier A4 numérique sans basculer dans une tablette Android Onyx — plus chère, plus complexe, et au confort de lecture moindre — l'Elipsa 2E reste, à mes yeux, le meilleur compromis du moment. Pas le produit parfait. Le meilleur compromis. Ce n'est pas la même chose, et c'est très bien aussi.
\ No newline at end of file
diff --git a/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/files/b116a3e7b4b54c5c-13369.svg b/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/files/b116a3e7b4b54c5c-13369.svg
deleted file mode 100644
index 6bdeaff..0000000
--- a/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/files/b116a3e7b4b54c5c-13369.svg
+++ /dev/null
@@ -1,206 +0,0 @@
-
-
diff --git a/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/index.md b/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/index.md
deleted file mode 100644
index f940b21..0000000
--- a/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/index.md
+++ /dev/null
@@ -1,253 +0,0 @@
-# Quand systemd remplace cron : pourquoi (et comment) migrer ses tâches planifiées
-
-*Cron tourne sur Linux depuis 1975. Il a fait son temps pour beaucoup d'usages : voici ce que les timers systemd apportent, et comment basculer sans tout casser.*
-
-## Pourquoi cron reste partout
-
-`cron` est l'un des plus anciens outils Unix encore en service. Son principe tient en deux idées : un démon qui se réveille toutes les minutes, et un fichier texte — la crontab — où chaque ligne décrit une commande et son moment d'exécution avec cinq champs (minute, heure, jour du mois, mois, jour de la semaine).
-
-```
-# m h dom mon dow command
-0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
-```
-
-Cinquante ans plus tard, ça marche. C'est installé partout, c'est documenté à mort, ça tient sur une ligne, et n'importe quel administrateur sait lire `0 2 * * *`. Pour beaucoup de besoins simples — « lancer ce script tous les jours à 2h du matin » — cron reste le bon choix.
-
-Le problème est que les besoins ont rarement été aussi simples depuis longtemps.
-
-## Les limites de cron qu'on finit toujours par rencontrer
-
-À chaque administration de serveur sérieuse, on retombe sur les mêmes frustrations.
-
-**La machine était éteinte au moment du job.** Cron saute purement et simplement l'occurrence ratée. Si le portable de l'utilisateur dormait à 2h, la sauvegarde quotidienne n'aura pas lieu — point. Le job s'exécutera de nouveau le lendemain à 2h, sans rattrapage, sans alerte.
-
-**Les logs sont dispersés ou perdus.** Par défaut, la sortie standard du job est envoyée par mail à l'utilisateur (si `MAILTO` est défini et qu'un MTA tourne) ou simplement perdue. Le démon lui-même logue dans syslog quand il *démarre* un job, mais pas son contenu. Diagnostiquer pourquoi un job a échoué la semaine dernière relève souvent de l'archéologie.
-
-**Pas de dépendances.** Un job qui doit attendre que le réseau soit monté, qu'un point de montage soit présent, qu'un autre service ait fini son démarrage : cron ne sait pas exprimer ça. La parade habituelle — un `sleep 60` ou un `@reboot` suivi d'une boucle d'attente — fonctionne mais reste un bricolage.
-
-**Pas de recouvrement entre exécutions.** Si un job de 5 minutes en prend 7 ce jour-là, cron lance la prochaine occurrence pile au moment où la précédente tourne encore. Deux instances simultanées d'un script de synchronisation, c'est rarement ce qu'on veut.
-
-**Pas de jitter, pas de randomisation.** Quand cinquante VMs lancent leur `cron.daily` toutes en même temps à 6h25 (l'heure d'anacron par défaut sur Debian), le pic de charge sur l'hyperviseur est garanti. Cron n'offre aucune primitive pour étaler les exécutions.
-
-**Pas de visibilité globale.** Pour répondre à « quels jobs vont tourner aujourd'hui sur cette machine ? », il faut lire la crontab système, les crontabs utilisateur (`/var/spool/cron/`), le contenu de `/etc/cron.d/`, `/etc/cron.daily/`, `/etc/cron.hourly/`, etc. Aucune commande ne donne la vue consolidée.
-
-**Pas d'isolation, pas de quota.** Le job s'exécute avec les privilèges et les ressources du shell qui l'a lancé. Aucune façon native de limiter à 50 % de CPU, à 1 Go de RAM, ou de couper si ça dépasse 10 minutes.
-
-Aucun de ces points ne rend cron inutilisable. Mais accumulés sur une dizaine de jobs critiques, ils transforment l'administration en travail de surveillance permanente.
-
-## Ce qu'apporte un timer systemd
-
-Sur toute distribution Linux moderne basée sur systemd (la quasi-totalité, hors BSD, Alpine, Gentoo et quelques cas particuliers), une alternative native existe : les **timers**. Le principe est différent dès le départ.
-
-Un timer systemd, c'est **deux fichiers** au lieu d'une ligne :
-
-- Un fichier `.service` qui décrit **ce qu'il faut faire** — exactement comme on décrit un service classique, en mode `Type=oneshot` pour un job ponctuel
-- Un fichier `.timer` qui décrit **quand le faire** — ce sont les règles de déclenchement
-
-Cette séparation entre le « quoi » et le « quand » est plus verbeuse au départ, mais elle débloque tout le reste.
-
-### Une syntaxe d'horaire lisible
-
-Là où cron oblige à mentaliser `0 2 * * 1-5`, systemd écrit :
-
-```ini
-OnCalendar=Mon..Fri 02:00:00
-```
-
-Et la commande `systemd-analyze calendar "Mon..Fri 02:00:00"` valide l'expression en montrant la prochaine exécution prévue. Une erreur de jour-de-semaine ou un décalage horaire ne plante pas en silence : on le voit avant de déployer.
-
-D'autres formes utiles que cron ne sait pas exprimer :
-
-```ini
-OnCalendar=*-*-* 02..04:00:00 # toutes les heures entre 2h et 4h
-OnCalendar=*-*-01 03:00:00 # tous les 1er du mois à 3h
-OnCalendar=*-*-* 09:00:00 Europe/Paris # à 9h heure de Paris, été comme hiver
-```
-
-Le support natif des fuseaux horaires est une avancée significative pour qui gère des serveurs distribués géographiquement — cron ignore tout du concept et tourne sur le fuseau du système.
-
-### Du temps relatif, pas seulement du temps absolu
-
-Cron raisonne uniquement en horloge murale (« tel jour, à telle heure »). systemd ajoute le **temps monotone**, relatif à un événement :
-
-```ini
-OnBootSec=10min # 10 minutes après le démarrage
-OnUnitActiveSec=6h # toutes les 6 heures après la dernière exécution
-OnStartupSec=5min # 5 minutes après le démarrage de systemd
-```
-
-`OnUnitActiveSec=6h` règle proprement le problème des exécutions qui se chevauchent : la prochaine instance se déclenche 6 heures **après la fin** de la précédente, pas 6 heures après son démarrage. Aucune équivalence simple en cron.
-
-### Le rattrapage des exécutions ratées
-
-Une seule ligne change tout :
-
-```ini
-Persistent=true
-```
-
-Avec cette option, systemd mémorise la dernière exécution réussie. Si la machine était éteinte au moment prévu, le job se déclenche dès le démarrage suivant (après le `RandomizedDelaySec` éventuel, voir plus bas). Pour un portable, un poste de développement, ou n'importe quelle machine qui n'est pas en service 24/7, c'est une différence majeure de fiabilité.
-
-### Du jitter intégré
-
-```ini
-RandomizedDelaySec=15min
-```
-
-Le déclenchement se fait à un instant aléatoire dans la fenêtre `[heure_prévue, heure_prévue + 15 min]`. Quand cinquante machines lancent leur mise à jour quotidienne, le pic de charge se lisse au lieu de tomber au même instant. C'est la fonctionnalité que tous les administrateurs de flottes finissent par re-bricoler en cron avec un `sleep $((RANDOM % 900))` peu élégant.
-
-### Le logging gratuit dans journald
-
-Tout ce que le service écrit sur stdout et stderr est capturé automatiquement par journald. Une seule commande pour tout consulter :
-
-```bash
-journalctl -u backup.service # toutes les exécutions historisées
-journalctl -u backup.service -f # en suivi temps réel
-journalctl -u backup.service --since yesterday
-```
-
-Pas de configuration, pas de redirection à la main, pas de `>> /var/log/backup.log 2>&1` à coller à chaque ligne de crontab. Et accessoirement, journald gère la rotation, la compression et la rétention.
-
-### Les dépendances déclaratives
-
-Dans le fichier `.service`, on peut dire au planificateur qu'un job nécessite que le réseau soit prêt, qu'un point de montage soit présent, qu'un autre service ait démarré :
-
-```ini
-[Unit]
-Wants=network-online.target
-After=network-online.target
-RequiresMountsFor=/mnt/backup
-```
-
-systemd attend que ces conditions soient remplies avant de déclencher le service. Le job ne tente plus de s'exécuter sur un montage absent ou avant que la résolution DNS soit fonctionnelle.
-
-### Le contrôle des ressources via cgroups
-
-Puisque chaque exécution passe par un service, on bénéficie de tout l'arsenal cgroups de systemd :
-
-```ini
-[Service]
-CPUQuota=50%
-MemoryMax=1G
-IOWeight=10
-```
-
-Un job de sauvegarde qui pourrait saturer le disque ne sortira pas de son enveloppe. Cron n'offre rien d'équivalent — au mieux on enrobe la commande dans `nice` et `ionice`, ce qui reste primitif.
-
-### La vue consolidée
-
-```bash
-systemctl list-timers --all
-```
-
-Une seule commande, toutes les exécutions planifiées du système, classées par prochaine échéance, avec date de dernière exécution. La question « qu'est-ce qui tourne automatiquement sur cette machine ? » trouve enfin une réponse en une ligne.
-
-## Un exemple complet, pas-à-pas
-
-Reprenons le job de sauvegarde initial — `0 2 * * * /usr/local/bin/backup.sh` — et traduisons-le.
-
-`/etc/systemd/system/backup.service` :
-
-```ini
-[Unit]
-Description=Sauvegarde quotidienne
-Wants=network-online.target
-After=network-online.target
-
-[Service]
-Type=oneshot
-User=backup
-Group=backup
-ExecStart=/usr/local/bin/backup.sh
-# Capture stdout/stderr dans journald (comportement par défaut, ici explicité)
-StandardOutput=journal
-StandardError=journal
-# Garde-fous ressources
-CPUQuota=50%
-MemoryMax=1G
-```
-
-`/etc/systemd/system/backup.timer` :
-
-```ini
-[Unit]
-Description=Déclenche la sauvegarde tous les jours à 2h
-
-[Timer]
-OnCalendar=*-*-* 02:00:00
-Persistent=true
-RandomizedDelaySec=15min
-
-[Install]
-WantedBy=timers.target
-```
-
-Activation :
-
-```bash
-sudo systemctl daemon-reload
-sudo systemctl enable --now backup.timer
-```
-
-Vérifications :
-
-```bash
-systemctl list-timers backup.timer
-systemctl status backup.timer
-systemd-analyze calendar "*-*-* 02:00:00" # voir la prochaine échéance
-journalctl -u backup.service # voir l'historique
-sudo systemctl start backup.service # déclencher manuellement pour tester
-```
-
-Comparé à la ligne de crontab originale, c'est plus verbeux. Mais on a, sans rien ajouter : le rattrapage en cas d'arrêt machine, du jitter pour éviter les pics, l'attente du réseau, des limites de ressources, du logging structuré, et une commande pour tout inspecter.
-
-## Quelques recettes utiles
-
-**Tous les jours à 3h sauf le dimanche** :
-
-```ini
-OnCalendar=Mon..Sat 03:00:00
-```
-
-**Toutes les 15 minutes pendant les heures de bureau** :
-
-```ini
-OnCalendar=Mon..Fri 08..18:00/15:00
-```
-
-**Le premier lundi de chaque mois à 5h** : pas faisable en une seule expression, mais combinable avec une condition `ExecStartPre` qui vérifie la date et sort si ce n'est pas le bon jour. C'est l'une des rares zones où cron reste plus naturel (`0 5 * * 1` + `[ $(date +\%d) -le 7 ]` dans le script).
-
-**Toutes les six heures à partir du dernier passage** (jamais de chevauchement) :
-
-```ini
-[Timer]
-OnBootSec=5min
-OnUnitActiveSec=6h
-```
-
-**Timer utilisateur, sans `sudo`** : dans `~/.config/systemd/user/`, puis :
-
-```bash
-systemctl --user daemon-reload
-systemctl --user enable --now monjob.timer
-loginctl enable-linger $USER # pour que ça tourne sans session ouverte
-```
-
-## Quand garder cron
-
-Tout n'est pas à migrer. Cron reste le bon choix dans plusieurs cas :
-
-- **Scripts portables vers BSD, macOS, ou des conteneurs minimaux**. systemd n'existe pas dans Alpine Linux, sur les BSD, ni dans la plupart des images Docker légères.
-- **Tâches utilisateur très simples sur un serveur partagé**, où chaque utilisateur gère sa propre crontab sans privilèges admin.
-- **Notification par mail intégrée** : si `MAILTO=admin@domain.tld` suivi d'une sortie sur stderr couvre déjà le besoin de monitoring, repasser par journald + un exporter Prometheus est de la sur-ingénierie.
-- **Un job de trente secondes à ajouter sur un serveur existant** déjà couvert par cron. Mélanger les deux outils est sans risque — ils coexistent sans interférence — et créer deux fichiers pour un alias unique d'une ligne reste excessif.
-
-La meilleure stratégie est rarement migratoire au pas de charge. Elle consiste à **utiliser systemd pour toute nouvelle tâche planifiée**, et à ne migrer les jobs cron existants que quand ils posent un problème concret : un job raté qu'il fallait rattraper, un log perdu qu'il fallait retrouver, un chevauchement qui a corrompu des données.
-
-## En résumé
-
-Cron n'est pas obsolète, il est sous-dimensionné pour des besoins modernes. Les timers systemd ne remplacent pas la simplicité d'une ligne de crontab pour un job trivial, mais ils apportent à peu près tout ce qui manque dès qu'une tâche planifiée devient critique : rattrapage, logging, dépendances, isolation, observabilité.
-
-Pour un DevOps qui construit aujourd'hui un nouveau service, le choix par défaut a basculé : commencer en systemd, et n'utiliser cron que par exception justifiée. La verbosité initiale des deux fichiers se rentabilise au premier incident de production qu'on diagnostique en `journalctl -u nom.service` au lieu de fouiller dans des logs disparates.
-
-Et même sans migrer quoi que ce soit, la commande `systemctl list-timers` mérite d'entrer dans le réflexe de tout audit de machine Linux. C'est là que se cache la moitié des tâches planifiées qu'on croit avoir comprises.
\ No newline at end of file
diff --git a/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/meta.json b/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/meta.json
deleted file mode 100644
index 6aac6ee..0000000
--- a/e1e8a0c1-6971-4357-9aaa-7e7a748922f3/meta.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "uuid": "e1e8a0c1-6971-4357-9aaa-7e7a748922f3",
- "slug": "quand-systemd-remplace-cron-pourquoi-et-comment-migrer-ses-taches-planifiees",
- "title": "Quand systemd remplace cron : pourquoi (et comment) migrer ses tâches planifiées",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2026-06-01 07:56",
- "created_at": "2026-05-12 13:57:29",
- "updated_at": "2026-05-12 13:58:58",
- "revisions": [],
- "cover": "",
- "files_meta": {
- "b116a3e7b4b54c5c-13369.svg": {
- "author": "Générée par IA our Cédrix",
- "source_url": ""
- }
- },
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "informatique"
-}
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_63b0e27c3950cfe1-993774.webp b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_63b0e27c3950cfe1-993774.webp
deleted file mode 100644
index 17836e5..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_63b0e27c3950cfe1-993774.webp and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_6dea6d617384f5ed-875.gif b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_6dea6d617384f5ed-875.gif
deleted file mode 100644
index e594837..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_6dea6d617384f5ed-875.gif and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_7df96bdf1ecebb75-124286.jpg b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_7df96bdf1ecebb75-124286.jpg
deleted file mode 100644
index 2a1cec7..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_7df96bdf1ecebb75-124286.jpg and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_bfd46debd51361c4-255309.jpg b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_bfd46debd51361c4-255309.jpg
deleted file mode 100644
index 5d0bd1b..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_bfd46debd51361c4-255309.jpg and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_c436b74420666bbb-3393394.png b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_c436b74420666bbb-3393394.png
deleted file mode 100644
index 5b2f512..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_c436b74420666bbb-3393394.png and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_e58b3803bdfafdf0-360838.png b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_e58b3803bdfafdf0-360838.png
deleted file mode 100644
index f3c9683..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/_thumb_e58b3803bdfafdf0-360838.png and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/cover.jpg b/e739bf3c-b380-4567-90aa-32da12f56bc5/files/cover.jpg
deleted file mode 100644
index dec1178..0000000
Binary files a/e739bf3c-b380-4567-90aa-32da12f56bc5/files/cover.jpg and /dev/null differ
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/index.md b/e739bf3c-b380-4567-90aa-32da12f56bc5/index.md
deleted file mode 100644
index 7de28b3..0000000
--- a/e739bf3c-b380-4567-90aa-32da12f56bc5/index.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# 50G-PON : la fibre optique du futur
-
-La fibre optique a déjà remplacé le cuivre dans la plupart des déploiements neufs, et les opérateurs ont passé la dernière décennie à généraliser le GPON puis le XGS-PON. Mais la course aux débits ne s'arrête pas là. La prochaine marche s'appelle le **50G-PON**, et elle est en train de passer du statut de standard sur le papier à celui de technologie qu'on commence à voir en démonstration chez les équipementiers. Voilà ce qu'il faut en retenir.
-
-## Ce que c'est
-
-Le 50G-PON est la dernière génération de réseau optique passif normalisée par l'ITU-T sous la référence **G.9804**. Comme ses prédécesseurs, il repose sur le principe d'une fibre unique partagée entre plusieurs abonnés via des splitters passifs — pas d'électronique active entre le central et le client. Ce qui change, c'est le débit : **50 Gbit/s symétriques** sur une seule longueur d'onde.
-
-Pour situer la techno dans sa famille :
-
-- **GPON** : 2,5 Gbit/s descendant / 1,25 Gbit/s montant — la base du déploiement résidentiel actuel
-- **XGS-PON** : 10 Gbit/s symétriques — la génération qui prend le relais aujourd'hui
-- **NG-PON2** : 40 Gbit/s, obtenus en agrégeant quatre canaux de 10 Gbit/s sur des longueurs d'onde différentes
-- **50G-PON** : 50 Gbit/s symétriques sur une longueur d'onde unique
-
-Le point intéressant, c'est précisément ce dernier détail. Là où NG-PON2 multipliait les canaux pour atteindre 40 Gbit/s — au prix d'une électronique plus complexe et plus chère — le 50G-PON tape les 50 Gbit/s sur **une seule porteuse**. C'est techniquement plus exigeant côté composants optiques, mais beaucoup plus simple à industrialiser et à exploiter.
-
-## Comment ça marche
-
-L'architecture reste celle du PON classique, ce qui est un choix volontaire pour garantir la coexistence avec les générations précédentes :
-
-```
-OLT (central) ──── fibre ──── [Splitter passif] ─┬─── ONT abonné 1
- ├─── ONT abonné 2
- └─── ONT abonné 3
-```
-
-- L'**OLT** (*Optical Line Terminal*), côté opérateur, pilote le réseau et émet le signal.
-- Les **splitters passifs** dupliquent le signal lumineux pour le distribuer, sans alimentation ni amplification.
-- L'**ONT** (*Optical Network Terminal*), chez l'abonné, fait la conversion optique-électrique.
-
-L'astuce du 50G-PON, c'est qu'il utilise **des longueurs d'onde différentes** de celles du GPON et du XGS-PON. Concrètement, les trois technologies peuvent **cohabiter sur la même fibre physique** : un opérateur peut continuer à servir ses abonnés GPON existants tout en branchant des nouveaux clients en XGS-PON ou en 50G-PON, sans retoucher l'infrastructure passive. C'est un point décisif pour le déploiement, parce qu'il évite la rupture de service et étale l'investissement.
-
-## Pourquoi ça compte
-
-À 50 Gbit/s symétriques, on n'est plus dans la logique du « plus de débit pour le particulier ». L'enjeu est ailleurs, et il est triple.
-
-D'abord, **les usages professionnels** qui tournent en limite sur XGS-PON. Sauvegarde cloud à l'échelle d'une entreprise, synchronisation inter-sites, stockage partagé, environnements de travail virtualisés : ces flux ont besoin de débit symétrique et constant, et 10 Gbit/s commencent à serrer dans certains contextes.
-
-Ensuite, le **transport pour le mobile**. Une antenne 5G — et a fortiori 6G — doit être raccordée au cœur de réseau par un lien capable d'encaisser le trafic agrégé de tous les utilisateurs qu'elle sert. C'est ce qu'on appelle le *fronthaul* ou le *backhaul* selon l'architecture. Le 50G-PON est un candidat sérieux pour ce rôle, parce qu'il offre les bons débits avec une infrastructure mutualisable et peu coûteuse à exploiter.
-
-Enfin, **l'évolutivité**. La même fibre, le même splitter, le même chemin physique pourront porter le 50G-PON aujourd'hui et la génération suivante — déjà en discussion à l'ITU-T sous le nom de 100G-PON — demain. C'est ce qui justifie qu'on déploie du 50G-PON même si tous les abonnés n'en ont pas l'usage immédiat : ce n'est pas l'équipement client qui coûte cher, c'est la fibre dans la rue, et elle est déjà là.
-
-## Ce qui freine encore
-
-Le 50G-PON existe, il est standardisé, et plusieurs équipementiers proposent du matériel compatible. Pour autant, le déploiement à grande échelle prendra du temps, pour quelques raisons concrètes.
-
-Le **coût des équipements** reste élevé. Les composants optiques capables de moduler proprement à 50 Gbit/s sur une seule porteuse sont à un stade industriel récent, et les volumes ne sont pas encore là pour faire baisser les prix. Pour la majorité des foyers, le XGS-PON couvre largement les besoins et coûte beaucoup moins cher.
-
-La **consommation énergétique** est plus importante que sur les générations précédentes. Ce n'est pas rédhibitoire, mais ça compte dans le bilan d'exploitation, surtout à l'échelle d'un opérateur.
-
-Enfin, **le marché n'est pas pressé**. Les box résidentielles actuelles n'exploiteraient même pas 10 Gbit/s symétriques, et les usages qui justifient le 50G-PON sont aujourd'hui concentrés sur des segments précis — entreprises, datacenters, opérateurs mobiles. Le déploiement va donc se faire par couches, en commençant par les zones où la demande existe vraiment.
-
-## En résumé
-
-| Technologie | Débit symétrique | Cible principale |
-|---|---|---|
-| GPON | 1 Gbit/s | Résidentiel actuel |
-| XGS-PON | 10 Gbit/s | Résidentiel haut de gamme, PME |
-| NG-PON2 | 40 Gbit/s (4 × 10) | Niche, peu déployé |
-| 50G-PON | 50 Gbit/s | Entreprises, datacenters, transport mobile |
-
-Le 50G-PON n'est pas la techno qui va arriver dans les box grand public dans les six mois. C'est la **brique d'infrastructure** qui prépare la décennie qui vient : celle qui permettra aux opérateurs de répondre à la fois aux besoins des entreprises, au raccordement des antennes mobiles de prochaine génération, et à la montée en puissance progressive du résidentiel — sans toucher à la fibre déjà tirée. Et c'est exactement ce qu'on attend d'une bonne infrastructure : qu'elle se mette en place sans bruit, et qu'elle dure.
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/meta.json b/e739bf3c-b380-4567-90aa-32da12f56bc5/meta.json
deleted file mode 100644
index 2d0f00c..0000000
--- a/e739bf3c-b380-4567-90aa-32da12f56bc5/meta.json
+++ /dev/null
@@ -1,150 +0,0 @@
-{
- "uuid": "e739bf3c-b380-4567-90aa-32da12f56bc5",
- "slug": "50g-pon-la-fibre-optique-du-futur",
- "title": "50G-PON : la fibre optique du futur",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-05 08:48",
- "created_at": "2025-11-05 08:48:01",
- "updated_at": "2026-05-11 23:54:38",
- "revisions": [
- {
- "n": 1,
- "date": "2026-05-11 23:54:38",
- "comment": "",
- "title": "50G-PON : la fibre optique du futur"
- }
- ],
- "cover": "cover.jpg",
- "files_meta": {
- "cover.jpg": {
- "author": "",
- "source_url": "https://www.zdnet.fr/wp-content/uploads/zdnet/2025/10/fibre-1125x615.jpg"
- },
- "_thumb_63b0e27c3950cfe1-993774.webp": {
- "author": "",
- "source_url": ""
- },
- "_thumb_6dea6d617384f5ed-875.gif": {
- "author": "",
- "source_url": ""
- },
- "_thumb_7df96bdf1ecebb75-124286.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_bfd46debd51361c4-255309.jpg": {
- "author": "",
- "source_url": ""
- },
- "_thumb_c436b74420666bbb-3393394.png": {
- "author": "",
- "source_url": ""
- },
- "_thumb_e58b3803bdfafdf0-360838.png": {
- "author": "",
- "source_url": ""
- }
- },
- "external_links": [
- {
- "url": "https://hellofuture.orange.com/fr/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/",
- "name": "50G-PON : Orange ouvre la voie à la Fibre du futur - Hello Future",
- "added_at": "2026-05-11 23:52:53",
- "meta": {
- "mime": "text/html",
- "size": 117887,
- "description": "Sur la standardisation de la triple coexistence de trois technologies PON Depuis 2006, Orange déploie la fibre jusqu’aux domiciles (FTTH-Fibre To The Home) et jusqu’aux entreprises (FTTE-Fibre To The Entreprise). Les réseaux d’accès fibre d’Orange reposent sur des infrastructures passives (fibres, câbles, connecteurs, boitiers etc.) et des systèmes de transmissions…",
- "og_image": "/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_bfd46debd51361c4-255309.jpg",
- "site_name": "Hello Future",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2024-06-25T10:27:25+01:00",
- "canonical": "https://hellofuture.orange.com/fr/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/"
- }
- },
- {
- "url": "https://www.universfreebox.com/article/587477/orange-teste-la-fibre-du-futur-avec-la-50g-pon-a-40-gbit-s-une-premiere-en-france",
- "name": "Orange teste la \"fibre du futur\" avec la 50G-PON à 40 Gbit/s, une première en France",
- "added_at": "2026-05-11 23:53:22",
- "author": "Lucas Musset",
- "meta": {
- "mime": "text/html",
- "size": 118235,
- "description": "Orange teste la technologie 50G-PON, une première en France pour la fibre très haut débit. Ce jeudi 23 octobre 2025, Orange a présenté à Lyon et Marseille une démonstration grandeur nature de la technologie 50G-PON, considérée comme la prochaine étape majeure dans l’évolution des réseaux fibre optique. Il s’agit, selon l’opérateur, d’une première en France. […]",
- "og_image": "/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_c436b74420666bbb-3393394.png",
- "site_name": "Univers Freebox",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2025-10-23T16:00:44+00:00",
- "canonical": "https://www.universfreebox.com/article/587477/orange-teste-la-fibre-du-futur-avec-la-50g-pon-a-40-gbit-s-une-premiere-en-france"
- }
- },
- {
- "url": "https://www.generation-nt.com/actualites/orange-50g-pon-fibre-ftth-debit-2064811",
- "name": "Fibre du futur : Orange teste du 50G-PON en conditions réelles",
- "added_at": "2026-05-11 23:53:33",
- "author": "Jérôme G.",
- "meta": {
- "mime": "text/html",
- "size": 109809,
- "description": "GNT est le portail Hi-Tech français consacré aux nouvelles technologies (internet, logiciel, matériel, mobilité, entreprise) et au jeu vidéo PC et consoles.",
- "keywords": "50g-pon orange fibre optique , orange, 50g, pon, fibre, ftth, debit",
- "og_image": "/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_63b0e27c3950cfe1-993774.webp",
- "site_name": "Génération NT",
- "og_type": "article",
- "language": "fr_FR",
- "canonical": "https://www.generation-nt.com/actualites/orange-50g-pon-fibre-ftth-debit-2064811"
- }
- },
- {
- "url": "https://www.zdnet.fr/actualites/orange-teste-la-fibre-optique-du-futur-jusqua-cinq-fois-plus-rapide-484095.htm",
- "name": "Orange teste la fibre optique du futur, jusqu’à cinq fois plus ra ...",
- "added_at": "2026-05-11 23:54:09",
- "author": "Xavier Biseul",
- "meta": {
- "mime": "text/html",
- "size": 236667,
- "description": "Dans ses laboratoires, l’opérateur historique mène des expérimentations sur la technologie 50G-PON. Ce nouveau standard des réseaux de fibre optique permet d’atteindre des débits théoriques allant jusqu’à 50 gigabits par seconde.",
- "og_image": "/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_7df96bdf1ecebb75-124286.jpg",
- "site_name": "ZDNET",
- "og_type": "article",
- "language": "fr_FR",
- "date": "2025-10-28T15:20:02+00:00",
- "canonical": "https://www.zdnet.fr/actualites/orange-teste-la-fibre-optique-du-futur-jusqua-cinq-fois-plus-rapide-484095.htm"
- }
- },
- {
- "url": "https://www.lyon-entreprises.com/actualites/article/orange-teste-a-lyon-la-fibre-du-futur-grace-a-la-technologie-50g-pon",
- "name": "Orange teste à Lyon la fibre du futur grâce à la technologie 50G-PON - Lyon Entreprises [LE]",
- "added_at": "2026-05-11 23:54:21",
- "meta": {
- "mime": "text/html",
- "size": 161762,
- "description": "Un article d'actualité LE [ Lyon-Entreprises ], le portail d'information sur les entreprises pour les décideurs de Lyon et Rhône-Alpes",
- "og_image": "/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_e58b3803bdfafdf0-360838.png",
- "site_name": "Lyon Entreprises [LE]",
- "og_type": "article",
- "language": "fr_FR",
- "canonical": "https://www.lyon-entreprises.com/actualites/article/orange-teste-a-lyon-la-fibre-du-futur-grace-a-la-technologie-50g-pon"
- }
- },
- {
- "url": "https://lafibre.info/orange-les-news/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/",
- "name": "50G-PON : Orange ouvre la voie à la Fibre du futur",
- "added_at": "2026-05-11 23:54:30",
- "meta": {
- "mime": "text/html",
- "size": 48608,
- "description": "50G-PON : Orange ouvre la voie à la Fibre du futur",
- "keywords": "Fibre optique,FTTH,très haut débit,Gpon,FTTLA,FTTdp,Test débit,SpeedTest",
- "canonical": "https://lafibre.info/orange-les-news/50g-pon-orange-ouvre-la-voie-a-la-fibre-du-futur/",
- "og_image": "/file?uuid=e739bf3c-b380-4567-90aa-32da12f56bc5&name=_thumb_6dea6d617384f5ed-875.gif"
- }
- }
- ],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "télécom"
-}
diff --git a/e739bf3c-b380-4567-90aa-32da12f56bc5/revisions/0001.md b/e739bf3c-b380-4567-90aa-32da12f56bc5/revisions/0001.md
deleted file mode 100644
index 36b7b23..0000000
--- a/e739bf3c-b380-4567-90aa-32da12f56bc5/revisions/0001.md
+++ /dev/null
@@ -1,61 +0,0 @@
-La fibre optique a déjà remplacé le cuivre dans la plupart des déploiements neufs, et les opérateurs ont passé la dernière décennie à généraliser le GPON puis le XGS-PON. Mais la course aux débits ne s'arrête pas là. La prochaine marche s'appelle le **50G-PON**, et elle est en train de passer du statut de standard sur le papier à celui de technologie qu'on commence à voir en démonstration chez les équipementiers. Voilà ce qu'il faut en retenir.
-
-## Ce que c'est
-
-Le 50G-PON est la dernière génération de réseau optique passif normalisée par l'ITU-T sous la référence **G.9804**. Comme ses prédécesseurs, il repose sur le principe d'une fibre unique partagée entre plusieurs abonnés via des splitters passifs — pas d'électronique active entre le central et le client. Ce qui change, c'est le débit : **50 Gbit/s symétriques** sur une seule longueur d'onde.
-
-Pour situer la techno dans sa famille :
-
-- **GPON** : 2,5 Gbit/s descendant / 1,25 Gbit/s montant — la base du déploiement résidentiel actuel
-- **XGS-PON** : 10 Gbit/s symétriques — la génération qui prend le relais aujourd'hui
-- **NG-PON2** : 40 Gbit/s, obtenus en agrégeant quatre canaux de 10 Gbit/s sur des longueurs d'onde différentes
-- **50G-PON** : 50 Gbit/s symétriques sur une longueur d'onde unique
-
-Le point intéressant, c'est précisément ce dernier détail. Là où NG-PON2 multipliait les canaux pour atteindre 40 Gbit/s — au prix d'une électronique plus complexe et plus chère — le 50G-PON tape les 50 Gbit/s sur **une seule porteuse**. C'est techniquement plus exigeant côté composants optiques, mais beaucoup plus simple à industrialiser et à exploiter.
-
-## Comment ça marche
-
-L'architecture reste celle du PON classique, ce qui est un choix volontaire pour garantir la coexistence avec les générations précédentes :
-
-```
-OLT (central) ──── fibre ──── [Splitter passif] ─┬─── ONT abonné 1
- ├─── ONT abonné 2
- └─── ONT abonné 3
-```
-
-- L'**OLT** (*Optical Line Terminal*), côté opérateur, pilote le réseau et émet le signal.
-- Les **splitters passifs** dupliquent le signal lumineux pour le distribuer, sans alimentation ni amplification.
-- L'**ONT** (*Optical Network Terminal*), chez l'abonné, fait la conversion optique-électrique.
-
-L'astuce du 50G-PON, c'est qu'il utilise **des longueurs d'onde différentes** de celles du GPON et du XGS-PON. Concrètement, les trois technologies peuvent **cohabiter sur la même fibre physique** : un opérateur peut continuer à servir ses abonnés GPON existants tout en branchant des nouveaux clients en XGS-PON ou en 50G-PON, sans retoucher l'infrastructure passive. C'est un point décisif pour le déploiement, parce qu'il évite la rupture de service et étale l'investissement.
-
-## Pourquoi ça compte
-
-À 50 Gbit/s symétriques, on n'est plus dans la logique du « plus de débit pour le particulier ». L'enjeu est ailleurs, et il est triple.
-
-D'abord, **les usages professionnels** qui tournent en limite sur XGS-PON. Sauvegarde cloud à l'échelle d'une entreprise, synchronisation inter-sites, stockage partagé, environnements de travail virtualisés : ces flux ont besoin de débit symétrique et constant, et 10 Gbit/s commencent à serrer dans certains contextes.
-
-Ensuite, le **transport pour le mobile**. Une antenne 5G — et a fortiori 6G — doit être raccordée au cœur de réseau par un lien capable d'encaisser le trafic agrégé de tous les utilisateurs qu'elle sert. C'est ce qu'on appelle le *fronthaul* ou le *backhaul* selon l'architecture. Le 50G-PON est un candidat sérieux pour ce rôle, parce qu'il offre les bons débits avec une infrastructure mutualisable et peu coûteuse à exploiter.
-
-Enfin, **l'évolutivité**. La même fibre, le même splitter, le même chemin physique pourront porter le 50G-PON aujourd'hui et la génération suivante — déjà en discussion à l'ITU-T sous le nom de 100G-PON — demain. C'est ce qui justifie qu'on déploie du 50G-PON même si tous les abonnés n'en ont pas l'usage immédiat : ce n'est pas l'équipement client qui coûte cher, c'est la fibre dans la rue, et elle est déjà là.
-
-## Ce qui freine encore
-
-Le 50G-PON existe, il est standardisé, et plusieurs équipementiers proposent du matériel compatible. Pour autant, le déploiement à grande échelle prendra du temps, pour quelques raisons concrètes.
-
-Le **coût des équipements** reste élevé. Les composants optiques capables de moduler proprement à 50 Gbit/s sur une seule porteuse sont à un stade industriel récent, et les volumes ne sont pas encore là pour faire baisser les prix. Pour la majorité des foyers, le XGS-PON couvre largement les besoins et coûte beaucoup moins cher.
-
-La **consommation énergétique** est plus importante que sur les générations précédentes. Ce n'est pas rédhibitoire, mais ça compte dans le bilan d'exploitation, surtout à l'échelle d'un opérateur.
-
-Enfin, **le marché n'est pas pressé**. Les box résidentielles actuelles n'exploiteraient même pas 10 Gbit/s symétriques, et les usages qui justifient le 50G-PON sont aujourd'hui concentrés sur des segments précis — entreprises, datacenters, opérateurs mobiles. Le déploiement va donc se faire par couches, en commençant par les zones où la demande existe vraiment.
-
-## En résumé
-
-| Technologie | Débit symétrique | Cible principale |
-|---|---|---|
-| GPON | 1 Gbit/s | Résidentiel actuel |
-| XGS-PON | 10 Gbit/s | Résidentiel haut de gamme, PME |
-| NG-PON2 | 40 Gbit/s (4 × 10) | Niche, peu déployé |
-| 50G-PON | 50 Gbit/s | Entreprises, datacenters, transport mobile |
-
-Le 50G-PON n'est pas la techno qui va arriver dans les box grand public dans les six mois. C'est la **brique d'infrastructure** qui prépare la décennie qui vient : celle qui permettra aux opérateurs de répondre à la fois aux besoins des entreprises, au raccordement des antennes mobiles de prochaine génération, et à la montée en puissance progressive du résidentiel — sans toucher à la fibre déjà tirée. Et c'est exactement ce qu'on attend d'une bonne infrastructure : qu'elle se mette en place sans bruit, et qu'elle dure.
diff --git a/e9adfdab-6246-411f-9953-91fcfcfb105f/files/20251119-075836.png b/e9adfdab-6246-411f-9953-91fcfcfb105f/files/20251119-075836.png
deleted file mode 100644
index b59b19f..0000000
Binary files a/e9adfdab-6246-411f-9953-91fcfcfb105f/files/20251119-075836.png and /dev/null differ
diff --git a/e9adfdab-6246-411f-9953-91fcfcfb105f/files/dummy.png b/e9adfdab-6246-411f-9953-91fcfcfb105f/files/dummy.png
deleted file mode 100644
index 58bb881..0000000
Binary files a/e9adfdab-6246-411f-9953-91fcfcfb105f/files/dummy.png and /dev/null differ
diff --git a/e9adfdab-6246-411f-9953-91fcfcfb105f/index.md b/e9adfdab-6246-411f-9953-91fcfcfb105f/index.md
deleted file mode 100644
index ee57050..0000000
--- a/e9adfdab-6246-411f-9953-91fcfcfb105f/index.md
+++ /dev/null
@@ -1,116 +0,0 @@
-# esp32
-
-
-
-## Choix de l’ESP32
-L’ESP32 constitue une alternative compacte et économique pour récupérer automatiquement les informations TIC d’un compteur électrique. Il présente plusieurs avantages :
-
-- **une connexion Wi-Fi intégrée**, permettant de communiquer facilement avec un serveur, une box domotique ou un service en ligne ;
-- **un espace de stockage interne (SPI Flash)** pour le firmware et les données nécessaires au fonctionnement ;
-- **une interface série (UART)** directement accessible sur les broches GPIO pour lire les trames issues du démodulateur ASK.
-
-L’utilisation d’un **démodulateur ASK** permet d’obtenir un signal numérique TTL immédiatement compatible avec l’entrée UART de l’ESP32, sans adaptation de niveau. Les broches les plus couramment utilisées pour la liaison série sont **GPIO16 (RX)** ou **RX0 (GPIO3)**, selon la configuration retenue.
-L’alimentation du module est assurée par la sortie **3,3 V** de l’ESP32, ce qui permet un câblage simple et propre.
-
-Grâce à son environnement logiciel flexible (Arduino, ESP-IDF, MicroPython…), l’ESP32 permet de mettre en place facilement des fonctions avancées : connexion Wi-Fi, envoi de données vers MQTT, interface Web locale, synchronisation NTP, journalisation, etc.
-
-## Câblage
-⚠️ **Attention : ne pas confondre 3V3, VIN et VCC/VDD (5 V)**
-
-Sur une carte ESP32 (dev board type WROOM / NodeMCU / UPesy / DOIT…), les tensions disponibles sont :
-
-### • 3V3 (3.3 V régulé)
-- C’est la sortie du régulateur embarqué.
-- Elle alimente le microcontrôleur ESP32 et ses GPIO.
-- **Toutes les entrées/sorties de l’ESP32 sont *strictement* en 3,3 V.**
-- **Le démodulateur ASK doit être alimenté ici.**
-
-### • VIN (ou 5V selon les cartes)
-- Entrée utilisée pour alimenter la carte en **5 V** (via USB ou alimentation externe).
-- Passera ensuite par le régulateur pour produire le **3,3 V interne**.
-- **NE PAS utiliser VIN pour alimenter le démodulateur ASK**.
-
-### • Pourquoi cette précision ?
-Parce que certains modules ou schémas utilisent la notation **VCC / VDD**, qui peut désigner tantôt 3,3 V, tantôt 5 V selon le fabricant.
-Sur l’ESP32, **la seule tension sûre pour alimenter un module logique est 3V3**.
-
-### Rappel important
-- Les GPIO de l’ESP32 **ne sont pas tolérants au 5 V**.
-- Injecter du 5 V sur RX0, GPIO3 ou tout autre GPIO risque de **détruire le microcontrôleur**.
-
-### Description du câblage
-
-
-Schéma de *câblage ESP32 générique* provenant du site
-
-L’ESP32 est connecté au **démodulateur ASK**, qui fournit un signal numérique TTL prêt à être lu par l’UART de l’ESP32.
-Le câblage est très simple : trois fils suffisent entre l’ESP32 et le module.
-
-Broches recommandées :
-
-- **3V3** – alimentation du démodulateur
-- **GND** – masse commune
-- **RX0 / GPIO3** entrée série utilisée pour lire les trames TIC)
-
-L’ESP32 ne transmet aucune commande au compteur : seule la ligne **RX** est nécessaire.
-Le démodulateur assure la conversion du signal modulé provenant du Linky vers un signal propre au format TTL.
-
----
-
-### Schéma de câblage (ASCII)
-```
-+-----------------------------+
-| Compteur Linky |
-| --- |
-| Sortie TIC (ASK) |
- +-------------+---------------+
-| |
-| --- |
-| Signal TIC modulé |
- v
- +-----------------------------+
-| Démodulateur ASK |
-| --- |
-| |
-| IN <---------------------+- TIC Data |
-| GND <---------------------+- TIC GND |
-| |
-| OUT ----------------------+------------------> RX0 / GPIO3 |
-| GND ----------------------+------------------> GND |
-| VCC <---------------------+------------------- 3V3 |
- +-----------------------------+
-
-```
- ╔═══════════════════════╗
- ║ ESP32 ║
- ║ Dev Board ║
- ╠═══════════════════════╣
- ║ 3V3 : alimentation ║
- ║ GND : masse ║
- ║ GPIO3 : RX0 (UART) ║
- ╚═══════════════════════╝
-```
-```
-
-## ESP Home
-
-La capture ci-dessus illustre un ESPHome fonctionnel, connecté à un compteur Linky, affichant les mesures électriques instantanées et les index de consommation. En parallèle, les logs temps réel confirment la bonne réception et l’envoi périodique des données.
-
-## Tasmota
-Pour récupérer et exploiter les informations du compteur électrique Linky, nous allons utiliser un logiciel tel que **Tasmota**. Tasmota est un firmware open-source pour microcontrôleurs ESP8266 et ESP32, conçu pour simplifier la gestion des objets connectés et la domotique.
-
-Grâce à Tasmota, il devient possible de :
-
-- **Lire directement les trames TIC** via l’entrée UART de l’ESP32, en utilisant un démodulateur ASK pour obtenir un signal numérique TTL propre.
-- **Transmettre les données** vers un serveur local ou en ligne, une box domotique ou un service cloud compatible MQTT ou HTTP.
-- **Configurer facilement le système** sans coder, grâce à son interface Web intuitive et ses nombreuses options de paramétrage pour les GPIO, UART et protocoles réseau.
-
-En utilisant Tasmota avec l’ESP32, nous transformons ce microcontrôleur en un **collecteur TIC intelligent**, capable de centraliser les informations énergétiques de manière autonome et de les rendre exploitables pour la domotique ou le suivi de consommation.
-## Installer Tasmota
-Brancher l'ESP32 sur l'ordinateur. Voir la page .
-
-Télécharger **Tasmota32** (`tasmota32.bin`) qui inclut les drivers nécessaires à la Téléinfo/TIC.
-
-Téléchargez-le ici : https:*ota.tasmota.com/tasmota32/release/
-
-Flasher Tasmota pour ESP32 avec espytool
\ No newline at end of file
diff --git a/e9adfdab-6246-411f-9953-91fcfcfb105f/meta.json b/e9adfdab-6246-411f-9953-91fcfcfb105f/meta.json
deleted file mode 100644
index 307ecf6..0000000
--- a/e9adfdab-6246-411f-9953-91fcfcfb105f/meta.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "uuid": "e9adfdab-6246-411f-9953-91fcfcfb105f",
- "slug": "esp32",
- "title": "esp32",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-29 06:31:50",
- "created_at": "2025-11-29 06:31:50",
- "updated_at": "2025-11-29 06:31:50",
- "revisions": [],
- "cover": "",
- "files_meta": [],
- "external_links": [],
- "seo_title": "",
- "seo_description": "",
- "og_image": "",
- "category": "Électronique"
-}
diff --git a/f008f509-2cad-437f-9850-7b39ec37262a/index.md b/f008f509-2cad-437f-9850-7b39ec37262a/index.md
deleted file mode 100644
index d1dfb7f..0000000
--- a/f008f509-2cad-437f-9850-7b39ec37262a/index.md
+++ /dev/null
@@ -1,223 +0,0 @@
-# gitea, l'installation
-
-Voici un guide pas à pas pour installer Gitea sur Debian 13 avec PostgreSQL comme base de données, et configurer un reverse-proxy (par ex. Traefik ou Nginx) pour servir Gitea.
-
----
-
-## 1. Pré-requis
-
-* Un serveur Debian 13 à jour.
-
- ```bash
- sudo apt update && sudo apt upgrade -y
- ```
-* Installer Git, et éventuellement d’autres dépendances.
-
- ```bash
- sudo apt install -y git ca-certificates
- ```
-* Un nom de domaine `git.abonnel.fr` pointant vers votre serveur (DNS A ou AAAA).
-* Assurez-vous que le port 80 et/ou 443 sont ouverts sur le serveur (pour le proxy).
-* Installer PostgreSQL.
-
----
-
-## 2. Installer PostgreSQL et créer base & utilisateur
-
-1. Installer PostgreSQL (Debian 13 inclut postgresql dans ses dépôts).
-
- ```bash
- sudo apt install -y postgresql postgresql-contrib
- ```
-2. Passer à l’utilisateur postgres et créer la base + utilisateur pour Gitea :
-
- ```bash
- sudo -i -u postgres
- psql
- CREATE DATABASE gitea WITH ENCODING 'UTF8' TEMPLATE template0;
- CREATE USER gitea WITH PASSWORD 'votre_mot_de_passe_sécurisé';
- GRANT ALL PRIVILEGES ON DATABASE gitea TO gitea;
- \q
- exit
- ```
-
- Ces commandes sont conformes à la documentation Gitea pour PostgreSQL. ([Gitea Documentation][1])
-3. Vérifier que PostgreSQL fonctionne :
-
- ```bash
- sudo systemctl status postgresql
- ```
-4. (Optionnel) Modifier le fichier `pg_hba.conf` si vous voulez autoriser certaines connexions supplémentaires (ex: accès réseau).
-
----
-
-## 3. Installer Gitea
-
-1. Créer un utilisateur système qui va exécuter Gitea :
-
- ```bash
- sudo adduser --system --shell /bin/bash --gecos 'Git Version Control' --group --disabled-password --home /home/git git
- ```
-
- ([Gitea Documentation][2])
-2. Créer les dossiers de travail :
-
- ```bash
- sudo mkdir -p /var/lib/gitea/{custom,data,log}
- sudo chown -R git:git /var/lib/gitea/
- sudo chmod -R 750 /var/lib/gitea/
- sudo mkdir /etc/gitea
- sudo chown root:git /etc/gitea
- sudo chmod 770 /etc/gitea
- ```
-
- ([Gitea Documentation][3])
-3. Télécharger le binaire Gitea :
-
- ```bash
- wget -O gitea https://dl.gitea.com/gitea/1.24.7/gitea-1.24.7-linux-amd64
- chmod +x gitea
- sudo mv gitea /usr/local/bin/gitea
- ```
-
- (Vérifiez la version la plus récente sur le site officiel) ([Gitea Documentation][2])
-4. Créer un fichier de service systemd pour Gitea. Exemple minimal (`/etc/systemd/system/gitea.service`) :
-
- ```ini
- [Unit]
- Description=Gitea (Git with a cup of tea)
- After=network.target postgresql.service
-
- [Service]
- User=git
- Group=git
- WorkingDirectory=/var/lib/gitea/
- ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
- Restart=always
- Environment=USER=git HOME=/var/lib/gitea GITEA_WORK_DIR=/var/lib/gitea
-
- [Install]
- WantedBy=multi-user.target
- ```
-
- Ensuite :
-
- ```bash
- sudo systemctl daemon-reload
- sudo systemctl enable --now gitea
- sudo systemctl status gitea
- ```
-
- ([Gitea Documentation][4])
-
----
-
-## 4. Configuration via l’interface web
-
-* Ouvrez [http://votre-serveur:3000](http://votre-serveur:3000) (ou le port que Gitea utilise) dans un navigateur.
-* Dans l’assistant d’installation, choisissez *PostgreSQL* comme type de base de données. Entrez :
-
- * Host : `localhost:5432` (ou l’IP/port selon)
- * Database : `gitea`
- * Username : `gitea`
- * Password : celui que vous avez défini
-* Dans le champ "Base URL", indiquez `https://git.abonnel.fr/` (ou http selon votre setup).
-* Complétez le reste (admin account, etc.).
- ([James R. S. Kemp Git][5])
-
----
-
-## 5. Configurer reverse-proxy pour `git.abonnel.fr`
-
-Si vous utilisez Nginx ou Traefik (ou un autre proxy) vous devez rediriger le domaine vers Gitea.
-
-### Exemple avec Nginx :
-
-```nginx
-server {
- listen 80;
- server_name git.abonnel.fr;
-
- # redirection vers HTTPS (si certbot/Let’s Encrypt)
- return 301 https://$host$request_uri;
-}
-
-server {
- listen 443 ssl;
- server_name git.abonnel.fr;
-
- ssl_certificate /etc/letsencrypt/live/git.abonnel.fr/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/git.abonnel.fr/privkey.pem;
-
- location / {
- proxy_pass http://127.0.0.1:3000;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-}
-```
-
-Cet exemple est inspiré des tutos d’installation Gitea + Nginx. ([James R. S. Kemp Git][5])
-Si vous utilisez un autre proxy (ex: Traefik ou « zoraxyproxy »), adaptez la configuration pour qu’il fasse passer `git.abonnel.fr` vers `localhost:3000` et gère SSL.
-
-### Activer HTTPS
-
-* Installez `certbot` ou utilisez votre gestionnaire de certificats.
-
- ```bash
- sudo apt install -y certbot python3-certbot-nginx
- sudo certbot --nginx -d git.abonnel.fr
- ```
-* Vérifiez que le certificat est actif et que `https://git.abonnel.fr` fonctionne.
-
----
-
-## 6. Configuration finale dans app.ini
-
-Après installation, vous pouvez ajuster `/etc/gitea/app.ini` (ou via l’interface). Exemples de réglages utiles :
-
-* Dans `[server]` :
-
- ```
- ROOT_URL = https://git.abonnel.fr/
- HTTP_PORT = 3000
- SSH_PORT = 22 # ou le port SSH que vous utilisez pour Git
- START_SSH_SERVER = false # si vous n’utilisez pas le serveur SSH interne
- DOMAIN = git.abonnel.fr
- ```
-* Dans `[database]` :
-
- ```
- DB_TYPE = postgres
- HOST = 127.0.0.1:5432
- NAME = gitea
- USER = gitea
- PASSWD = votre_mot_de_passe
- SSL_MODE = disable # ou require selon votre config
- ```
-* Redémarrez Gitea après modification :
-
- ```bash
- sudo systemctl restart gitea
- ```
-
----
-
-## 7. Sécuriser & entretien
-
-* Assurez-vous que seuls les ports nécessaires sont exposés (ex: 80/443 via proxy, 3000 en local si non exposé).
-* Faites des sauvegardes régulières : base PostgreSQL + dossier `/var/lib/gitea/data` (ou vos dépôts).
-* Vérifiez les logs de Gitea (souvent dans `/var/lib/gitea/log/`).
-* Gardez Gitea et PostgreSQL à jour.
-* Si vous utilisez SSH pour les repos Git, configurez correctement les clés SSH utilisateur et vérifiez que l’utilisateur `git` a bien les permissions.
-
----
-
-
-[1]: https://docs.gitea.com/enterprise/installation/linux?utm_source=chatgpt.com "Install on Linux | Gitea Enterprise Documentations"
-[2]: https://docs.gitea.com/installation/install-from-binary?utm_source=chatgpt.com "Installation from binary | Gitea Documentation"
-[3]: https://docs.gitea.com/1.18/installation/install-from-binary?utm_source=chatgpt.com "Installation from binary | Gitea Documentation"
-[4]: https://docs.gitea.com/1.20/category/installation?utm_source=chatgpt.com "Installation | Gitea Documentation"
-[5]: https://git.jamesrskemp.com/hosting/gitea.html?utm_source=chatgpt.com "Gitea - Git Commands by James Skemp"
diff --git a/f008f509-2cad-437f-9850-7b39ec37262a/meta.json b/f008f509-2cad-437f-9850-7b39ec37262a/meta.json
deleted file mode 100644
index 2d1f101..0000000
--- a/f008f509-2cad-437f-9850-7b39ec37262a/meta.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "uuid": "f008f509-2cad-437f-9850-7b39ec37262a",
- "slug": "gitea-l-installation",
- "title": "gitea, l'installation",
- "author": "cedric@abonnel.fr",
- "published": true,
- "published_at": "2025-11-07 11:01:57",
- "created_at": "2025-11-07 11:01:57",
- "updated_at": "2025-11-07 11:01:57",
- "revisions": [],
- "cover": "cover.jpg",
- "category": "informatique"
-}