<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>zatsit blog Blog</title>
        <link>https://blog.zatsit.fr/</link>
        <description>zatsit blog Blog</description>
        <lastBuildDate>Fri, 31 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>fr</language>
        <item>
            <title><![CDATA[Monter une équipe d'agents avec Claude Code]]></title>
            <link>https://blog.zatsit.fr/agent-squad</link>
            <guid>https://blog.zatsit.fr/agent-squad</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Comment transformer Claude Code en véritable squad produit : un agent par rôle (PO, PM, Tech Lead, Devs, QA, UI/UX), connecté à Figma et Linear via MCP, pour livrer une fonctionnalité de l'idée jusqu'au code testé, sans copier-coller de specs entre outils.]]></description>
            <content:encoded><![CDATA[<p>Comment transformer Claude Code en véritable squad produit : un agent par rôle (PO, PM, Tech Lead, Devs, QA, UI/UX), connecté à Figma et Linear via MCP, pour livrer une fonctionnalité de l'idée jusqu'au code testé, sans copier-coller de specs entre outils.</p>
<p><img decoding="async" loading="lazy" alt="Claude Agent Squad" src="https://blog.zatsit.fr/assets/images/agent-squad-f95e28c4f69ae9e9947e8362098ef6e6.webp" width="2400" height="1438" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Cet article s'appuie sur Claude Code, mais la logique s'applique à n'importe quel assistant IA, chaque chemin <code>.claude/agents</code>, peut être remplacé par la convention propre à votre outil.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="monter-une-équipe-dagents-avec-claude-code">Monter une équipe d'agents avec Claude Code<a href="https://blog.zatsit.fr/agent-squad#monter-une-%C3%A9quipe-dagents-avec-claude-code" class="hash-link" aria-label="Lien direct vers Monter une équipe d'agents avec Claude Code" title="Lien direct vers Monter une équipe d'agents avec Claude Code" translate="no">​</a></h2>
<p>Claude Code n'est plus seulement "un assistant qui code dans le terminal". Avec les <strong>subagents</strong>, les <strong>skills</strong>, les <strong>hooks</strong>, et les serveurs <strong>MCP</strong> (Model Context Protocol), on peut construire quelque chose qui ressemble à une vraie squad produit, sauf que chaque rôle est un agent spécialisé, avec son propre contexte, ses propres outils, et une mission bien définie.</p>
<p>J'ai fini par structurer une "équipe" de six agents (PO, PM, Tech Lead, Devs, Testeurs, UI/UX Designer) autour de Claude Code, connectée à <strong>Figma</strong> pour le design et <strong>Linear</strong> pour le ticketing. Pas parce que c'était le plan de départ : au début je n'avais qu'un seul agent générique, et je passais mon temps à lui répéter le contexte du projet à chaque nouvelle tâche.
Découper mes actions en rôles a réglé ça presque par hasard.
Je vous explique comment j'ai construit tout ça, et où ça coince encore.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="subagents-ou-agent-teams-">Subagents ou Agent Teams ?<a href="https://blog.zatsit.fr/agent-squad#subagents-ou-agent-teams-" class="hash-link" aria-label="Lien direct vers Subagents ou Agent Teams ?" title="Lien direct vers Subagents ou Agent Teams ?" translate="no">​</a></h2>
<p>Deux briques Claude Code rendent ça possible, et elles ne se valent pas pour tous les usages.</p>
<p>Les <strong>subagents</strong> sont des assistants spécialisés, définis en Markdown avec un frontmatter (nom, description, outils autorisés), stockés dans <code>.claude/agents/</code> (au niveau projet) ou <code>~/.claude/agents/</code> (au niveau utilisateur). Chaque subagent tourne dans sa propre fenêtre de contexte, avec un system prompt dédié et un accès aux outils restreint. Claude délègue automatiquement une tâche au subagent dont la description correspond, ou vous l'invoquez explicitement.</p>
<p>Les <strong>Agent Teams</strong>, plus récentes et encore en évolution rapide, proposent un modèle où plusieurs agents collaborent activement, se répartissent le travail et se débloquent mutuellement, un peu comme un sprint Scrum plutôt qu'un simple MapReduce de workers indépendants. J'ai testé, et honnêtement ce n'est pas encore le confort auquel on s'attend : les reprises de session sont fragiles et la consommation de tokens grimpe vite dès que plusieurs agents discutent entre eux.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p><a href="https://code.claude.com/docs/fr/agent-teams" target="_blank" rel="noopener noreferrer" class="">Documentation officielle des Agents Teams Claude</a></p></div></div>
<p><img decoding="async" loading="lazy" alt="Subagents vs Agent Teams" src="https://blog.zatsit.fr/assets/images/subagents-vs-agent-teams-dark-7679da9bb368303a96199c4598de29eb.webp" width="4245" height="1615" class="img_ev3q"></p>
<p>Pour une squad produit complète, l'analogie la plus juste reste : le PO/PM/Tech Lead orchestrent, les devs et testeurs exécutent en parallèle.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p>Commencez avec de simples <strong>sous-agents</strong>, c'est plus simple et plus stable. Ne migrez vers les Agent Teams que si le travail exige vraiment des échanges continus entre agents en cours de tâche.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="définir-les-rôles">Définir les rôles<a href="https://blog.zatsit.fr/agent-squad#d%C3%A9finir-les-r%C3%B4les" class="hash-link" aria-label="Lien direct vers Définir les rôles" title="Lien direct vers Définir les rôles" translate="no">​</a></h2>
<p>Chaque rôle devient un fichier <code>.claude/agents/&lt;role&gt;.md</code> avec un frontmatter qui déclare</p>
<ul>
<li class=""><code>name</code> : l'identifiant de l'agent</li>
<li class=""><code>description</code> : ce qui déclenche sa délégation automatique</li>
<li class="">et <code>tools</code>/<code>disallowedTools</code> : les outils qu'il a le droit d'utiliser (Un PO ne devrait pas avoir accès à <code>Write</code>/<code>Edit</code> sur le code, un dev n'a pas forcément besoin d'écrire dans Linear directement, etc).</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p><a href="https://code.claude.com/docs/fr/sub-agents" target="_blank" rel="noopener noreferrer" class="">Documentation officielle des sous-agents</a></p></div></div>
<p>Ce qui donne dans notre contexte :</p>
<p><strong>Product Manager</strong> (<code>pm.md</code>) : porte la vision produit, arbitre les priorités, découpe en épics/releases, garde la cohérence globale. Accès Linear (projets, roadmap), lecture Figma.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> pm</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Porte la vision produit</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> arbitre les priorités</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> découpe un besoin en épics. À invoquer pour tout cadrage produit de haut niveau.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Read</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Grep</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Glob</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__linear</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es le Product Manager de l'équipe. Pour chaque besoin reçu :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Vérifie qu'il s'inscrit dans la roadmap produit.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Formalise le besoin en épic, avec son objectif métier.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Cherche dans Linear un projet existant correspondant avant d'en créer un. Réutilise-le si trouvé, crée-le sinon.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span></code></pre></div></div>
<p><strong>Product Owner</strong> (<code>po.md</code>) : traduit un besoin métier en user stories priorisées, avec critères d'acceptation clairs. Accès Linear en lecture/écriture, pas d'accès au code.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> po</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Traduit un besoin métier en user stories priorisées avec critères d'acceptation. À invoquer pour tout découpage fonctionnel.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Read</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Grep</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Glob</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__linear</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es le Product Owner de l'équipe. Pour chaque besoin reçu :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Rédige des user stories au format "En tant que... je veux... afin de...".</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Ajoute des critères d'acceptation clairs et testables pour chacune.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Priorise les stories (must-have / should-have / nice-to-have).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span></code></pre></div></div>
<p><strong>Tech Lead</strong> (<code>tech-lead.md</code>) : traduit les stories en tâches techniques, définit l'architecture, fait les choix techniques (Vue 3/TS, structure des composants, conventions), reviewe le travail des devs. Accès lecture/écriture code, Linear, Figma (design system, variables).</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> tech</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">-</span><span class="token front-matter-block front-matter yaml language-yaml">lead</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Traduit les user stories Linear en tâches techniques</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> définit l'architecture</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> review le code des devs. À invoquer pour toute décision d'architecture ou de découpage technique.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Read</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Grep</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Glob</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Bash</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Edit</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Write</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__figma</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__linear</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es le Tech Lead de l'équipe. Stack : Vue 3 + TypeScript (front), Node.js (back).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Avant toute implémentation, tu dois :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Lire le ticket Linear associé et ses critères d'acceptation.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Traiter les détails de design (couleurs, positions, composants) déjà écrits par l'agent UI/UX comme la source de vérité design, et n'ouvrir Figma toi-même que pour les contraintes techniques/responsive non couvertes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Découper la story en tâches techniques atomiques, une par composant/endpoint.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> Chercher dans Linear une sous-tâche existante correspondante avant d'en créer une.</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p>Pour pousser ce Tech Lead vers plus de spécialisation (conventions Vue 3/TypeScript, patterns Node.js, bonnes pratiques...), passez par des <strong>skills</strong> dédiés plutôt que par un prompt system toujours plus long.
Créez un skill par convention/stack, puis référencez-le dans le frontmatter de l'agent (champ <code>skills</code>). Le Tech Lead les charge à la demande, sans alourdir son contexte.</p></div></div>
<p><strong>Devs</strong> (<code>dev-frontend.md</code>, <code>dev-backend.md</code>) : implémentent les tâches assignées, en s'appuyant sur le contexte Figma (composants, tokens) et les specs Linear. Accès code complet, Figma en lecture, Linear pour mettre à jour le statut des tickets.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> dev</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">-</span><span class="token front-matter-block front-matter yaml language-yaml">frontend</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Implémente les tâches frontend assignées par le Tech Lead (Vue 3 + TypeScript). À invoquer pour toute tâche de composant UI.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Read</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Grep</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Glob</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Bash</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Edit</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Write</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__linear</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es développeur frontend. Stack : Vue 3, TypeScript.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Pour chaque tâche reçue :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Passe le ticket Linear en "In Progress" avant de commencer.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Lis le contexte Linear associé, y compris les détails de design propagés par le Tech Lead depuis l'agent UI/UX.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Implémente le composant en respectant les design tokens (pas de couleur en dur).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> Une fois terminé, passe le ticket en "In Review".</span><br></span></code></pre></div></div>
<p><strong>Testeurs</strong> (<code>qa.md</code>) : écrivent et exécutent les tests (unitaires, e2e), valident les critères d'acceptation de la story, ouvrent des tickets de bug dans Linear si un écart est détecté. Accès code (lecture + tests), exécution de commandes (Bash), Linear.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> qa</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Écrit et exécute les tests</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> valide les critères d'acceptation d'une story</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> ouvre des bugs Linear si besoin. À invoquer pour toute validation de story.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Read</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Grep</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Glob</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Bash</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Edit</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__linear</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es le QA de l'équipe. Pour chaque story à valider :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Relis les critères d'acceptation du ticket Linear.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Écris les tests correspondants (unitaires et/ou e2e).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Exécute-les.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> En cas d'écart, ouvre un ticket de bug Linear avec une reproduction détaillée, taggé selon la zone concernée (</span><span class="token code-snippet code keyword" style="color:#00009f">`Frontend`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00009f">`Backend`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00009f">`Database`</span><span class="token plain">, ...).</span><br></span></code></pre></div></div>
<p><strong>UI/UX Designer</strong> (<code>ui-ux.md</code>) : c'est le rôle le plus particulier, puisque Claude Code ne dessine pas dans Figma à votre place de façon autonome. Mais avec le serveur MCP Figma, il peut lire les maquettes, extraire les composants/variables/design tokens, et même écrire sur le canvas (créer/mettre à jour des frames, composants, styles).</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> ui</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">-</span><span class="token front-matter-block front-matter yaml language-yaml">ux</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Extrait le contexte design Figma (composants</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> couleurs</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> positions</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> variables) d'une story</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> et écrit les détails d'implémentation frontend dans les tickets Linear. À invoquer pour tout besoin de contexte design.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Read</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Grep</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Glob</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Edit</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Write</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__figma</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> mcp__linear</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es l'UI/UX Designer de l'équipe. Le design de référence est le fichier Figma fourni pour ce projet. Pour chaque story reçue :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Extrais du design Figma les composants, couleurs, positions et variables pertinents pour la story.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Écris ces détails dans le ticket Linear correspondant sous un format structuré fixe, un bloc par composant.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Capture une image de la frame Figma concernée et attache-la au même ticket Linear.</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p>Depuis l'arrivée de <strong>Claude Design</strong>, ce rôle peut aussi s'appuyer directement sur ce produit plutôt que de tout faire passer par Figma. Claude Design génère prototypes, wireframes et maquettes en langage naturel. Le pont design ↔ code devient plus court, sans repasser systématiquement par un aller-retour Figma.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="connecter-les-outils-externes-via-mcp">Connecter les outils externes via MCP<a href="https://blog.zatsit.fr/agent-squad#connecter-les-outils-externes-via-mcp" class="hash-link" aria-label="Lien direct vers Connecter les outils externes via MCP" title="Lien direct vers Connecter les outils externes via MCP" translate="no">​</a></h2>
<p>C'est la brique qui transforme cette équipe d'agents en véritable pipeline produit : sans MCP, vos agents "discutent" du produit ; avec MCP, ils lisent et écrivent dans vos vrais outils.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>remarque</div><div class="admonitionContent_BuS1"><p>Si le protocole vous semble encore flou, la <a href="https://modelcontextprotocol.io/introduction" target="_blank" rel="noopener noreferrer" class="">spec officielle MCP</a> vaut le détour, tout comme la <a href="https://docs.claude.com/fr/docs/claude-code/mcp" target="_blank" rel="noopener noreferrer" class="">doc MCP de Claude Code</a> pour la partie configuration côté CLI.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="figma">Figma<a href="https://blog.zatsit.fr/agent-squad#figma" class="hash-link" aria-label="Lien direct vers Figma" title="Lien direct vers Figma" translate="no">​</a></h3>
<p>Figma propose un serveur MCP en deux versions : une version distante (recommandée, la plus complète, hébergée par Figma) et une version desktop, réservée à des cas d'usage entreprise spécifiques, qui nécessite l'app Figma ouverte en local.</p>
<p>Pour la version distante, dans Claude Code :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">claude mcp add --transport http figma https://mcp.figma.com/mcp</span><br></span></code></pre></div></div>
<p>Puis dans une session Claude Code, tapez <code>/mcp</code>, sélectionnez <code>figma</code>, <code>Authenticate</code>, et autorisez l'accès dans le navigateur.</p>
<p>Une fois connecté, vos agents peuvent extraire le contexte d'un frame ou d'une sélection (composants, variables, layout, contenu FigJam), générer du code aligné avec vos composants réels grâce à Code Connect, ou encore écrire directement sur le canvas Figma. C'est pratique pour que le Tech Lead ou le designer synchronisent un prototype codé vers Figma pour revue d'équipe.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>remarque</div><div class="admonitionContent_BuS1"><p>Le mode de référence le plus fiable reste le lien Figma (clic droit sur un frame → "Copy link to selection") passé dans le prompt, plutôt que de compter sur la sélection en direct dans l'app, qui décroche plus souvent qu'on ne le voudrait.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="linear">Linear<a href="https://blog.zatsit.fr/agent-squad#linear" class="hash-link" aria-label="Lien direct vers Linear" title="Lien direct vers Linear" translate="no">​</a></h3>
<p>Linear propose également un serveur MCP officiel, hébergé, avec authentification OAuth, donc pas de token à gérer manuellement :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">claude mcp add --transport http linear https://mcp.linear.app/mcp</span><br></span></code></pre></div></div>
<p>Puis <code>/mcp</code> dans Claude Code pour déclencher le flow OAuth.</p>
<p>Une fois connecté, vos agents PO/PM/Dev/QA peuvent chercher des tickets, en créer, changer leur statut, commenter, lier des PR, le tout en langage naturel :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">"Lis le ticket ENG-142, implémente le correctif, puis passe le ticket en</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">'In Review' et commente avec la liste des fichiers modifiés."</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p>Linear n'a rien d'obligatoire ici : le même workflow fonctionne avec n'importe quel outil de ticketing proposant un serveur MCP ou un CLI (Jira, GitHub Issues, Azure DevOps, etc.). Le principe reste identique, seul le serveur connecté change.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="la-facture-quon-ne-voit-pas-venir">La facture qu'on ne voit pas venir<a href="https://blog.zatsit.fr/agent-squad#la-facture-quon-ne-voit-pas-venir" class="hash-link" aria-label="Lien direct vers La facture qu'on ne voit pas venir" title="Lien direct vers La facture qu'on ne voit pas venir" translate="no">​</a></h3>
<p>C'est le point qu'on oublie facilement en montant ce genre de squad : chaque serveur MCP connecté injecte la définition de tous ses outils dans le contexte, à chaque tour de conversation, pour chaque agent qui y a accès. Avec Figma, Linear et éventuellement un troisième serveur branchés sur six agents, la facture en tokens grimpe vite, et le modèle met plus de temps à choisir le bon outil quand la liste s'allonge. Je l'ai découvert en connectant tous les serveurs à tous les agents "au cas où", avant de me rendre compte que ça ralentissait tout sans bénéfice réel.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>attention</div><div class="admonitionContent_BuS1"><p>Plus vous connectez de serveurs MCP, plus le coût en tokens et la latence de sélection d'outil augmentent, même sans qu'aucun outil ne soit jamais appelé. La simple présence d'un serveur dans le contexte d'un agent a un coût, connecté ou non à une tâche en cours.</p></div></div>
<p>Concrètement : ne connectez un serveur qu'aux agents qui en ont vraiment besoin (un QA n'a rien à faire avec Figma), préférez les versions distantes aux versions locales, et coupez les serveurs inutilisés en cours de session avec /mcp plutôt que de tout laisser tourner en permanence.</p>
<p>Sur le quand et le comment : connectez-vous au moment où l'agent a réellement besoin de lire ou d'écrire dans l'outil externe, pas par réflexe en début de session. Utilisez <code>claude mcp add</code> avec le scope le plus restreint possible (par projet plutôt que global), et privilégiez l'authentification OAuth quand le serveur la propose, plutôt qu'un token statique qui traînera dans une config quelque part.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="le-workflow-de-a-à-z">Le workflow de A à Z<a href="https://blog.zatsit.fr/agent-squad#le-workflow-de-a-%C3%A0-z" class="hash-link" aria-label="Lien direct vers Le workflow de A à Z" title="Lien direct vers Le workflow de A à Z" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Le workflow de bout en bout" src="https://blog.zatsit.fr/assets/images/05-workflow-22d180612cdcce10289f9c9c79830530.webp" width="2400" height="874" class="img_ev3q"></p>
<p>Voici le déroulé typique pour livrer une fonctionnalité, de l'idée au code testé.</p>
<p><strong>Le PM</strong> décrit le besoin en langage naturel ; l'agent PM le formule en epic, vérifie qu'il rentre dans la roadmap, et crée le projet Linear correspondant.</p>
<p><strong>L'agent PO</strong> prend le relais pour transformer l'epic en user stories avec critères d'acceptation, les priorise, et les pousse dans Linear.</p>
<p><strong>L'agent UI/UX</strong> entre en jeu si un design existe déjà dans Figma : il extrait les composants et variables pertinents pour la story et les rattache au ticket. S'il faut prototyper, il peut générer un premier jet de composant codé puis l'envoyer vers Figma comme point de départ de discussion.</p>
<p><strong>Le Tech Lead</strong> lit la story Linear et le contexte Figma, définit l'architecture des composants/endpoints, et découpe le tout en tâches techniques assignées aux subagents devs.</p>
<p>Chaque <strong>agent dev</strong> récupère sa tâche, lit le contexte Figma et Linear, implémente, ouvre une PR, et met à jour le statut du ticket.</p>
<p><strong>L'agent QA</strong> écrit les tests correspondant aux critères d'acceptation, les exécute, et soit valide le ticket soit ouvre un ticket de bug avec repro détaillée.</p>
<p><strong>Le Tech Lead</strong> fait une dernière passe de review avant merge, en vérifiant la cohérence avec le design system via Code Connect.</p>
<p>Ce découpage en rôles évite l'écueil classique du "un seul agent qui fait tout dans une seule conversation énorme" : chaque étape tourne dans un contexte propre, ce qui limite la pollution de contexte et améliore la qualité de chaque décision.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="claudemd--la-colonne-vertébrale-partagée">CLAUDE.md : la colonne vertébrale partagée<a href="https://blog.zatsit.fr/agent-squad#claudemd--la-colonne-vert%C3%A9brale-partag%C3%A9e" class="hash-link" aria-label="Lien direct vers CLAUDE.md : la colonne vertébrale partagée" title="Lien direct vers CLAUDE.md : la colonne vertébrale partagée" translate="no">​</a></h2>
<p>Tous les agents doivent partager un socle commun de règles projet, posé dans un fichier <code>CLAUDE.md</code> à la racine (la <a href="https://docs.claude.com/fr/docs/claude-code/memory" target="_blank" rel="noopener noreferrer" class="">doc officielle sur la mémoire de Claude Code</a> détaille bien le mécanisme). L'équivalent générique porté par <a href="https://agents.md/" target="_blank" rel="noopener noreferrer" class="">AGENTS.md</a> remplit le même rôle :</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> Projet : [nom de l'app]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Stack</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Frontend : Vue 3 + TypeScript</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Backend : Node.js</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Design system : Figma (fichier X, lien Y)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ticketing : Linear (équipe "Product")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Règles</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Toute implémentation doit être rattachée à un ticket Linear.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Ne jamais merger sans review du Tech Lead.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Respecter les tokens de design extraits de Figma (pas de couleurs en dur).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Écrire un test pour chaque nouveau composant/endpoint.</span><br></span></code></pre></div></div>
<p>Ce fichier est lu par tous les agents en début de session : c'est ce qui garantit la cohérence entre le PO qui écrit une story, le dev qui l'implémente, et le testeur qui la valide.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="un-agent-chef-dorchestre-pour-lancer-tout-le-workflow">Un agent chef d'orchestre pour lancer tout le workflow<a href="https://blog.zatsit.fr/agent-squad#un-agent-chef-dorchestre-pour-lancer-tout-le-workflow" class="hash-link" aria-label="Lien direct vers Un agent chef d'orchestre pour lancer tout le workflow" title="Lien direct vers Un agent chef d'orchestre pour lancer tout le workflow" translate="no">​</a></h2>
<p>À un moment, invoquer manuellement chaque rôle à la suite est devenu fastidieux, alors j'ai crée un dernier subagent qui porte le workflow complet : il reçoit le besoin en langage naturel et enchaîne lui-même les étapes (PM → PO → UI/UX → Tech Lead → Devs → QA), en déléguant chaque tâche au bon agent.</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">name</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> orchestrator</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">description</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Prend un besoin métier en langage naturel et pilote toute l'équipe (PM</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> PO</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> UI/UX</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Tech Lead</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> Devs</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">,</span><span class="token front-matter-block front-matter yaml language-yaml"> QA) jusqu'à la fonctionnalité livrée et testée. À invoquer pour lancer un workflow complet de bout en bout.</span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tools</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> Task</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Tu es le chef d'orchestre de la squad. Pour tout besoin reçu :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> Délègue à </span><span class="token code-snippet code keyword" style="color:#00009f">`pm`</span><span class="token plain"> le cadrage en epic et la création du projet Linear.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> Délègue à </span><span class="token code-snippet code keyword" style="color:#00009f">`po`</span><span class="token plain"> le découpage en user stories avec critères d'acceptation.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Délègue à </span><span class="token code-snippet code keyword" style="color:#00009f">`ui-ux`</span><span class="token plain"> la récupération ou le prototypage du design Figma associé.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">4.</span><span class="token plain"> Délègue à </span><span class="token code-snippet code keyword" style="color:#00009f">`tech-lead`</span><span class="token plain"> le découpage technique et l'architecture.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">5.</span><span class="token plain"> Délègue à chaque </span><span class="token code-snippet code keyword" style="color:#00009f">`dev-frontend`</span><span class="token plain">/</span><span class="token code-snippet code keyword" style="color:#00009f">`dev-backend`</span><span class="token plain"> sa tâche assignée.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">6.</span><span class="token plain"> Délègue à </span><span class="token code-snippet code keyword" style="color:#00009f">`qa`</span><span class="token plain"> la validation des critères d'acceptation.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">7.</span><span class="token plain"> Fais revalider par </span><span class="token code-snippet code keyword" style="color:#00009f">`tech-lead`</span><span class="token plain"> avant de considérer la fonctionnalité livrée.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Ne saute pas d'étape et attends le résultat de chaque agent avant de déléguer la suivante.</span><br></span></code></pre></div></div>
<p>Ce rôle ne remplace pas les autres, il se contente de les enchaîner : chaque étape reste exécutée dans le contexte propre de son subagent, l'orchestrateur ne fait que transmettre le résultat d'une étape à la suivante.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>L'orchestrateur suit le script, il n'improvise pas quand une étape se passe mal. Réservez-le aux tâches routinières et gardez l'habitude d'invoquer les rôles un par un dès que la fonctionnalité sort de l'ordinaire.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="points-de-vigilance">Points de vigilance<a href="https://blog.zatsit.fr/agent-squad#points-de-vigilance" class="hash-link" aria-label="Lien direct vers Points de vigilance" title="Lien direct vers Points de vigilance" translate="no">​</a></h2>
<p><strong>Commencez petit</strong> : trois ou quatre serveurs MCP (Figma, Linear, GitHub) suffisent largement au départ. Chaque serveur ajoute des outils que le modèle doit évaluer à chaque tour, et au-delà d'une dizaine de serveurs, le choix d'outil se dégrade nettement.</p>
<p><strong>Les Agent Teams restent expérimentales</strong>, token-intensives, avec des limites connues sur la reprise de session. Validez d'abord votre workflow avec de simples subagents avant d'y migrer.</p>
<p><strong>Restreignez les permissions par rôle</strong> : un agent PO n'a aucune raison d'avoir un accès en écriture au code, un agent QA n'a pas besoin d'écrire dans Figma. Le couple <code>tools</code>/<code>disallowedTools</code> dans le frontmatter de chaque subagent sert exactement à ça.</p>
<p>Le lien Figma reste la méthode la plus fiable pour donner du contexte design à un agent, la sélection active dans l'app desktop décroche trop souvent pour qu'on s'y fie.</p>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>Vérifiez toujours la provenance des serveurs MCP avant de les connecter. Un serveur qui va chercher du contenu externe (page web, fichier, ticket) peut exposer vos agents à de l'injection de prompt : du texte malveillant caché dans ce contenu, capable de détourner les instructions de l'agent qui le lit.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p><strong>CLI vs MCP :</strong> À besoin équivalent, préférez un CLI officiel à un serveur MCP tiers (<code>gh</code> plutôt qu'un MCP GitHub communautaire) : commandes explicites et auditables, sans la couche d'indirection d'un serveur externe.</p></div></div>
<p>Au final, monter une "équipe" d'agents est une combinaison assez terre-à-terre de <strong>sous-agents</strong> bien scopés (un rôle, un fichier .claude/agents/*.md, des outils restreints, une mission claire)
d'un <code>CLAUDE.md</code> qui fait office de contrat d'équipe
et de deux ou trois serveurs MCP qui relient vos agents à vos vrais outils de travail.</p>
<p>Ce qui a changé pour moi, c'est autant la vitesse d'exécution que la clarté : chaque agent sait précisément ce qu'il a le droit de faire, et je passe beaucoup moins de temps à réexpliquer le contexte à chaque nouvelle tâche.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Nous pouvons vous former !</div><div class="admonitionContent_BuS1"><p>Chez <strong>zatsit</strong>, nous proposons d'ailleurs d'augmenter le SDLC de nos clients avec des méthodologies agentiques de ce type. Si vous souhaitez en apprendre davantage, <a href="https://www.zatsit.fr/" target="_blank" rel="noopener noreferrer" class="">vous savez où nous trouver :)</a></p></div></div>]]></content:encoded>
            <category>ai</category>
            <category>architecture</category>
        </item>
        <item>
            <title><![CDATA[DevLille 2026 : nos retours de la conférence]]></title>
            <link>https://blog.zatsit.fr/devlille-2026</link>
            <guid>https://blog.zatsit.fr/devlille-2026</guid>
            <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Équipe zatsit au DevLille 2026]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Équipe zatsit au DevLille 2026" src="https://blog.zatsit.fr/assets/images/zats-team-d39e3aa18b305fc792e1e7b6ed6a182e.webp" width="2048" height="1536" class="img_ev3q"></p>
<p>Retour sur notre visite à DevLille 2026 : les conférences qui nous ont marqués, celles qu'on a données, nos coups de cœur...
Revivez à travers les yeux des talents de <strong>zatsit</strong> la conférence incontournable du nord de la France !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="devlille-cest-quoi-">DevLille, c'est quoi ?<a href="https://blog.zatsit.fr/devlille-2026#devlille-cest-quoi-" class="hash-link" aria-label="Lien direct vers DevLille, c'est quoi ?" title="Lien direct vers DevLille, c'est quoi ?" translate="no">​</a></h2>
<p>C'est chaque année le rendez-vous à ne pas manquer pour les passionnés de tech : Dev, Ops, Architecte... L'occasion de croiser d'anciens ou futurs collègues,
de découvrir ou redécouvrir des technos, parfois sous un angle surprenant, pourquoi pas déroutant même. Nous espérons que vous avez déjà vécu une édition,
si ce n'est pas le cas, il faudra remédier à ça l'année prochaine.</p>
<p>Par cet article, nous tenons à réitérer nos remerciements à l'équipe organisatrice.
Perte de sponsor, mouvement social (compréhensible, bien sûr, mais par nature imprévisible), inflation... autant d'obstacles à franchir pour
garantir une conférence sur deux jours sans accrocs. Comme les meilleurs numéros d'acrobatie, si on ne ressent pas la difficulté, c'est que c'est bien maîtrisé !</p>
<p>Plongez avec nous dans les conférences qui nous ont marqués, mais avant petit clin d'œil à notre participation.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="zatsit-à-devlille">zatsit à DevLille<a href="https://blog.zatsit.fr/devlille-2026#zatsit-%C3%A0-devlille" class="hash-link" aria-label="Lien direct vers zatsit à DevLille" title="Lien direct vers zatsit à DevLille" translate="no">​</a></h2>
<p>Tous les ans, notre collectif se retrouve pour participer à DevLille.
Comme chaque mois, nous profitons d'un <strong>zatsday</strong> pour apprendre ensemble et passer un bon moment.
Cette année, plus que spectateur, nous étions aussi speaker ! 3 interventions au programme :</p>
<ul>
<li class=""><strong>Le CDC pour ne pas DCD</strong> par <strong>Ludovic et Quentin</strong> : un REX sur un produit legacy qui produisait de la donnée obsolète ou manquante, sauvé en adoptant le Change Data Capture.
Avec des démos autour de Debezium et Kafka, des échanges sur base d'architecture event-driven et même des cadeaux à gagner, si vous aviez compté le nombre d'acronymes lors du talk.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=So5kdY1A_HI" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<p>D'ailleurs, si vous voulez comprendre comment fonctionne le WAL sous Postgres, <a href="https://www.youtube.com/watch?v=rVsyw0BC9hQ&amp;list=PLXbqr_rv1t4N3LXk2aP80NQjIbymwpA2S&amp;index=12&amp;pp=iAQB" target="_blank" rel="noopener noreferrer" class="">il y a aussi eu un talk à DevLille à ce sujet :)</a></p>
<ul>
<li class=""><strong>Contract-First : reprends le contrôle de tes API avec des outils qui changent la vie</strong> par <strong>Emmanuel</strong> : un workflow Contract-First complet
où le contrat OpenAPI devient source de vérité (mock avec <strong>Microcks</strong>, lint avec <strong>Vacuum</strong>,
rétrocompat avec <strong>Openapi-diff</strong>, tests...), le tout outillé par des agents IA (Claude Code, Gemini CLI) via des skills publiés sur skills.sh.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=1H7Tr77pVdA" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<ul>
<li class=""><strong>EcoScore A ou E : où se situe vraiment votre API ?</strong> par <strong>Emmanuel</strong> : comment mesurer l'éco-conception d'une API via deux référentiels open source complémentaires, API Green Score
et EROOM de Boavizta (maturité globale), avec à la clé un outil lui-même éco-conçu.</li>
</ul>
<p>Ces 3 talks ne sont pas anodins, ils reflètent l'expertise et les moteurs des talents de <strong>zatsit</strong> : l'architecture technique et l'éco-conception.
Ces deux thématiques, entre autres, animent nos <strong>zatsdays</strong> et notre quotidien !</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=XDaJhPRvz6U" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="les-conférences-qui-nous-ont-marqués">Les conférences qui nous ont marqués<a href="https://blog.zatsit.fr/devlille-2026#les-conf%C3%A9rences-qui-nous-ont-marqu%C3%A9s" class="hash-link" aria-label="Lien direct vers Les conférences qui nous ont marqués" title="Lien direct vers Les conférences qui nous ont marqués" translate="no">​</a></h2>
<p>"Choisir, c'est renoncer", c'est déjà assez difficile le jour J de choisir entre les 3 tracks, alors la sélection qui suit l'est encore plus.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="handicap-invisible--laccessibilité-commence-dans-les-réunions-et-lia-peut-aider">Handicap invisible : l’accessibilité commence dans les réunions (et l'IA peut aider)<a href="https://blog.zatsit.fr/devlille-2026#handicap-invisible--laccessibilit%C3%A9-commence-dans-les-r%C3%A9unions-et-lia-peut-aider" class="hash-link" aria-label="Lien direct vers Handicap invisible : l’accessibilité commence dans les réunions (et l'IA peut aider)" title="Lien direct vers Handicap invisible : l��’accessibilité commence dans les réunions (et l'IA peut aider)" translate="no">​</a></h3>
<p><em>Vu par Emmanuel</em></p>
<p><img decoding="async" loading="lazy" alt="9-millions-handicap-invisible" src="https://blog.zatsit.fr/assets/images/9-millions-handicap-invisible-49eb103a81227bd87d063b7b02f1993c.webp" width="3452" height="1554" class="img_ev3q">
Par <a href="https://www.linkedin.com/in/anaismoulin/" target="_blank" rel="noopener noreferrer" class="">Anaïs Moulin</a></p>
<p>Anaïs nous le confie elle-même, elle a un handicap invisible, elle est sourde de l'oreille droite.
C'est donc plus facile de lui parler du côté gauche lors de la pause café, mais c'est une autre histoire lors des réunions physiques et à distance.</p>
<p>Le chiffre de la photo ci-dessus est énorme, 9 millions de Français ont un handicap invisible, parmi ces handicaps, les 6 grandes familles les plus représentées :</p>
<ul>
<li class=""><strong>Maladies chroniques</strong> invalidantes : sclérose en plaques, fibromyalgie, endométriose, diabète... La catégorie la plus large.</li>
<li class="">Troubles <strong>sensoriels</strong> : surdité, malentendance (le cas d'Anaïs Moulin), déficiences visuelles partielles.</li>
<li class="">Troubles <strong>psychiques</strong> : dépression, troubles anxieux, bipolarité, schizophrénie.</li>
<li class="">Troubles <strong>neurodéveloppementaux</strong> : TDAH, troubles du spectre autistique, souvent diagnostiqués tard.</li>
<li class="">Troubles <strong>« dys »</strong> : dyslexie, dyspraxie, dyscalculie, avec un impact direct sur la lecture et le traitement de l'info à l'oral ou l'écrit.</li>
<li class="">Troubles <strong>cognitifs</strong> : mémoire, attention, difficultés à planifier...</li>
</ul>
<p>Il y a donc une forte probabilité pour que vous ou l'une des personnes de votre équipe ait un handicap de cette liste.
Ces personnes font déjà énormément d'efforts pour aménager comme elles peuvent leurs conditions de travail afin de limiter les difficultés qui en résultent.
Elles vont, par exemple, s'équiper d'un casque à réduction de bruit, d'un écran spécifique, d'un siège ergonomique très cher, d'un bureau assis/debout onéreux aussi...</p>
<p>Posons nous la question : "Que nous soyons concernés ou pas par un handicap, que pouvons-nous faire pour nos collègues ?"</p>
<p>Déjà, Anaïs nous rappelle que ce n'est pas "écrit sur le front" et que bon nombre de personnes n'osent pas en parler, alors partons du principe que statistiquement dans vos meetings par exemple, au moins une personne va devoir faire plus d'efforts que les autres.
Les exemples concrets pour lesquels il est facile d'avoir un impact positif sont les "réunions" :</p>
<ul>
<li class="">Allumer sa caméra : c'est plus facile de voir des réactions, détecter qui parle et même potentiellement lire sur les lèvres.</li>
<li class="">Promouvoir dans l'entreprise des solutions intégrées de génération de sous-titres.</li>
<li class="">Prévoir un ordre du jour : handicap ou pas, c'est pénible d'avoir une réunion sans ordre du jour préalable.</li>
<li class="">Préparer sa réunion : produire des documents en amont dont tout le monde peut prendre connaissance et prévoir un livrable en fin de réunion.</li>
</ul>
<p>Honnêtement ça relève plus du bon sens et de l'organisation intelligente. Fini les "Point projet X" dans lesquels on doit improviser sur des questions hasardeuses, ne rien produire et prévoir la "Suite du point projet X".
C'est une liste que j'essaie d'exiger systématiquement dans mes expériences professionnelles, mais vraiment pas facile à imposer. À croire qu'on aime la réunionite exclusive et peu productive.</p>
<p>Alors, pour la prochaine que vous organisez, essayez de prendre le bon réflexe.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=zKWgJ_4FLGo" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="devgreenops--passer-du-sprint-à-lendurance-énergétique-avec-decathlon-x-greenspector">DevGreenOps : Passer du sprint à l'endurance énergétique avec Decathlon x Greenspector<a href="https://blog.zatsit.fr/devlille-2026#devgreenops--passer-du-sprint-%C3%A0-lendurance-%C3%A9nerg%C3%A9tique-avec-decathlon-x-greenspector" class="hash-link" aria-label="Lien direct vers DevGreenOps : Passer du sprint à l'endurance énergétique avec Decathlon x Greenspector" title="Lien direct vers DevGreenOps : Passer du sprint à l'endurance énergétique avec Decathlon x Greenspector" translate="no">​</a></h3>
<p><em>Vu par Emmanuel</em></p>
<p><img decoding="async" loading="lazy" alt="Decathlon et Greenspector" src="https://blog.zatsit.fr/assets/images/decathlon-greenspector-a24e57067493b11e1c9aa1d8e23b42c9.webp" width="3452" height="1554" class="img_ev3q">
par <a href="https://www.linkedin.com/in/ottenathalie" target="_blank" rel="noopener noreferrer" class="">Nathalie Otte</a>,
<a href="https://www.linkedin.com/in/olivier-philippot-06a7907/" target="_blank" rel="noopener noreferrer" class="">Olivier Philippot</a>
et <a href="https://www.linkedin.com/in/ludovic-roland/" target="_blank" rel="noopener noreferrer" class="">Ludovic Roland</a>.</p>
<p>Decathlon fait partie des enseignes préférées des Français, ils font beaucoup pour le sport et ont socialement une place importante.
C'est naturellement qu'ils ont donc enclenché une démarche responsable aussi dans le numérique comme nous le rappelle Nathalie (GreenIT Leader).
Dans le talk <strong>zatsit</strong> qui parlait d'Écoscore, nous avons fait référence au REX de Decathlon que nous vous conseillons donc aussi ici : <a href="https://youtu.be/3Xtvw8LdYWg?si=YF3m0gT9uNP9eXI9" target="_blank" rel="noopener noreferrer" class="">https://youtu.be/3Xtvw8LdYWg?si=YF3m0gT9uNP9eXI9</a></p>
<p>Dans ce talk du DevLille, nous apprenons comment l'application mobile ecommerce de Decathlon est maintenant auditée par Greenspector.
<a href="https://greenspector.com/" target="_blank" rel="noopener noreferrer" class="">Greenspector</a> est une solution SaaS française qui mesure la sobriété et la performance
des services numériques (applications mobiles, sites web, IoT...) via des sondes d'énergie réelles
sur banc de tests physiques. Elle convertit ces mesures en Écoscore et en impacts environnementaux, s'intègre dans une chaîne CI/CD : le <strong>DevGreenOps</strong>.</p>
<p>Concrètement, l'équipe réalise des tests sur devices physiques pour les builds destinés aux stores d'app.
En production, pour être fidèle à l'expérience utilisateur, des scénarios réels sont déroulés en effectuant des mesures
sur le CPU, les échanges réseaux... afin de révéler l'utilisation batterie entre autres.
La prochaine étape est de pouvoir réaliser ces tests de bout en bout pour mesurer à la fois l'efficacité frontend, mais aussi côté back.</p>
<p>Vivement qu'on puisse voir dans un prochain talk les résultats complets !</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=Sp77hYnCcMg" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="sculpter-le-bruit--retour-dexpérience-sur-la-génération-de-textures-sonores">Sculpter le bruit : Retour d'expérience sur la génération de textures sonores<a href="https://blog.zatsit.fr/devlille-2026#sculpter-le-bruit--retour-dexp%C3%A9rience-sur-la-g%C3%A9n%C3%A9ration-de-textures-sonores" class="hash-link" aria-label="Lien direct vers Sculpter le bruit : Retour d'expérience sur la génération de textures sonores" title="Lien direct vers Sculpter le bruit : Retour d'expérience sur la génération de textures sonores" translate="no">​</a></h3>
<p><em>Vu par Emmanuel</em></p>
<p><img decoding="async" loading="lazy" alt="Sculpter le bruit, image sur scène du grand théâtre" src="https://blog.zatsit.fr/assets/images/sculpter-bruit-9c415b7796a0023a2def950238b8871b.webp" width="7008" height="4672" class="img_ev3q"></p>
<p>par <a href="https://github.com/sebferrer" target="_blank" rel="noopener noreferrer" class="">Sébastien Ferrer</a></p>
<p>Je ne savais pas trop à quoi m'attendre avec ce talk, et c'est précisément ce qui m'a plu : ça change radicalement
de la tech qu'on voit défiler toute la journée, mais pourtant c'est de la tech ! Pas de framework, pas de pipeline, pas de cloud, plutôt de l'analyse de signal et un peu de maths.
Le point de départ : Sébastien vit avec un acouphène permanent. Plutôt que de le subir, il a cherché à comprendre comment
le son pouvait masquer ou apaiser ces fréquences parasites. Et de fil en aiguille, il s'est retrouvé à coder ses propres bruits.</p>
<p>Là où ça devient malin, c'est qu'on parle de quelques lignes de code, selon lui "l'algo le plus simple qu'il ait jamais écrit".
Pas de deep learning, pas de modèle entraîné sur trois data centers. De la distribution aléatoire, des filtres, un peu de manipulation de signal,
et l'algorithme pour générer du bruit rose proprement. Du chaos mathématique transformé en confort auditif,
et on voyait le son devenir image à l'écran, le spectre se dessiner sous nos yeux. On a même vu le logo DEVLILLE 2026 et ça c'était fun, effet démo garanti !
Les pièces du puzzle se sont mises en place. Tous ces bruits "colorés" qu'on croise sans jamais y réfléchir :
Le bruit blanc, agressif, sifflant, c'est exactement la neige sur les vieux téléviseurs cathodiques (pour les plus anciens dans la salle).</p>
<p>Le bruit rose, plus doux, plus équilibré, c'est celui qui peuple les playlists "sommeil" et "concentration"
de Spotify et Deezer. Si tu t'es déjà demandé pourquoi ces playlists marchent mieux que le blanc pour dormir,
c'est une histoire de répartition d'énergie par octave : l'oreille humaine le perçoit comme plus naturel,
plus proche de la pluie que du sifflement.</p>
<p>Le bruit brun (ou rouge, ou brownien, c'est le même), encore plus grave, ce grondement profond (comme un orage nous dit Sébastien) façon cascade ou ressac, une ambiance de plage, on sent le sable sous nos pieds.
Bref, un talk qui ne servira peut-être jamais directement dans mon job, et c'est très bien comme ça.</p>
<p>Parfois il faut juste une conf qui te fait regarder ton vieux poste cathodique d'un autre œil, qui explique ta playlist de concentration...</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://youtu.be/zKWgJ_4FLGo?si=sRiYotsaMSPPYSJI" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="qui-a-marqué-le-plus-de-buts--construire-un-agent-ia-qui-interroge-des-données-en-langage-naturel">Qui a marqué le plus de buts ? construire un agent IA qui interroge des données en langage naturel<a href="https://blog.zatsit.fr/devlille-2026#qui-a-marqu%C3%A9-le-plus-de-buts--construire-un-agent-ia-qui-interroge-des-donn%C3%A9es-en-langage-naturel" class="hash-link" aria-label="Lien direct vers Qui a marqué le plus de buts ? construire un agent IA qui interroge des données en langage naturel" title="Lien direct vers Qui a marqué le plus de buts ? construire un agent IA qui interroge des données en langage naturel" translate="no">​</a></h3>
<p><em>Vu par Ludovic</em></p>
<p><img decoding="async" loading="lazy" alt="Mazlum sur scene" src="https://blog.zatsit.fr/assets/images/mazlum-eef466bdea8a840868e22718f785acd9.webp" width="1280" height="960" class="img_ev3q"></p>
<p>par <a href="https://www.linkedin.com/in/mazlum-tosun-900b1812/" target="_blank" rel="noopener noreferrer" class="">Mazlum Tosun</a></p>
<p>Mazlum, habitué du DevLille, présente un sujet concret, sur la mise en place d'un agent IA permettant d'interroger les données de la coupe du monde du Qatar.</p>
<p>Contrairement à la majorité des talks, celui-ci présente les technologies, l'architecture et le workflow de CI utilisés pour en venir à une démonstration de l'intégration de la stack, d'abord en local, puis déployée sur GCP dans Cloud Run.</p>
<p><img decoding="async" loading="lazy" alt="architecture" src="https://blog.zatsit.fr/assets/images/archi-mazlum-bdf7a75cee9789be52e31c43f79f0061.webp" width="1357" height="710" class="img_ev3q"></p>
<p>L'application s'articule donc autour de 4 composants clés :</p>
<ul>
<li class="">Le front en <strong>Next</strong> qui intègre <a href="https://github.com/copilotkit/copilotkit" target="_blank" rel="noopener noreferrer" class="">CopilotKit</a>, pour l'intégration IA</li>
<li class=""><a href="https://adk.dev/" target="_blank" rel="noopener noreferrer" class="">Agent Development Kit (ADK)</a> côté backend, pour le framework permettant d'orchestrer les agents</li>
<li class=""><strong>Vertex AI</strong> côté Google, permettant de fournir un LLM pour converser (Gemini 2.5 Flash) ici</li>
<li class=""><strong>BigQuery</strong> et son <strong>MCP</strong> pour la source de donnée (données de la CDM au Qatar)</li>
</ul>
<p>Côté CI, du classique sur GCP pour orchestrer le déploiement vers Cloud Run :</p>
<p><img decoding="async" loading="lazy" alt="ci" src="https://blog.zatsit.fr/assets/images/cimazllum-0c7dab1e735a1479fe2283922a74b664.webp" width="1418" height="639" class="img_ev3q"></p>
<p>En 45 minutes, Mazlum a donc permis à l'auditoire de comprendre comment créer sa première plateforme conversationnelle, sur base d'exemples, de schémas et de démonstrations. C'est ce qu'on attend, quand on participe à une conférence : repartir avec des choses à actionner !</p>
<p>Le clou du spectacle ? La possibilité de s'amuser avec cette stack exclusivement en local, sans consommer de tokens IA :</p>
<p><img decoding="async" loading="lazy" alt="avec un llm local" src="https://blog.zatsit.fr/assets/images/localmazlum-663d173e7e4ffe64891a05adcf73d185.webp" width="1444" height="632" class="img_ev3q"></p>
<p>On adore !</p>
<p>Si vous voulez aller plus loin :</p>
<ul>
<li class=""><a href="https://docs.google.com/presentation/d/19iBG2qq_2fFLu2J2NDfEkp0fsZD2Lzu9/edit?usp=sharing&amp;ouid=106953247454474350663&amp;rtpof=true&amp;sd=true" target="_blank" rel="noopener noreferrer" class="">Les slides</a></li>
<li class=""><a href="https://github.com/tosun-si/football-agent-adk-copilotkit" target="_blank" rel="noopener noreferrer" class="">Le code source du projet</a></li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=i2YQP0lUO2w" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="déployer-souvent-stresser-moins--feature-flags-en-prod-critique">Déployer souvent, stresser moins : feature flags en prod critique<a href="https://blog.zatsit.fr/devlille-2026#d%C3%A9ployer-souvent-stresser-moins--feature-flags-en-prod-critique" class="hash-link" aria-label="Lien direct vers Déployer souvent, stresser moins : feature flags en prod critique" title="Lien direct vers Déployer souvent, stresser moins : feature flags en prod critique" translate="no">​</a></h3>
<p><em>Vu par Quentin et Ludovic</em></p>
<p><img decoding="async" loading="lazy" alt="Déployer souvent, stresser moins" src="https://blog.zatsit.fr/assets/images/deployer-souvent-stresser-moins-7af2f43070be3bd9c3fcf9be9fe00b54.webp" width="6915" height="4610" class="img_ev3q"></p>
<p>par <a href="https://www.linkedin.com/in/marion-chineaud-98000b214/" target="_blank" rel="noopener noreferrer" class="">Marion Chineaud</a> et <a href="https://www.linkedin.com/in/elise-souvannavong-insa/" target="_blank" rel="noopener noreferrer" class="">Elise Souvannavong</a></p>
<p>Dans ce talk du DevLille, Marion et Elise nous embarquent dans leur méthodologie pour livrer plus vite, sans friction entre la tech' et le métier.
Elles y détaillent quelques techniques pour mitiger les risques d'un déploiement et pour permettre aux équipes en charge du métier de tester leurs idées sans impacter le delivery et les utilisateurs.</p>
<p>Tout le monde sera d'accord pour dire que pour déployer souvent, il faut d'abord découper et merger fréquemment son code. Et ce que suggèrent Marion et Elise, c'est de séparer l'action de merger et de déployer. C'est vrai que bien souvent, on attend que tout soit prêt à être déployé pour être mergé et l'on entre dans des tunnels. Et pour éviter d'impacter les utilisateurs avec des demi-features, elles suggèrent d'utiliser des release flags : des booléens, stockés de préférence séparément de la codebase, pour activer ou désactiver des features.</p>
<p>Dans une seconde partie du talk, Elise et Marion évoquent la volonté de l'équipe métier de pouvoir piloter l'application avec des flags, afin de réaliser des tests. On parle alors d'A/B testing (tests de variants d'une feature afin de choisir celle qui correspond le mieux aux utilisateurs), shadow mode (déploiement d'un service critique en parallèle de l'application afin de tester son comportement en conditions réelles) ou de canary release (release différenciée suivant la typologie d'utilisateurs afin de recueillir des feedbacks des bêta-testeurs avant une mise en production généralisée). Des concepts intéressants, à mettre en pratique si le besoin se fait ressentir dans les équipes !</p>
<p>Un warning tout de même : les flags c'est beau mais ne pas oublier le clean après les releases !</p>
<p>Le mot de la fin : faire d'une release un non-évènement, je pense que c'est ce vers quoi tout développeur/toute développeuse veut aller.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=yF_oAmSO5JQ" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ia-et-bonnes-pratiques-nom-de-zeus-on-savait-déjà-tout-">IA et bonnes pratiques: Nom de Zeus, on savait déjà tout !<a href="https://blog.zatsit.fr/devlille-2026#ia-et-bonnes-pratiques-nom-de-zeus-on-savait-d%C3%A9j%C3%A0-tout-" class="hash-link" aria-label="Lien direct vers IA et bonnes pratiques: Nom de Zeus, on savait déjà tout !" title="Lien direct vers IA et bonnes pratiques: Nom de Zeus, on savait déjà tout !" translate="no">​</a></h3>
<p><em>Vu par Quentin et Ludovic</em></p>
<p><img decoding="async" loading="lazy" alt="IA et bonnes pratiques: Nom de Zeus, on savait déjà tout !" src="https://blog.zatsit.fr/assets/images/ia-bonnes-pratiques-98c482786b98173cb491770bc3d14907.webp" width="6907" height="4605" class="img_ev3q"></p>
<p>par <a href="https://github.com/nathancastelein" target="_blank" rel="noopener noreferrer" class="">Nathan Castelain</a></p>
<p>Dès le début du talk, nous sommes embarqués dans l'univers de Retour vers le Futur. Le pitch ? Nathan arrive en 2026, au moment où l'IA est prédominante dans le quotidien des développeurs. Le Doc est lui même une IA qui dicte les bonnes pratiques en termes de prompting et d'utilisation de l'IA agentique. Mais, Nathan vient de 2024, une époque où l'IA pour les développeurs se limitait à poser des questions dans un chat et copier éventuellement le snippet de code, bien loin des pratiques actuelles donc !</p>
<p>Le but de ce talk est de déconstruire les concepts du moment autour de l'IA agentique (Context Engineering, Prompt Engineering, etc.) et de les croiser avec des concepts et pratiques de développement existants depuis quelques décennies, comme l'agilité et son manifeste, le Behavior Driven Design, le Domain Driven Design, ...</p>
<p>Un talk qui invite à prendre du recul sur l'utilisation de l'IA et à se rappeler que, finalement, on n'a rien révolutionné en termes de concepts. Le Context Engineering n'est qu'un nouveau nom pour des réflexes qu'on connaît bien : découper, donner du contexte métier, structurer l'intention avant de produire. La vraie nouveauté, elle, est ailleurs : on écrit (ou plutôt on fait écrire) du code plus rapidement. Reste à savoir si nos pratiques craft suivront le rythme.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Le replay de ce talk</div><div class="admonitionContent_BuS1"><p><a href="https://www.youtube.com/watch?v=-A_tPrXDGMA" target="_blank" rel="noopener noreferrer" class="">C'est par ici !</a></p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://blog.zatsit.fr/devlille-2026#conclusion" class="hash-link" aria-label="Lien direct vers Conclusion" title="Lien direct vers Conclusion" translate="no">​</a></h2>
<p>On repart avec deux sentiments :</p>
<ul>
<li class="">On a fait notre possible pour proposer des talks à notre image : de l'architecture technique, de la plomberie technique, pragmatique</li>
<li class="">et même de l'éco-conception, parce que c'est une urgence !</li>
<li class="">On a adoré croiser nos collègues, avoir de l'inspiration et prendre le pouls de la tech lilloise.</li>
</ul>
<p>Comme chaque année, ça nous semble naturel, chez <strong>zatsit</strong> d'emmener tout le collectif prendre une bonne bulle d'air tech et quand on voit que certains pairs ne sont jamais allés
à une conférence, c'est triste. Chacun dans notre métier doit produire un travail de veille personnel, c'est sûr, mais l'entreprise a le devoir de former son collectif
de l'emmener voir d'autres horizons, même si ce n'est qu'à quelques kilomètres, le savoir ne vaut que s'il est partagé !</p>]]></content:encoded>
            <category>general</category>
            <category>conference</category>
        </item>
        <item>
            <title><![CDATA[FOSDEM 2026 : Quoi de neuf dans le monde de l'open source ?]]></title>
            <link>https://blog.zatsit.fr/fosdem-2026</link>
            <guid>https://blog.zatsit.fr/fosdem-2026</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sticker in the street stating "Fuck off google"]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Sticker in the street stating &amp;quot;Fuck off google&amp;quot;" src="https://blog.zatsit.fr/assets/images/20260201_104403-4e941681839ee04c879a2e6fb4b51568.webp" width="4032" height="1908" class="img_ev3q"></p>
<p>La FOSDEM (Free and Open Source Software Developers' European Meeting) est un événement annuel qui rassemble les acteurs et actrices de l'open source du monde entier. Pour la 3e année consécutive, votre serviteur a pris sur son temps libre pour se rendre à Bruxelles et assister à une douzaine de conférences sur les plus de 1000 qui se tenaient ce week-end du 1er et 2 février 2026. Voici un condensé de ce qui a retenu son attention.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="la-fosdem--du-plus-utilitaire-au-plus-expérimental">La FOSDEM : du plus utilitaire au plus expérimental<a href="https://blog.zatsit.fr/fosdem-2026#la-fosdem--du-plus-utilitaire-au-plus-exp%C3%A9rimental" class="hash-link" aria-label="Lien direct vers La FOSDEM : du plus utilitaire au plus expérimental" title="Lien direct vers La FOSDEM : du plus utilitaire au plus expérimental" translate="no">​</a></h2>
<p>La FOSDEM est à l'image de l'open source : c'est un événement gratuit qui tient grâce à l'engagement de certains acteurs privés (comme Google), de fondations liées à l'open source (comme Red Hat), de partenaires publics (comme l'Université Libre de Bruxelles) et surtout de centaines de bénévoles qui organisent l'événement, accueillent les participants, et surtout créent le contenu des plus de 1000 conférences qui se tiennent pendant ces deux jours.</p>
<p>Dans ce contenu, on trouve de tout : des conférences très techniques sur des sujets de niche, des conférences plus généralistes sur les tendances du moment. On peut autant ressortir d'une conférence en se disant « j'ai hâte d'utiliser ça dans mon projet »<sup><a href="https://blog.zatsit.fr/fosdem-2026#user-content-fn-1-576557" id="user-content-fnref-1-576557" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetHideOnScrollNavbar_vjPI">1</a></sup> que « je n'ai pas compris la moitié de ce qui a été dit, mais c'était fascinant » (en passant par de franches tranches de rire en écoutant les mésaventures d'un mainteneur open source face à des utilisateurs et utilisatrices pas toujours très compréhensif·ve·s).</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="un-peu-de-java-des-containers-et-des-nouveautés-dans-lopenid">Un peu de Java, des containers et des nouveautés dans l'OpenID<a href="https://blog.zatsit.fr/fosdem-2026#un-peu-de-java-des-containers-et-des-nouveaut%C3%A9s-dans-lopenid" class="hash-link" aria-label="Lien direct vers Un peu de Java, des containers et des nouveautés dans l'OpenID" title="Lien direct vers Un peu de Java, des containers et des nouveautés dans l'OpenID" translate="no">​</a></h2>
<p>Au rang des conférences que je vais définitivement vouloir réutiliser dans mes projets, j'ai retenu celles-ci :</p>
<ul>
<li class=""><a href="https://fosdem.org/2026/schedule/event/QQFMBG-java-container-memory-management/" target="_blank" rel="noopener noreferrer" class="">Java Memory Management in Containers</a></li>
<li class=""><a href="https://fosdem.org/2026/schedule/event/VFDMGL-podman-ebpf-profiling/" target="_blank" rel="noopener noreferrer" class="">Reducing container images size with eBPF &amp; Podman</a></li>
<li class=""><a href="https://fosdem.org/2026/schedule/event/ATMQVL-intro-to-shared-signals-framework/" target="_blank" rel="noopener noreferrer" class="">An Introduction to the OpenID Shared Signals Framework</a></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="jvm-in-containers">JVM in Containers<a href="https://blog.zatsit.fr/fosdem-2026#jvm-in-containers" class="hash-link" aria-label="Lien direct vers JVM in Containers" title="Lien direct vers JVM in Containers" translate="no">​</a></h3>
<p>Forcément, on a tous nos biais : en tant que développeur backend Java, la gestion de mémoire et la taille de mes conteneurs sont des problématiques auxquelles je suis confronté dans mon travail quotidien. Et même si j'utilisais déjà quelques options de la JVM pour tweaker la gestion de mémoire dans mes containers, j'ai appris pas mal de choses. Par exemple, saviez-vous que les différents distributeurs de Java livrent des versions de l'OpenJDK avec des gestions de mémoire différentes ? Ainsi, le <strong>Maximum Heap Size</strong> par défaut de Java 21 est 25%, mais la version de Red Hat, optimisée pour le déploiement en container, est livrée avec un <strong>Maximum Heap Size</strong> par défaut à 85% ! Et c'est logique : quand on tourne dans un container entièrement dédié à notre JVM, on peut récupérer plus d'espace mémoire.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ebpf-pour-alléger-ses-containers-">eBPF pour alléger ses containers 🌱<a href="https://blog.zatsit.fr/fosdem-2026#ebpf-pour-all%C3%A9ger-ses-containers-" class="hash-link" aria-label="Lien direct vers eBPF pour alléger ses containers 🌱" title="Lien direct vers eBPF pour alléger ses containers 🌱" translate="no">​</a></h3>
<p>J'ai aussi suivi avec beaucoup d'attention <a href="https://www.linkedin.com/in/axel-stefanini" target="_blank" rel="noopener noreferrer" class="">Axel Stefanini</a> (de chez Red Hat justement) qui nous a présenté comment, grâce à <a href="https://ebpf.io/what-is-ebpf/" target="_blank" rel="noopener noreferrer" class="">eBPF</a>, il a pu monitorer ses déploiements et identifier tout ce qui était inutile dans ses containers, pour ensuite réduire drastiquement la taille de ses images (une approche similaire aux images distroless dont on parle de plus en plus ces dernières années). Plus qu'une question de performance, c'est aussi une question d'empreinte carbone : plus les images sont légères, moins elles consomment de ressources pour être transférées et stockées. Et chez <strong>zatsit</strong>, ce genre d'approche nous parle beaucoup !</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="openid-shared-signals-framework">OpenID Shared Signals Framework<a href="https://blog.zatsit.fr/fosdem-2026#openid-shared-signals-framework" class="hash-link" aria-label="Lien direct vers OpenID Shared Signals Framework" title="Lien direct vers OpenID Shared Signals Framework" translate="no">​</a></h3>
<p>Le dimanche, j'ai sacrifié ma grasse matinée pour assister à la conférence de <a href="https://www.linkedin.com/in/thomasdarimont/" target="_blank" rel="noopener noreferrer" class="">Thomas Darimont</a> sur une nouvelle fonctionnalité du standard OpenID : le <strong>Shared Signals Framework</strong>.</p>
<p>Cette nouvelle fonctionnalité permet de partager des signaux entre fournisseurs d'identité et clients. On est tous désormais plus ou moins familiers avec l'utilisation des fournisseurs d'identité comme <a href="https://www.keycloak.org/" target="_blank" rel="noopener noreferrer" class="">Keycloak</a>, qui nous permettent de nous identifier sur plusieurs ressources grâce à un fournisseur d'identité unique. Mais voilà : aujourd'hui, notre fournisseur d'identité ne peut pas communiquer à son initiative avec les clients qui l'utilisent. C'est ce que viennent permettre les <strong>Shared Signals</strong>.</p>
<p>Si par exemple vous avez utilisé Google pour vous connecter à votre compte GitHub, ainsi qu'à un service de streaming, et puis bien sûr à votre client mail, et que malheureusement quelqu'un a deviné votre mot de passe (il faut dire que « adminPassword123 » ce n'était pas très compliqué) : Aujourd'hui, Google se rendra probablement compte que quelque chose n'est pas clair (en fonction de l'origine de la connexion par exemple), mais il ne sera pas en mesure d'avertir les autres clients que la sécurité de votre compte a été compromise. Demain, grâce aux <strong>Shared Signals</strong>, Google pourra envoyer un signal à tous les clients qui l'utilisent comme fournisseur d'identité pour les avertir que votre compte a été compromis, et ainsi permettre à ces clients de révoquer vos sessions actives ou de vous demander de changer votre mot de passe.
Que ce soit pour la sécurité en entreprise ou pour nos utilisations du quotidien, c'est une fonctionnalité qui peut faire une grande différence et qui deviendra très certainement un standard dans les années qui viennent.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="linux-on-mobile-et-reverse-engineering-spotify">Linux on mobile et reverse engineering Spotify<a href="https://blog.zatsit.fr/fosdem-2026#linux-on-mobile-et-reverse-engineering-spotify" class="hash-link" aria-label="Lien direct vers Linux on mobile et reverse engineering Spotify" title="Lien direct vers Linux on mobile et reverse engineering Spotify" translate="no">​</a></h2>
<p>La FOSDEM, c'est aussi l'occasion de découvrir des sujets plus expérimentaux. En tant qu'aficionado de custom ROM Android et pourfendeur de l'obsolescence programmée, j'ai été très intéressé par <a href="https://fosdem.org/2026/schedule/event/9KYVGM-jolla-c2/" target="_blank" rel="noopener noreferrer" class="">la conférence d'Affe Null</a> sur son portage de <strong>Linux mainline</strong> (c'est-à-dire du kernel Linux sans modification) sur mobile. On est loin d'avoir un mobile utilisable au quotidien pour l'instant, mais c'est toujours très inspirant de voir des passionné·e·s (surtout si jeunes !) se lancer dans un reverse engineering complexe et l'écriture de drivers à la main, juste parce qu'ils étaient curieux de savoir comment ça marche.</p>
<p>Dans la catégorie "projets expérimentaux", la conférence de <a href="https://www.linkedin.com/in/devgianlu/" target="_blank" rel="noopener noreferrer" class="">devgianlu</a>, <a href="https://fosdem.org/2026/schedule/event/RNBQ8U-reverse-engineering-spotify/" target="_blank" rel="noopener noreferrer" class="">Reverse Engineering the World's Largest Music Streaming Platform</a> m'a aussi marqué (comment ne pas l'être quand le conférencier commence par ce disclaimer : « If there's someone from Spotify in the audience, please don't sue me. Let's talk first »). Plus qu'une lubie de passionné, ce genre de projet est aussi la ligne de front de la lutte contre les pratiques anti-consommateurs de certaines grandes entreprises. Parce qu'être en maîtrise de son matériel et de ses logiciels, c'est aussi être en maîtrise de ses données et de sa vie privée.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="forcément-de-lia">Forcément, de l'IA<a href="https://blog.zatsit.fr/fosdem-2026#forc%C3%A9ment-de-lia" class="hash-link" aria-label="Lien direct vers Forcément, de l'IA" title="Lien direct vers Forcément, de l'IA" translate="no">​</a></h2>
<p>Impossible de passer à côté de la révolution de l'IA générative à la FOSDEM. Mais au-delà des alternatives open source aux LLM bien connus, la FOSDEM est aussi l'occasion d'aborder le sujet sous un angle qu'on n'entend pas assez dans nos métiers : <a href="https://fosdem.org/2026/schedule/event/HEGWFW-defining_sovereign_ai/" target="_blank" rel="noopener noreferrer" class="">What do we mean when we say Sovereign AI?</a> par <a href="https://www.linkedin.com/in/katharinejarmul" target="_blank" rel="noopener noreferrer" class="">Katharine Jarmul</a> nous a offert une réflexion nécessaire sur la dépendance de nos entreprises et de nos États à des entreprises étrangères, notamment états-uniennes, pour l'accès à des modèles d'IA générative.</p>
<p>Face aux changements géopolitiques et aux renversements d'alliances de ces derniers mois, il est plus que jamais nécessaire de se poser la question de la souveraineté numérique et de l'impact que cela peut avoir sur nos entreprises, nos données et notre vie privée. Il faut aussi sortir de la croyance que seules les USA seraient capables de faire de l'IA : il existe des alternatives européennes, et même françaises, qui sont à la pointe de la technologie et qui méritent d'être soutenues.</p>
<p>Grâce à <a href="https://www.linkedin.com/in/manjiki/" target="_blank" rel="noopener noreferrer" class="">Effie Mouzeli</a> et sa conférence <a href="https://fosdem.org/2026/schedule/event/YDLGLN-running_wikipedia_on_bare_metal_open_source_and_a_healthy_dose_of_caching/" target="_blank" rel="noopener noreferrer" class="">Running Wikipedia on Bare Metal, Open Source, and a Healthy Dose of Caching</a>, j'ai aussi appris que l'IA menace directement la pérennité de Wikipédia. Non pas (seulement) parce qu'elle se nourrit gratuitement du travail de tous les contributeurs et contributrices de Wikipédia pour s'entraîner et recracher ce savoir sans jamais rien donner en retour, mais surtout parce que les bots IA et les outils de scraping qui assaillent continuellement Wikipédia font exploser le trafic et ses coûts d'infrastructure... encore une fois, sans jamais rien donner en retour.</p>
<p>Autant de rappels à l'importance de soutenir les projets open source et à réfléchir à notre usage de l'IA. Ne soyons pas des parasites, soyons des contributeurs et contributrices, des utilisateurs et utilisatrices responsables, et des défenseurs et défenseuses de l'open source !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://blog.zatsit.fr/fosdem-2026#conclusion" class="hash-link" aria-label="Lien direct vers Conclusion" title="Lien direct vers Conclusion" translate="no">​</a></h2>
<p>Cette édition 2026 de la FOSDEM a encore une fois confirmé que l'open source est bien vivant et continue d'innover sur tous les fronts. Plus qu'un simple événement technique, la FOSDEM nous rappelle que derrière chaque ligne de code se cache une communauté engagée pour un numérique plus libre, plus transparent et plus éthique.</p>
<p>Rendez-vous l'année prochaine pour découvrir les prochaines innovations de l'écosystème open source !</p>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI sr-only" id="footnote-label">Footnotes<a href="https://blog.zatsit.fr/fosdem-2026#footnote-label" class="hash-link" aria-label="Lien direct vers Footnotes" title="Lien direct vers Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetHideOnScrollNavbar_vjPI" id="user-content-fn-1-576557">
<p>D'ailleurs, c'est exactement ce qui s'est passé avec <a href="https://blog.zatsit.fr/blog/openrewrite/" target="_blank" rel="noopener noreferrer" class="">OpenRewrite</a>, découvert à la FOSDEM 2023 et depuis intégré dans mes projets ! <a href="https://blog.zatsit.fr/fosdem-2026#user-content-fnref-1-576557" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content:encoded>
            <category>general</category>
        </item>
        <item>
            <title><![CDATA[Le Green IT, épisode 2 : Pas coule !]]></title>
            <link>https://blog.zatsit.fr/green-consommation-energie</link>
            <guid>https://blog.zatsit.fr/green-consommation-energie</guid>
            <pubDate>Sat, 29 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Nous aimerions tous que ce ne soit qu'une goutte d'eau dans l'océan, malheureusement la réalité se mesure en centaines de milliards]]></description>
            <content:encoded><![CDATA[<p>Nous aimerions tous que ce ne soit qu'une goutte d'eau dans l'océan, malheureusement la réalité se mesure en centaines de milliards
de litres. Je veux bien sûr parler ici de la consommation d'eau des datacenters, ceux qui calculent pour vous des itinéraires, vous permettent de chiller
devant la dernière série et qui hébergent aussi cette page web...
Dans le premier épisode de cette série, nous avions exploré l'impact environnemental de l'extraction des matières premières nécessaires à nos appareils personnels, mais aussi aux serveurs de nos datacenters...
Après le carbone, place à une autre facette moins visible de l’empreinte numérique : l’eau. On parle souvent d’émissions, rarement d’évaporation, et pourtant la consommation d’eau du secteur mérite qu’on s’y attarde.</p>
<p><img decoding="async" loading="lazy" alt="Cycle de l&amp;#39;eau" src="https://blog.zatsit.fr/assets/images/acid-rain-amico-ae0399fac60c1767906dd9dceed01a78.webp" width="500" height="500" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="leau-cest-la-vie">L'eau, c'est la vie<a href="https://blog.zatsit.fr/green-consommation-energie#leau-cest-la-vie" class="hash-link" aria-label="Lien direct vers L'eau, c'est la vie" title="Lien direct vers L'eau, c'est la vie" translate="no">​</a></h2>
<p>C'est bien connu : l'eau c'est la vie, elle est majoritaire à la surface de notre "planète bleue". Dans nos contrées, nous y avons accès aussi facilement
qu'en tournant un robinet et pourtant elle est plus que jamais souillée, pompée à tout va et tout simplement gaspillée.</p>
<p>Le numérique, comme tous les secteurs économiques, n'échappe pas à cette consommation déraisonnée. Le plus souvent, quand on pense datacenter on pense électricité, et c'est pourquoi on ne les associe rarement à l'eau.
C'est à la fois un peu plus compliqué que ça, mais simple à comprendre.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="humain-ou-moteur-leau-garde-la-fraîcheur-">Humain ou moteur, l’eau garde la fraîcheur !<a href="https://blog.zatsit.fr/green-consommation-energie#humain-ou-moteur-leau-garde-la-fra%C3%AEcheur-" class="hash-link" aria-label="Lien direct vers Humain ou moteur, l’eau garde la fraîcheur !" title="Lien direct vers Humain ou moteur, l’eau garde la fraîcheur !" translate="no">​</a></h2>
<p>Dans notre quotidien, on se rend facilement compte de l'intérêt de l'eau. Quelques minutes en plein soleil, ou pendant votre séance de sport, on remarque vite les effets de la transpiration :
de l'eau est "produite" sur notre peau et cette eau en s'évaporant va absorber de l'énergie thermique et donc "réduire" la température.</p>
<p>C'est la même chose pour nos bons vieux moteurs thermiques de voiture, dans lesquels un liquide va circuler, s'échauffer en "récupérant" de la chaleur qui va se dissiper au travers d'un radiateur.</p>
<p>Là, vous commencez bien à visualiser l'intérêt d'utiliser l'eau pour refroidir tout système.
Ça coule de source et vous ne m'avez pas attendu pour comprendre ça, mais un petit rappel s'imposait quand même.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="un-datacenter-ça-a-soif">Un datacenter ça a soif<a href="https://blog.zatsit.fr/green-consommation-energie#un-datacenter-%C3%A7a-a-soif" class="hash-link" aria-label="Lien direct vers Un datacenter ça a soif" title="Lien direct vers Un datacenter ça a soif" translate="no">​</a></h2>
<p>Vous le constatez quand vous faites travailler votre laptop, ça chauffe sous les doigts et parfois le ventilateur se fait entendre, mais cette dissipation par air a ses limites.
Peut-être faisiez-vous partie de ces bidouilleurs qui faisaient du "watercooling" dans des bécanes montées à la main, avec amour pour programmer ou jouer.</p>
<p>Alors, imaginez la chaleur à l'échelle d'un datacenter. Pour rester opérationnels, ils ont donc besoin de systèmes de refroidissement efficaces.
Et beaucoup de ces systèmes (tours d’évaporation, échangeurs eau/air, <a href="https://fr.wikipedia.org/wiki/Refroidisseur_par_%C3%A9vaporation" target="_blank" rel="noopener noreferrer" class="">évaporateurs adiabatiques</a>) utilisent de l’eau.</p>
<p>Encore plus depuis l’explosion des projets "hyperscale" pour l’IA, la question de la consommation d’eau est sortie des rapports techniques pour rejoindre les débats publics.
Parlons un peu chiffres.</p>
<ul>
<li class="">Certains datacenters peuvent consommer jusqu'à <em><strong>5 millions de litres d'eau par jour</strong></em>, soit l'équivalent de la consommation d'une ville de 30 000 habitants.</li>
<li class="">"In 2023, Meta consumed 813 million gallons of water globally (3.1 billion liters) — 95% of which, 776 million gallons (2.9 billion liters), was used by data centers. <a href="https://insights.globalspec.com/article/24145/data-centers-consume-massive-amounts-of-water-companies-rarely-tell-the-public-exactly-how-much?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer" class="">Source</a></li>
<li class="">En Europe, cet <a href="https://www.scrd.eu/index.php/scrd/article/download/477/439/866" target="_blank" rel="noopener noreferrer" class="">autre rapport</a> nous parle de <em><strong>43,2 milliards de litres d’eau</strong></em> consommés annuellement.</li>
<li class="">Ou encore, selon un <a href="https://escholarship.org/uc/item/32d6m0d1" target="_blank" rel="noopener noreferrer" class="">rapport du Berkeley Lab</a> sur l'utilisation de l'énergie aux États-Unis, cette tendance ne fait que croître.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Utilisation de l&amp;#39;eau par type de datacenter" src="https://blog.zatsit.fr/assets/images/datacenter-water-consumption-4718668c245594c5dbf345918a379f55.webp" width="1524" height="1088" class="img_ev3q"></p>
<ul>
<li class="">Avec 2,5 millions de litres par piscines olympiques, on pourrait en faire nager des championnes et des champions !</li>
</ul>
<p>Certaines études ne sont pas aussi catégoriques dans les chiffres, les méthodes de comptage diffèrent parfois,
certaines prennent en compte la consommation directe (eau prélevée et évaporée ou rejetée par le datacenter lui-même) et indirecte
(eau utilisée pour produire l’électricité qui alimente ces mêmes centres, par exemple l'eau évaporée dans des centrales thermiques ou hydroélectriques).</p>
<p>En tout cas les échelles sont là et on note surtout que la tendance est à la hausse.</p>
<blockquote>
<p>Comme si ça ne suffisait pas, saviez-vous que près de 40 % de l’énergie consommée par certains datacenters vient de son système de refroidissement... <a href="https://www.eesi.org/articles/view/data-center-energy-needs-are-upending-power-grids-and-threatening-the-climate?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer" class="">Source</a>
<img decoding="async" loading="lazy" alt="Répartition de l&amp;#39;usage de l&amp;#39;énergie" src="https://blog.zatsit.fr/assets/images/analysis-of-power-consumption-proportionality-in-data-center-8-24-b8d3bfc4f18b51cfd2b3ec4aa08418ef.webp" width="850" height="472" class="img_ev3q"></p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="comment-ça-marche-">Comment ça marche ?<a href="https://blog.zatsit.fr/green-consommation-energie#comment-%C3%A7a-marche-" class="hash-link" aria-label="Lien direct vers Comment ça marche ?" title="Lien direct vers Comment ça marche ?" translate="no">​</a></h2>
<p>Concrètement, quels sont les moyens de refroidissement d'un datacenter et comment fonctionnent-t-ils ?</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="par-air">Par air<a href="https://blog.zatsit.fr/green-consommation-energie#par-air" class="hash-link" aria-label="Lien direct vers Par air" title="Lien direct vers Par air" translate="no">​</a></h3>
<p>Sans rentrer dans des détails trop complexes, le refroidissement par air est la méthode la plus courante, même si ce n'est pas la plus efficace. Il consiste à faire circuler de l'air frais.</p>
<p>Les <em><strong>CRAC</strong></em> (Computer Room Air Conditioning) fonctionnent comme la climatisation domestique ou en automobile et nécessitent un compresseur et un liquide réfrigérant (pour faire simple encore une fois).</p>
<p>Les <em><strong>CRAH</strong></em> (Computer Room Air Handler) utilisent de l’eau glacée fournie par un refroidisseur central pour refroidir l’air via un échangeur thermique, avant de le redistribuer dans la salle des serveurs.
(Vous noterez qu'on commence déjà à consommer de l'eau avec cette dernière technique).</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="par-eau">Par eau<a href="https://blog.zatsit.fr/green-consommation-energie#par-eau" class="hash-link" aria-label="Lien direct vers Par eau" title="Lien direct vers Par eau" translate="no">​</a></h3>
<p>Le "liquid cooling" va donc faire circuler du liquide au plus près des composants pour "absorber" la chaleur. On distingue des sous-catégories comme
<em><strong>in-rack</strong></em> (à l’intérieur des baies), <em><strong>direct-to-chip</strong></em> (refroidissement directement aux processeurs) et <em><strong>immersion cooling</strong></em> (serveurs plongés dans un fluide).
<img decoding="async" loading="lazy" alt="dc_evaporative-cooling-system" src="https://blog.zatsit.fr/assets/images/dc_evaporative-cooling-system_0-00551c2704a63e4cefe0f06daa61eac1.webp" width="1350" height="532" class="img_ev3q">
Système de refroidissement par évaporation.
<em>Source : <a href="https://www.energy.gov/femp/cooling-water-efficiency-opportunities-federal-data-centers" target="_blank" rel="noopener noreferrer" class="">https://www.energy.gov/femp/cooling-water-efficiency-opportunities-federal-data-centers</a></em></p>
<p>Pour l'immersion, on vient donc installer des équipements directement dans l'eau, on ne la pompe pas à un endroit pour l'acheminer à un autre.</p>
<p>Vous vous souvenez peut-être du projet "Natick" de Microsoft et son cylindre de 12 mètres embarquant plus de 800 serveurs au large de l'Écosse. L'expérimentation
devait permettre aussi de réaliser des batteries de tests et de mesures et non uniquement de refroidir un datacenter. Elle n'a pas été développée à l'échelle pour Microsoft.</p>
<p>En revanche, la Chine a de son côté lancé plusieurs projets, dont un inauguré en ce mois d'octobre.
Une structure immergée de 1 300 tonnes pour héberger des services numériques. Ce centre utilise l’eau de mer pour refroidir les serveurs, ce qui réduit fortement la consommation d’énergie liée donc à la climatisation.
Il s’agit d’une étape stratégique dans la volonté chinoise d’expérimenter des infrastructures numériques plus durables et innovantes. La réduction d'énergie destinée au refroidissement est à contrebalancer avec les efforts fournis
pour une telle structure et ses effets sur l'écosystème local.</p>
<p>Face aux besoins croissants en eau, les géants du numérique déploient des trésors d'ingéniosité... en communication (mais pas que).</p>
<p>On nous parle de "water positivity", de "compensation hydrique", de "WUE" (Water Usage Effectiveness). Des termes bien techniques pour noyer le poisson, si vous me permettez l'expression.
Dans <a href="https://www.aboutamazon.com/news/sustainability/amazon-water-replenishment-projects-brazil-chile-china-us" target="_blank" rel="noopener noreferrer" class="">cet article</a>, on apprend qu'Amazon finance des projets de restitution et de gestion durable de l'eau dans les pays où elle installe de nouveaux datacenters.
Des nouveaux pays de destination qui ne sont pas forcément connus pour être les plus excédentaires en eau, comble de l'ironie.
Il y a du positif localement, mais on est en droit de s'interroger sur la transparence dans les calculs, sur le suivi à long terme que requiert ce genre d'installations... Affaire à suivre donc.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mesurer-pour-mieux-gérer--le-rôle-du-wue">Mesurer pour mieux gérer : le rôle du WUE<a href="https://blog.zatsit.fr/green-consommation-energie#mesurer-pour-mieux-g%C3%A9rer--le-r%C3%B4le-du-wue" class="hash-link" aria-label="Lien direct vers Mesurer pour mieux gérer : le rôle du WUE" title="Lien direct vers Mesurer pour mieux gérer : le rôle du WUE" translate="no">​</a></h2>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>WUE</mtext><mo>=</mo><mfrac><mtext>Annual&nbsp;Site&nbsp;Water&nbsp;Usage&nbsp;(liters)</mtext><mtext>IT&nbsp;Equipment&nbsp;Annual&nbsp;Energy&nbsp;Use&nbsp;(kWh)</mtext></mfrac></mrow><annotation encoding="application/x-tex">\text{WUE} = \frac{\text{Annual Site Water Usage (liters)}}{\text{IT Equipment Annual Energy Use (kWh)}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord text"><span class="mord">WUE</span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord text"><span class="mord">IT&nbsp;Equipment&nbsp;Annual&nbsp;Energy&nbsp;Use&nbsp;(kWh)</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord text"><span class="mord">Annual&nbsp;Site&nbsp;Water&nbsp;Usage&nbsp;(liters)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span>
<p>La filière tech utilise aussi la métrique WUE (Water Usage Effectiveness) — développée par The Green Grid — pour comparer l’efficacité hydrique des datacenters (litres d’eau consommés par kWh IT ou par unité d’énergie IT).
WUE aide à normaliser et à comparer, mais beaucoup d’opérateurs ne publient pas ces métriques et les définitions (direct vs indirect) varient.
D’où une demande croissante pour des obligations de reporting plus strictes (réglementaires et de marché).</p>
<p>La réalité, c'est que l'explosion de l'intelligence artificielle (telle que designée aujourd'hui) et de nos usages numériques ne fait qu'aggraver la situation.
Les promesses de "datacenters verts" qui réutilisent la chaleur pour chauffer des piscines ou des logements ne sont pas faciles à mettre en œuvre (comme à l'université d'Oldenburg où le datacenter réchauffe des bâtiments et la piscine).
C'est aussi la promesse faite pendant les 15 prochaines années du <a href="https://www.datacenterknowledge.com/sustainability/paris-2024-excess-data-center-heat-used-to-warm-olympic-swimming-pools" target="_blank" rel="noopener noreferrer" class="">datacenter Equinix PA10</a> qui transférera le surplus de chaleur à la ZAC de la Plaine Saulnier et au Centre aquatique olympique".</p>
<p>Nul doute que nous continuerons à faire des progrès dans la réutilisation de l'eau ou dans l'efficacité de sa consommation, mais ça ne s'attaque pas au fond du problème de notre soif croissante en puissance de calcul.</p>
<p>Vous l'aurez compris, derrière la promesse d'un "cloud immatériel" se cache un dédale de tuyau, de pompes et de circuits bien réels.
À l'heure où tout le monde propose de l'IA gourmande dans ses produits numériques, où le moindre objet est connecté, collecte de la donnée pour la traiter ou simplement la collecter... Il est difficile d'imaginer que nous arriverons à économiser la deuxième ressource la plus importante après l'oxygène pour la majorité des êtres qui peuplent notre grande bleue.</p>
<p>Pourtant, tout n’est pas perdu. De la conception de puces moins énergivores à la relocalisation des serveurs dans des zones plus froides,
des ingénieurs et chercheurs s’efforcent d’inventer un numérique plus sobre, plus conscient de ses limites.</p>
<p>L’espoir ne réside peut-être pas dans la promesse d’un datacenter "vert", mais dans notre capacité collective à réapprendre la mesure, à reconnaître que chaque requête, chaque clic, chaque flux vidéo a un coût réel.</p>
<p>Vous avez appris à fermer le robinet quand vous vous brossez les dents, à réduire votre temps de douche, à arroser le potager le soir en plein été... vous penserez peut-être aussi à l'eau maintenant en consommant des services numériques.</p>
<p>Si vous souhaitez consulter plus de sources pour apporter de l'eau à votre moulin, consultez ces pages :</p>
<ul>
<li class=""><a href="https://www.eesi.org/articles/view/data-center-energy-needs-are-upending-power-grids-and-threatening-the-climate" target="_blank" rel="noopener noreferrer" class="">https://www.eesi.org/articles/view/data-center-energy-needs-are-upending-power-grids-and-threatening-the-climate</a></li>
<li class=""><a href="https://www.researchgate.net/figure/Analysis-of-power-consumption-proportionality-in-data-center-8-24_fig4_355862079" target="_blank" rel="noopener noreferrer" class="">https://www.researchgate.net/figure/Analysis-of-power-consumption-proportionality-in-data-center-8-24_fig4_355862079</a></li>
<li class=""><a href="https://bonpote.com/intelligence-artificielle-le-vrai-cout-environnemental-de-la-course-a-lia/#La_consommation_deau" target="_blank" rel="noopener noreferrer" class="">https://bonpote.com/intelligence-artificielle-le-vrai-cout-environnemental-de-la-course-a-lia/#La_consommation_deau</a></li>
<li class=""><a href="https://grist.org/technology/amazon-data-centers-water-positive-energy/" target="_blank" rel="noopener noreferrer" class="">Amazon says it’s going ‘water positive’ — but there’s a problem</a></li>
<li class=""><a href="https://www.eesi.org/articles/view/data-centers-and-water-consumption" target="_blank" rel="noopener noreferrer" class="">Data Centers and Water Consumption</a></li>
<li class=""><a href="https://www.techtarget.com/searchdatacenter/tip/Data-center-cooling-systems-and-technologies-and-how-they-work?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer" class="">Data center cooling systems and technologies and how they work</a></li>
<li class=""><a href="https://www.iceotope.com/learning-hub/insights/an-introduction-to-how-data-centers-are-cooled/?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer" class="">An introduction to how data centers are cooled</a></li>
<li class=""><a href="https://www.techtarget.com/searchdatacenter/definition/computer-room-air-conditioning-unit" target="_blank" rel="noopener noreferrer" class="">What is computer room air conditioning (CRAC)? CRAC vs. CRAH unit differences?</a></li>
<li class=""><a href="https://www.lemondeinformatique.fr/actualites/lire-microsoft-abandonne-son-projet-de-datacenter-sous-marin-94098.html" target="_blank" rel="noopener noreferrer" class="">Microsoft abandonne son projet de datacenter sous-marin</a></li>
<li class=""><a href="https://www.telecomreviewasia.com/news/industry-news/26599-china-opens-first-ever-underwater-data-center-for-commerce/?utm_source=chatgpt.com" target="_blank" rel="noopener noreferrer" class="">China Opens First-Ever Underwater Data Center for Commerce</a></li>
<li class=""><a href="https://www.datacenterdynamics.com/en/news/university-of-oldenburg-reuses-heat-from-data-center-in-germany" target="_blank" rel="noopener noreferrer" class="">Datacenter de l'université Oldenbug</a></li>
</ul>]]></content:encoded>
            <category>green</category>
            <category>tech</category>
        </item>
        <item>
            <title><![CDATA[IA et consommation énergétique]]></title>
            <link>https://blog.zatsit.fr/ia-et-consommation-energetique</link>
            <guid>https://blog.zatsit.fr/ia-et-consommation-energetique</guid>
            <pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Depuis plusieurs mois nous entendons parler dans les médias de la consommation énergétique inquiétante de l'Intelligence Artificielle (IA). Cette alerte fait désormais partie de notre quotidien, et j'en suis venu à me poser plusieurs questions : quelle est la consommation d'un prompt ChatGPT ? Combien faut-il de prompts pour obtenir l'équivalent d'un plein d'essence ? Ou encore, combien de prompts faut-il pour consommer l'équivalent en euro d'un abonnement Netflix ?]]></description>
            <content:encoded><![CDATA[<p>Depuis plusieurs mois nous entendons parler dans les médias de la consommation énergétique inquiétante de l'Intelligence Artificielle (IA). Cette alerte fait désormais partie de notre quotidien, et j'en suis venu à me poser plusieurs questions : quelle est la consommation d'un prompt ChatGPT ? Combien faut-il de prompts pour obtenir l'équivalent d'un plein d'essence ? Ou encore, combien de prompts faut-il pour consommer l'équivalent en euro d'un abonnement Netflix ?</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="contexte-et-introduction">Contexte et introduction<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#contexte-et-introduction" class="hash-link" aria-label="Lien direct vers Contexte et introduction" title="Lien direct vers Contexte et introduction" translate="no">​</a></h2>
<p>Avant de commencer à se pencher sur le sujet, il nous faut remettre un peu de contexte. Bien que l'IA existe depuis de nombreuses années, comme le montre, par exemple, l'ordinateur <a href="https://fr.wikipedia.org/wiki/Deep_Blue" target="_blank" rel="noopener noreferrer" class="">Deep Blue</a> qui a été le premier à vaincre le champion du monde d'échecs en 1997, ou encore <a href="https://fr.wikipedia.org/wiki/Deep_Thought_(ordinateur_d'%C3%A9checs)" target="_blank" rel="noopener noreferrer" class="">Deep Thought</a> qui est le premier ordinateur conçu pour jouer aux échecs, c'est avec l'apparition des chatbots se basant sur les LLM et ouverts au grand public, tel que ChatGPT, en 2022 que l'utilisation de l'IA a explosé. Si avant elle était réservée à des domaines précis et particuliers, aujourd'hui tout le monde peut l'utiliser en quelques clics, que cela soit sur son ordinateur ou son téléphone.</p>
<p>C'est cette ouverture au monde qui a poussé une consommation énergétique importante de l'IA. Et cette consommation ne s'exprime pas uniquement par le nombre de prompts faits par jour, mais aussi par l'énergie utilisée par les datacenters, le réseau, les serveurs lors des entrainements et bien d'autres paramètres encore. Malheureusement, l'ensemble de ces données sont difficilement trouvables et calculables. Pourtant nous savons que l'impact est réel, comme l'admet Google dans son <a href="https://blog.google/outreach-initiatives/sustainability/2024-environmental-report/" target="_blank" rel="noopener noreferrer" class="">rapport environnemental de 2024</a> :</p>
<blockquote>
<p><em>In 2023, our total GHG emissions were 14.3 million tCO2e, representing a 13% year-over-year increase and a 48% increase compared to our 2019 target base year. <br>
This result was primarily due to increases in data center energy consumption and supply chain emissions. As we further integrate AI into our products, reducing emissions may be challenging due to increasing energy demands from the greater intensity of AI compute, and the emissions associated with the expected increases in our technical infrastructure investment.</em></p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="Infographie sur la consommation des datacenters pour l&amp;#39;IA" src="https://blog.zatsit.fr/assets/images/infographie-ia-datacenters-crypto-conso-electrique-7ddccaade297edcc172c539dd40f2ac6.webp" width="3600" height="2880" class="img_ev3q">
</p><center><i>Sources : Média Basta! &amp; l'Agence Internationalle de l'énergie</i></center><br><p></p>
<p>Il est compliqué de connaître exactement l'impact total de ces IA sur l'environnement au travers de sa consommation énergétique. Il y a de nombreux facteurs à prendre en compte et pour cet article, nous avons choisi de nous limiter. Veuillez prendre en compte que les chiffres que nous allons présenter et étudier se basent principalement sur la consommation énergétique des prompts. C'est-à-dire, sur ce qui est dépensé lorsque nous réalisons une demande à ChatGPT ou une IA similaire.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="consommation-énergétique-dun-prompt">Consommation énergétique d'un prompt<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#consommation-%C3%A9nerg%C3%A9tique-dun-prompt" class="hash-link" aria-label="Lien direct vers Consommation énergétique d'un prompt" title="Lien direct vers Consommation énergétique d'un prompt" translate="no">​</a></h2>
<p>La consommation énergétique exacte d'un prompt en IA n'est pas connue. Cependant, selon un <a href="https://www.sciencedirect.com/science/article/pii/S2542435123003653?dgcid=author" target="_blank" rel="noopener noreferrer" class="">article de ScienceDirect</a>, une requête ChatGPT consomme environ 2,9 Wh d’électricité, soit presque dix fois plus qu’une simple recherche Google  estimée à 0,3 Wh. Nous pouvons aussi citer la <a href="https://drane-versailles.region-academique-idf.fr/spip.php?article1167" target="_blank" rel="noopener noreferrer" class="">Délégation Régionale Académique au Numérique Educatif</a> qui nous informe qu'une requête d’environ 400 <a href="https://www.brume.ai/definition-token-ia" target="_blank" rel="noopener noreferrer" class="">tokens</a> sur ChatGPT / GPT-4o mini consomme environ 2 Wh d’électricité, soit plus de 6 fois la consommation d’une recherche Google classique.</p>
<p>Un prompt venant remplacer une simple recherche internet consomme donc 6 à 10 fois l'énergie qui aurait été utilisée si vous l'aviez faite à la main sur Google par exemple.</p>
<p>Mais alors, est-ce que la consommation énergétique de toutes nos actions est multipliée par 10 lorsque nous utilisons l'IA ? Existe-t-il d'autres comparatifs ?</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="différentes-comparaisons-de-consommations-énergétiques">Différentes comparaisons de consommations énergétiques<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#diff%C3%A9rentes-comparaisons-de-consommations-%C3%A9nerg%C3%A9tiques" class="hash-link" aria-label="Lien direct vers Différentes comparaisons de consommations énergétiques" title="Lien direct vers Différentes comparaisons de consommations énergétiques" translate="no">​</a></h2>
<p>En prenant le temps de quelques recherches sur le web (à l'ancienne), il est possible de trouver de nombreuses comparaisons entre la consommation des prompts et d'autres outils ou objets fonctionnant à l'électricité, tout comme le montre l'infographie ci-dessous crée par le <a href="https://basta.media/" target="_blank" rel="noopener noreferrer" class="">média indépendant Basta!</a> à l'aide des informations regroupées par Hugging Face, l'Université de Carnegie Mallon et Futura sciences:
<img decoding="async" loading="lazy" alt="Infographie que l&amp;#39;usage massif de l&amp;#39;IA" src="https://blog.zatsit.fr/assets/images/infographie-usage-massif-intelligence-artificielle-711916a9cc1d1222a926c6aee5fd4449.webp" width="2849" height="2279" class="img_ev3q"></p>
<p>Ces images sont très intéressantes, mais d’un point de vue personnel, elles ne me parlent que peu. C’est pour cela nous allons vous présenter plusieurs cas différents et les comparer à l'énergie consommée par un plein d’essence ou au prix d’un abonnement Netflix.</p>
<p>Pour l'ensemble de ces tests, nous nous baserons sur les informations suivantes :</p>
<ul>
<li class="">Une recherche Google vaut 0,3 Wh</li>
<li class="">Les informations fournies par <a href="https://huggingface.co/spaces/genai-impact/ecologits-calculator" target="_blank" rel="noopener noreferrer" class="">EcoLogits</a> seront notre référence</li>
<li class="">Nous arrondirons toujours les résultats à l'entier supérieur</li>
<li class="">Notre voiture de tests, une familiale moyenne, a un réservoir de 50 litres</li>
<li class="">Un litre d’essence contient l’énergie équivalant à 8,9 kWh d’électricité</li>
<li class="">Notre abonnement Netflix est un abonnement Standard à 14,99€/mois</li>
<li class="">Nous baserons le prix du kWh à 0.2016€ TTC</li>
</ul>
<p>En indicatif, nous ajouterons aussi le temps d'une vidéo en streaming dont la consommation énergétique est équivalente à un prompt.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="écrire-un-mail-170-output-tokens">Écrire un mail (170 output tokens)<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#%C3%A9crire-un-mail-170-output-tokens" class="hash-link" aria-label="Lien direct vers Écrire un mail (170 output tokens)" title="Lien direct vers Écrire un mail (170 output tokens)" translate="no">​</a></h3>
<p>Dans cet exemple, nous allons utiliser une demande de génération d'un email simple.</p>
<p>Voici une sortie d'environ 170 tokens :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Objet : Demande de réunion pour suivi du projet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Bonjour Madame Dupont,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">J’espère que vous allez bien. Je vous écris afin de convenir d’une réunion pour faire un point d’étape sur l’avancement du projet “Nova”. Nous souhaiterions vous présenter les dernières évolutions ainsi que les prochaines étapes envisagées.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Auriez-vous des disponibilités cette semaine ou en début de semaine prochaine ? Une réunion d’une trentaine de minutes suffirait.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Merci par avance pour votre retour.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Bien cordialement,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Julien Martin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Chef de projet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">julien.martin@exemple.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+33 6 00 00 00 00</span><br></span></code></pre></div></div>
<p>Et voici combien de prompts il faudrait effectuer afin d'atteindre les objectifs que nous nous sommes fixés :</p>
<table><thead><tr><th>Modèle</th><th>Consommation estimée en Wh</th><th>Temps équivalent d'une vidéo en streaming</th><th>Nombre de recherches Google</th><th>Consommer un litre d'essence</th><th>Remplir un réservoir de voiture</th><th>Un mois d'abonnement à Netflix</th></tr></thead><tbody><tr><td>ChatGPT 4o</td><td>14,9</td><td>8,52 min</td><td>50</td><td>598</td><td>29 866</td><td>4 991</td></tr><tr><td>Claude 3.7 Sonnet</td><td>14,9</td><td>8,52 min</td><td>50</td><td>598</td><td>29 866</td><td>4 991</td></tr><tr><td>Google Gemini 2.0 Flash</td><td>1,52</td><td>52,3 s</td><td>6</td><td>5 856</td><td>29 2764</td><td>48 918</td></tr><tr><td>Meta Llama 3.1 8B</td><td>0,641</td><td>22,2 s</td><td>3</td><td>13 885</td><td>694 228</td><td>115 999</td></tr><tr><td>Meta Llama 3.1 70B</td><td>2,13</td><td>1,22 min</td><td>8</td><td>4 179</td><td>208 921</td><td>34 909</td></tr><tr><td>Meta Llama 3.1 405B</td><td>40,5</td><td>23,1 min</td><td>135</td><td>220</td><td>10 988</td><td>1 836</td></tr><tr><td>Mixtral 8x7B v0.1</td><td>0,757</td><td>26,1 s</td><td>3</td><td>11 757</td><td>587 847</td><td>98 224</td></tr><tr><td>Mixtral 8x22B v0.1</td><td>2,76</td><td>1,58 min</td><td>10</td><td>3 225</td><td>161 232</td><td>26 941</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="avoir-une-petite-conversation-400-output-tokens">Avoir une petite conversation (400 output tokens)<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#avoir-une-petite-conversation-400-output-tokens" class="hash-link" aria-label="Lien direct vers Avoir une petite conversation (400 output tokens)" title="Lien direct vers Avoir une petite conversation (400 output tokens)" translate="no">​</a></h3>
<p>Cet exemple nous montre les équivalences pour une petite conversation avec notre modèle d'IA favoris.</p>
<p>Comme il est compliqué de vous montrer une conversation complète, voici une sortie d'environ 400 tokens :</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Objet : Suivi d’avancement et prochaines étapes du projet Orion</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Bonjour à toutes et à tous,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Je vous écris afin de partager un point d’étape sur le projet Orion, dont le développement avance conformément au calendrier prévisionnel établi en début d’année.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">À ce jour, les modules suivants sont finalisés :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Interface de gestion utilisateur</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Système d’authentification renforcée</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Intégration de l’API partenaire</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">L’équipe développement est actuellement focalisée sur le volet analytique et l’optimisation de la base de données. Ces tâches devraient être complétées d’ici la fin du mois.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Du côté des tests utilisateurs, une première session a eu lieu la semaine dernière. Les retours ont été globalement positifs, notamment sur la fluidité de navigation et la clarté des écrans. Quelques ajustements sont prévus, en particulier sur la vitesse de chargement des rapports.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Voici les prochaines étapes :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Finalisation des développements restants d’ici le 28 juin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Phase de tests complète (2 semaines) à partir du 1er juillet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Livraison de la version stable prévue pour le 15 juillet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Nous organiserons une réunion d’équipe le jeudi 20 juin à 10h pour faire le point ensemble, répondre à vos questions, et ajuster si besoin le plan de charge.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Merci à chacun d’entre vous pour votre implication continue dans ce projet structurant pour l’entreprise. Je reste bien sûr disponible si vous avez des remarques ou demandes spécifiques d’ici là.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Bien cordialement,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Nicolas Petit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Chef de projet – Programme Orion</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nicolas.petit@exemple.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+33 6 01 02 03 04</span><br></span></code></pre></div></div>
<p>Et ci-dessous les résultats de nos calculs :</p>
<table><thead><tr><th>Modèle</th><th>Consommation estimée en Wh</th><th>Temps équivalent d'une vidéo en streaming</th><th>Nombre de recherches Google</th><th>Consommer un litre d'essence</th><th>Remplir un réservoir de voiture</th><th>Un mois d'abonnement à Netflix</th></tr></thead><tbody><tr><td>ChatGPT 4o</td><td>35,1</td><td>20,1 min</td><td>117</td><td>254</td><td>12 679</td><td>2 119</td></tr><tr><td>Claude 3.7 Sonnet</td><td>35,1</td><td>20,1 min</td><td>117</td><td>254</td><td>12 679</td><td>2 119</td></tr><tr><td>Google Gemini 2.0 Flash</td><td>3,58</td><td>2,05 min</td><td>12</td><td>2 487</td><td>124 302</td><td>20 770</td></tr><tr><td>Meta Llama 3.1 8B</td><td>1,51</td><td>52,2 s</td><td>6</td><td>5 895</td><td>294 702</td><td>49 242</td></tr><tr><td>Meta Llama 3.1 70B</td><td>5,02</td><td>2,87 min</td><td>17</td><td>1 773</td><td>88 646</td><td>14 812</td></tr><tr><td>Meta Llama 3.1 405B</td><td>95,4</td><td>54,4 min</td><td>318</td><td>94</td><td>4 665</td><td>780</td></tr><tr><td>Mixtral 8x7B v0.1</td><td>1,78</td><td>1,03 min</td><td>6</td><td>5 000</td><td>250 000</td><td>41 773</td></tr><tr><td>Mixtral 8x22B v0.1</td><td>6,51</td><td>3,73 min</td><td>22</td><td>1 368</td><td>68 357</td><td>11 422</td></tr></tbody></table>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="écrire-du-code-15-000-output-tokens">Écrire du code (15 000 output tokens)<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#%C3%A9crire-du-code-15-000-output-tokens" class="hash-link" aria-label="Lien direct vers Écrire du code (15 000 output tokens)" title="Lien direct vers Écrire du code (15 000 output tokens)" translate="no">​</a></h3>
<p>Pour cet exemple, il aurait été souhaitable d'obtenir un code en 15 000 tokens, mais en réalisant la demande aurpès de ChatGTP, voici le résultat qui a été obtenu :</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Créer un </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">code Java de 15 000 tokens exactement</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> est possible, mais il demande une approche rigoureuse car cela correspond à un </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">très long fichier source</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">, d’environ :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">50 000 à 60 000 caractères</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> (variable selon le style du code),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> plusieurs </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">centaines voire milliers de lignes de code</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> ✅ Avant de générer cela, quelques questions importantes :</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">1.</span><span class="token plain"> </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">Souhaites-tu un programme fonctionnel</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> (par exemple, une application de gestion, un simulateur, etc.) ou est-ce purement une </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">fresque de code longue</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> (boucles, classes, commentaires) visant juste à atteindre 15 000 tokens ?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">2.</span><span class="token plain"> As-tu une </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">préférence de thème</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> ? Exemples :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Gestion d’une bibliothèque</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Jeu en ligne de commande</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Système de messagerie</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Générateur de fractales</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Algo de machine learning simplifié en Java</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">3.</span><span class="token plain"> Comment veux-tu </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">récupérer le code</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> ?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Le coller ici (ça sera découpé en parties)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Le mettre dans un fichier téléchargeable (</span><span class="token code-snippet code keyword" style="color:#00009f">`.java`</span><span class="token plain">) ?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">###</span><span class="token title important"> 📌 Exemple de plan pour un code de 15 000 tokens</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Pour te donner une idée de structure :</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`Main.java`</span><span class="token plain"> (point d’entrée)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`AppManager.java`</span><span class="token plain"> (gestion générale)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`User.java`</span><span class="token plain">, </span><span class="token code-snippet code keyword" style="color:#00009f">`Book.java`</span><span class="token plain"> (classes métier)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`Database.java`</span><span class="token plain"> (fausse base de données en mémoire)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> </span><span class="token code-snippet code keyword" style="color:#00009f">`Utils.java`</span><span class="token plain"> (fonctions utilitaires)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">*</span><span class="token plain"> Beaucoup de commentaires, logs, tests unitaires en bas, etc.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token hr punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Souhaites-tu que je commence à générer ce code maintenant par blocs (et te donne une estimation exacte de tokens pour chaque partie), ou veux-tu un </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">fichier Java de 15 000 tokens généré directement</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> ?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token blockquote punctuation" style="color:#393A34">&gt;</span><span class="token plain"> ⚠️ À noter : ici dans l'interface, les messages sont limités (≈ 4 000 tokens max par message). Donc je devrai </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">te l’envoyer en plusieurs blocs</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> ou te proposer un </span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">fichier </span><span class="token bold content code-snippet code keyword" style="color:#00009f">`.java`</span><span class="token bold content"> complet</span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token plain"> à télécharger. Quelle option préfères-tu ?</span><br></span></code></pre></div></div>
<p>Mais il est tout de même possible de calculer des équivalences :</p>
<table><thead><tr><th>Modèle</th><th>Consommation estimée en Wh</th><th>Temps équivalent d'une vidéo en streaming</th><th>Recherches Google</th><th>Consommer un litre d'essence</th><th>Remplir un réservoir de voiture</th><th>Un mois d'abonnement à Netflix</th></tr></thead><tbody><tr><td>ChatGPT 4o</td><td>1320</td><td>12,5 h</td><td>4 400</td><td>7</td><td>338</td><td>57</td></tr><tr><td>Claude 3.7 Sonnet</td><td>1320</td><td>12,5 h</td><td>4 400</td><td>7</td><td>338</td><td>57</td></tr><tr><td>Google Gemini 2.0 Flash</td><td>134</td><td>1,28 h</td><td>447</td><td>67</td><td>3 321</td><td>555</td></tr><tr><td>Meta Llama 3.1 8B</td><td>56,6</td><td>32,6 min</td><td>189</td><td>158</td><td>7 863</td><td>1 314</td></tr><tr><td>Meta Llama 3.1 70B</td><td>188</td><td>1,79 h</td><td>627</td><td>48</td><td>2 368</td><td>396</td></tr><tr><td>Meta Llama 3.1 405B</td><td>3580</td><td>34 h</td><td>11 934</td><td>3</td><td>125</td><td>21</td></tr><tr><td>Mixtral 8x7B v0.1</td><td>66,8</td><td>38,4 min</td><td>223</td><td>134</td><td>6 662</td><td>1 114</td></tr><tr><td>Mixtral 8x22B v0.1</td><td>244</td><td>2,33 h</td><td>814</td><td>37</td><td>1 824</td><td>305</td></tr></tbody></table>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#conclusion" class="hash-link" aria-label="Lien direct vers Conclusion" title="Lien direct vers Conclusion" translate="no">​</a></h2>
<p>La consommation d'un modèle dépend de beaucoup de choses comme son nombre de paramètres d'entrée, et plus la sortie est grande, plus l'IA consomme d'énergie. Comme nous l'avons dit en introduction, utiliser l'IA ne fait qu'augmenter cette consommation. N'oublions pas non plus que nous n'avons pas pris en compte la consommation énergétique des appels sur le réseau ou encore de l'entrainement des IA.</p>
<p>L'objectif de cet article n'est pas de demander à arrêter d'utiliser l'IA, mais à venir nous sensibiliser sur les impacts énergétiques de cette dernière afin que nous puissions l'utiliser plus intelligemment. Arrêtons de tout lui demander dès que nous faisons face à un problème. Si ce dernier peut être résolu avec une simple recherche Google, privilégions là. Servons-nous de l'IA pour les tâches les plus complexes au lieu de nous demander de synthétiser la documentation d'un programme. À l'inverse, si nous devons utiliser une IA, essayons de prendre le modèle le plus pertinent et spécialisé possible. Ainsi, notre consommation énergétique sera réduite au maximum.</p>
<p>Il est aujourd'hui courant de voir dans son entourage un développeur junior qui pose des questions à l'IA plusieurs fois par jour. Ou encore il y a eu l'apparition du vibe coding où l'IA a une place importante dans l'ensemble du processus de création.</p>
<p>Essayons simplement d'être un peu plus intelligents dans nos utilisations de l'IA et ne laissons pas mourir les forums communautaires comme StackOverflow en posant toujours plus de questions dont la réponse n'existe pas encore !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cela-peut-aussi-vous-intéresser">Cela peut aussi vous intéresser<a href="https://blog.zatsit.fr/ia-et-consommation-energetique#cela-peut-aussi-vous-int%C3%A9resser" class="hash-link" aria-label="Lien direct vers Cela peut aussi vous intéresser" title="Lien direct vers Cela peut aussi vous intéresser" translate="no">​</a></h2>
<p>Si vous souhaitez approfondir le sujet ou mettre en place des solutions de votre côté, voici des pistes afin d'aller plus loin :</p>
<ul>
<li class=""><a href="https://blog.zatsit.fr/blog/local-ai-assistant-in-vscode" target="_blank" rel="noopener noreferrer" class="">Utiliser votre assistant IA en local</a> : un autre article de notre blog afin de vous aider à installer une IA en local et l'intégrer dans un IDE</li>
<li class=""><a href="https://www.lecese.fr/travaux-publies/impacts-de-lintelligence-artificielle-risques-et-opportunites-pour-lenvironnement" target="_blank" rel="noopener noreferrer" class="">Impacts de l’intelligence artificielle : risques et opportunités pour l’environnement</a> : avis du Conseil Economique Social et Environnemental sur les impacts de l'IA sur l'environnement</li>
<li class=""><a href="https://drane-versailles.region-academique-idf.fr/spip.php?article1167" target="_blank" rel="noopener noreferrer" class="">Quel est l’impact environnemental d’une IA générative ?</a> : un article plus complet sur l'impact environnemental de l'IA</li>
<li class=""><a href="https://www.youtube.com/watch?v=LNoklk0NRmQ" target="_blank" rel="noopener noreferrer" class="">Comment ChatGPT assoiffe cette population</a> : une vidéo de 10 min par Léo Duff expliquant l'impact de l'utilisation de l'eau pour les datacenters des IA</li>
<li class=""><a href="https://www.comparia.beta.gouv.fr/" target="_blank" rel="noopener noreferrer" class="">compar<!-- -->:IA</a> : un site vous permettant d'analyser le comportement de deux IA et de les comparer. Vous pouvez obtenir des informations sur l'impact environnemental de la requête comme présentée ci-dessous
<img decoding="async" loading="lazy" alt="Résultats par compar" src="https://blog.zatsit.fr/assets/images/impact_energie_ia-8286b0bc2b5538a88d775cad1f51fa62.webp" width="1274" height="595" class="img_ev3q"></li>
</ul>]]></content:encoded>
            <category>ai</category>
            <category>environnement</category>
        </item>
        <item>
            <title><![CDATA[Nous sommes Entreprise à Mission]]></title>
            <link>https://blog.zatsit.fr/entreprise-a-mission</link>
            <guid>https://blog.zatsit.fr/entreprise-a-mission</guid>
            <pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Quand nous avons cofondé zatsit, nous ne voulions pas créer une énième ESN. Le marché n’en manque pas et il en existe déjà beaucoup. Trop peut-être.]]></description>
            <content:encoded><![CDATA[<p>Quand nous avons cofondé <strong>zatsit</strong>, nous ne voulions pas créer une énième ESN. Le marché n’en manque pas et il en existe déjà beaucoup. Trop peut-être.</p>
<p>Ce que nous voulions, c’était <strong>faire émerger une autre façon d’entreprendre, dans le numérique</strong>.</p>
<p>Une façon plus humaine, plus responsable, plus engagée.</p>
<p>Nous sommes convaincus que la tech peut – et doit – être un levier d’impact positif. Pour nos clients, pour la société, pour l’environnement.</p>
<p>C’est cette conviction qui nous a poussés à faire de <strong>zatsit, une entreprise à mission</strong>, et à inscrire noir sur blanc notre raison d’être dans nos statuts.</p>
<h1>Notre raison d’être</h1>
<p><strong>“Engager notre expertise numérique au service de l’impact des entreprises en créant un écosystème partenarial, durable et positif.”</strong></p>
<p>Cette phrase, c’est bien plus qu’une ligne dans un document juridique. C’est notre boussole, notre driver !</p>
<p>Elle nous engage, collectivement, à utiliser notre entreprise et la tech’ pour transformer le monde professionnel de manière <strong>durable</strong>, <strong>inclusive</strong> et <strong>vertueuse</strong>.</p>
<h1>Des engagements statutaires concrets</h1>
<p>Pour que notre mission prenne vie au quotidien, nous avons défini cinq engagements statutaires forts, gravés dans le marbre, qui structurent notre action :</p>
<ol>
<li class="">
<p><strong>Mettre l’impact environnemental au cœur de nos décisions et de nos actions</strong><br>
<!-- -->→ Cela signifie mesurer, arbitrer, réduire. Que ce soit dans nos déplacements, nos outils, ou nos choix technologiques, <strong>l’écologie n’est pas une option</strong>.</p>
</li>
<li class="">
<p><strong>Développer une organisation collaborative</strong><br>
<!-- -->→ Parce que nous croyons que <strong>l’intelligence collective dépasse la somme des expertises individuelles</strong>, nous construisons un modèle horizontal, avec une gouvernance partagée et transparente, où chacun a sa voix et peut contribuer.</p>
</li>
<li class="">
<p><strong>Développer des partenariats à impact positif sur la société</strong><br>
<!-- -->→ Nous travaillons avec des partenaires qui partagent notre vision d’une entreprise utile et engagée. Et nous nous engageons en ce sens également (exemple : programme Emergences)</p>
</li>
<li class="">
<p><strong>Accompagner nos clients à réduire l’impact écologique de leur IT</strong><br>
<!-- -->→ Optimisation des infrastructures, sobriété numérique, conseil responsable : nous mettons notre savoir-faire au service d’<strong>un numérique plus responsable et durable</strong>.</p>
</li>
<li class="">
<p><strong>Prendre soin de nos collaborateurs au quotidien</strong><br>
<!-- -->→ Parce que tout commence en interne, par ceux qui font l’entreprise !<br>
<!-- -->Qualité de vie au travail, écoute, équilibre de vie, transparence : nous cultivons <strong>un environnement sain et épanouissant</strong>.</p>
</li>
</ol>
<h1><strong>Un écosystème partenarial</strong></h1>
<p>Être une entreprise à mission, ce n’est pas être seul sur sa montagne. C’est, au contraire, s’inscrire dans un <strong>écosystème ouvert, co-construit, aligné</strong>.</p>
<p>Chez <strong>zatsit</strong>, nous fédérons une communauté d’entreprises, de clients, de partenaires et de talents qui croient qu’on peut faire de la tech autrement. <strong>Avec exigence, mais sans renoncer à nos valeurs.</strong></p>
<h1>Un numérique qui a du sens</h1>
<p>Notre métier, c’est le numérique et le service. Mais <strong>notre vocation</strong>, c’est d’en faire <strong>un levier d’impact positif pour la société et la planète</strong>.</p>
<p>Nous pensons qu’il est possible – et nécessaire – de réconcilier performance économique, innovation et engagement social et environnemental.</p>
<p><strong>zatsit</strong>, c’est notre réponse à cette nécessité.</p>
<h1>En résumé</h1>
<p>Nous avons créé <strong>zatsit</strong> comme entreprise à mission pour inscrire nos convictions dans la durée, dans le droit, et dans les faits.<br>
<!-- -->Nous sommes convaincus qu’il peut exister un modèle d’entreprise hybride entre capitalisme et économie sociale/environnementale.</p>
<p>Et aujourd’hui, nous avançons avec cette vision forte !</p>
<p>“Nous sommes des semeurs de graines !”</p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fentreprise-a-mission" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>general</category>
        </item>
        <item>
            <title><![CDATA[OpenRewrite : Automatiser les montées de version]]></title>
            <link>https://blog.zatsit.fr/openrewrite</link>
            <guid>https://blog.zatsit.fr/openrewrite</guid>
            <pubDate>Sun, 06 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Le serpent de mer des montées de version]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="le-serpent-de-mer-des-montées-de-version">Le serpent de mer des montées de version<a href="https://blog.zatsit.fr/openrewrite#le-serpent-de-mer-des-mont%C3%A9es-de-version" class="hash-link" aria-label="Lien direct vers Le serpent de mer des montées de version" title="Lien direct vers Le serpent de mer des montées de version" translate="no">​</a></h2>
<p>En tant que développeur·euse·s il n'est pas toujours facile de trouver le temps de maintenir à jour les versions des langages et des frameworks que l'on utilise.</p>
<p>Suivre le rythme des releases n'est pas toujours aisé, et on se retrouve souvent dans ce cercle vicieux : les montées de version mineures ne semblent pas suffisamment intéressantes pour que l'on prenne le temps de les faire. Alors on attend les majeures et les LTS...</p>
<p>Sauf qu'elles sont souvent plus coûteuses en temps et donc plus difficile à intégrer dans nos roadmaps (particulièrement quand elles n'apportent pas de plus value pour nos clients).</p>
<p>Alors on attend. Et généralement, on attend jusqu'à ce que l'on soit obligé de faire cette upgrade (à cause d'une faille de sécurité, de la fin de support, etc...)</p>
<p>Et quand on a attendu bien longtemps, ces montées de version deviennent (parfois) des monstres de complexité, entrainant (parfois) des effets de bords en cascade sur nos dépendances et mobilisant énormément de temps et d'efforts.</p>
<p>Efforts parfois compliqués à justifier face à nos clients :</p>
<blockquote>
<p>"Oui, j'ai passé tout le sprint sur la montée de version. Non, il n'y a aucune nouvelle fonctionnalité ou amélioration visible sur le produit. Non, je ne me fous pas de vous, pourquoi vous dites ça ?"</p>
</blockquote>
<p>Comment limiter le temps et les efforts que nous demandent ces montées de versions ? Avec <strong>OpenRewrite</strong>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="openrewrite-cest-quoi-">OpenRewrite, c'est quoi ?<a href="https://blog.zatsit.fr/openrewrite#openrewrite-cest-quoi-" class="hash-link" aria-label="Lien direct vers OpenRewrite, c'est quoi ?" title="Lien direct vers OpenRewrite, c'est quoi ?" translate="no">​</a></h2>
<p>Citons <a href="https://docs.openrewrite.org/" target="_blank" rel="noopener noreferrer" class="">la documentation officielle</a> :</p>
<blockquote>
<p>OpenRewrite est une solution open source de refactorisation automatisée, permettant aux développeurs d'éliminer efficacement la dette technique au sein de leurs dépôts.
Il se compose d'un moteur de refactorisation automatique qui exécute des recettes de refactorisation préemballées et open source pour les migrations de frameworks courantes, les corrections de sécurité et les tâches de cohérence stylistique – réduisant vos efforts de codage de plusieurs heures ou jours à quelques minutes.
Bien que l'accent initial ait été mis sur le langage Java, la communauté OpenRewrite ne cesse d'étendre la couverture des langages et des frameworks.</p>
</blockquote>
<p>On peut donc retenir que :</p>
<ol>
<li class="">c'est open source</li>
<li class="">ça refactorise le code en suivant des "<strong>recettes</strong>"</li>
<li class="">on peut utiliser des recettes open source ou écrire les siennes</li>
</ol>
<p>Développé au départ autour de l'environnement Java, OpenRewrite est compatible avec Maven et Gradle, permettant d'appliquer les recettes en une ligne de commande.</p>
<p>L'initiative propose également un système de "<strong>meta-recette</strong>" : des recettes composées de plusieurs recettes, comme <a href="https://docs.openrewrite.org/recipes/java/spring/boot3/upgradespringboot_3_4" target="_blank" rel="noopener noreferrer" class="">celle-ci, pour passer à Spring Boot 3.4</a> ou encore <a href="https://docs.openrewrite.org/recipes/java/migrate/upgradetojava21" target="_blank" rel="noopener noreferrer" class="">celle-là pour passer en java 21</a>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p>Le <a href="https://docs.openrewrite.org/running-recipes/getting-started" target="_blank" rel="noopener noreferrer" class="">plugin Maven OpenRewrite</a> permet également d'ajouter des recettes ou des meta-recettes les unes à la suite des autres.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="avec-un-exemple-cest-plus-parlant">Avec un exemple, c'est plus parlant<a href="https://blog.zatsit.fr/openrewrite#avec-un-exemple-cest-plus-parlant" class="hash-link" aria-label="Lien direct vers Avec un exemple, c'est plus parlant" title="Lien direct vers Avec un exemple, c'est plus parlant" translate="no">​</a></h2>
<p>Une rapide recherche sur Github nous a permis de trouver <a href="https://github.com/sohamkamani/spring-demo" target="_blank" rel="noopener noreferrer" class="">ce dépôt public</a> d'une application de démo pour Spring Boot.</p>
<p>Le dernier commit date d'il y a 3 ans, la version de Spring Boot utilisée est la version 2.6.4 et la version de Java est la version 11.</p>
<p>À l'heure où nous écrivons cet article, la dernière version stable de Spring Boot est la 3.5 et la dernière LTS de Java est la version 21.</p>
<p>Nous avons donc une majeure à passer sur Spring Boot et dix versions sur Java !</p>
<p>Comme il s'agit d'un framework et d'un langage très populaires, on trouve de nombreux guides de migration. Mais grâce à OpenRewrite, nous n'avons pas besoin de regarder <a href="https://www.youtube.com/watch?v=HrRQExD3xow" target="_blank" rel="noopener noreferrer" class="">une vidéo de plus d'une heure</a> avant de nous mettre à l'ouvrage !</p>
<p>En effet, en appliquant à la suite les commandes Maven fournies dans <a href="https://docs.openrewrite.org/recipes/java/spring/boot3/upgradespringboot_3_4-community-edition" target="_blank" rel="noopener noreferrer" class="">la recette pour passer à Spring Boot 3.4</a> ainsi que <a href="https://docs.openrewrite.org/recipes/java/migrate/upgradetojava21" target="_blank" rel="noopener noreferrer" class="">celle pour passer en java 21</a>, ces deux opérations s'exécutent en quelques secondes.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4 -Drewrite.exportDatatables=true</span><br></span></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava21 -Drewrite.exportDatatables=true</span><br></span></code></pre></div></div>
<p>Comme notre application de démo n'utilise aucune dépendance en dehors de Spring Boot, on peut directement valider que tout s'est bien passé : les tests passent encore, l'application se lance et fonctionne comme prévu !</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>On aurait également pu utiliser le plugin maven pour ajouter nos deux recettes l'une à la suite de l'autre :</p></div></div>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">plugin</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.maven</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">rewrite-maven-plugin</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">6.10.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">exportDatatables</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">exportDatatables</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">activeRecipes</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.java.migrate.UpgradeToJava21</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">activeRecipes</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">configuration</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependencies</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.recipe</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">rewrite-migrate-java</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">3.11.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.recipe</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">rewrite-spring</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">6.8.2</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependencies</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">plugin</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Certaines recettes nécessitent des paramètres, comme <a href="https://docs.openrewrite.org/recipes/java/changepackage" target="_blank" rel="noopener noreferrer" class="">cette recette de changement de nom de package</a> par exemple.</p>
<p>Heureux hasard ! dans notre projet, le fichier <code>SpringdemoApplicationTests.java</code> comporte une erreur de nom de package !</p>
<p>Il suffit d'ajouter à la racine de notre projet un fichier de configuration <code>rewrite.yml</code> comme celui-ci :</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> specs.openrewrite.org/v1beta/recipe</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> com.zatsit.ChangePackage</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Rename package name example</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">recipeList</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">org.openrewrite.java.ChangePackage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">oldPackageName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> com.sohamkamani.demo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">newPackageName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> com.sohamkamani.springdemo</span><br></span></code></pre></div></div>
<p>Puis d'ajouter la recette dans la liste à appliquer par le plugin :</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">activeRecipes</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.openrewrite.java.migrate.UpgradeToJava21</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">com.zatsit.ChangePackage</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">recipe</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">activeRecipes</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Là encore, un simple <code>mvn rewrite:run</code> et le tour est joué !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-else-">What else ?<a href="https://blog.zatsit.fr/openrewrite#what-else-" class="hash-link" aria-label="Lien direct vers What else ?" title="Lien direct vers What else ?" translate="no">​</a></h2>
<p>Cet exemple simple vous donne un aperçu de la facilité avec laquelle vous pouvez utiliser, combiner, adapter les recettes OpenRewrite por répondre à vos besoins, souvent spécifiques.</p>
<p>Comme précisé ci-dessus, OpenRewrite s'est d'abord développé autour de l'environnement Java, mais s'est aujourd'hui étoffé de <a href="https://docs.openrewrite.org/recipes" target="_blank" rel="noopener noreferrer" class="">milliers de recettes</a> pour des technologies, langages et frameworks aussi divers que variés !</p>
<p>Et si jamais vous ne trouvez pas votre bonheur, comme OpenRewrite est open source, vous pouvez tout à fait <a href="https://docs.openrewrite.org/authoring-recipes" target="_blank" rel="noopener noreferrer" class="">écrire votre propre recette</a>, que ce soit pour pouvoir la répliquer facilement sur plusieurs de vos projets, ou pour en faire profiter toute la communauté !</p>
<p>Alors ? Prêt à effectuer vos montées de versions de manière sereine ?</p>]]></content:encoded>
            <category>java</category>
            <category>open-source</category>
            <category>refacto</category>
        </item>
        <item>
            <title><![CDATA[Angular 2025 : Le récap']]></title>
            <link>https://blog.zatsit.fr/angular-2025-le-recap</link>
            <guid>https://blog.zatsit.fr/angular-2025-le-recap</guid>
            <pubDate>Fri, 28 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[angular chill]]></description>
            <content:encoded><![CDATA[<p><a href="https://x.com/DanielGlejzner/status/1862568911482626328/photo/1" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="angular chill" src="data:image/webp;base64,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" width="540" height="480" class="img_ev3q"></a></p>
<p>Cet article à propos d'Angular, a pour but de donner un aperçu de la dynamique d'évolution du Framework ces derniers temps, et la direction prise par l'équipe de développement.</p>
<p>En effet, avec des avancées majeures dans les dernières versions via le lancement des composants standalones en expérimental en v14, l'arrivée des Signals en v16 ou encore la nouvelle syntaxe de control flow en v17, Angular progresse bien dans ses objectifs d'améliorer les performances, l'expérience des développeurs, la stabilité et la fiabilité (voir la <a href="https://www.youtube.com/live/C9fiw4XoeC0?si=bLB3d0ppm7veu3Lg&amp;t=5320" target="_blank" rel="noopener noreferrer" class="">vidéo "State of Angular" par Minko Gechev, Google Core Team</a>)</p>
<p><img decoding="async" loading="lazy" alt="frise chronologique des principales évolutions des dernières versions d&amp;#39;Angular" src="https://blog.zatsit.fr/assets/images/angular_timeline-5c0b2c2ff465d7720f42dc81fd4d60fb.webp" width="1870" height="845" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="aperçu-des-changements-majeurs-depuis-2022">Aperçu des changements majeurs depuis 2022<a href="https://blog.zatsit.fr/angular-2025-le-recap#aper%C3%A7u-des-changements-majeurs-depuis-2022" class="hash-link" aria-label="Lien direct vers Aperçu des changements majeurs depuis 2022" title="Lien direct vers Aperçu des changements majeurs depuis 2022" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="standalone-components-stable-en-v15">Standalone components (stable en V15)<a href="https://blog.zatsit.fr/angular-2025-le-recap#standalone-components-stable-en-v15" class="hash-link" aria-label="Lien direct vers Standalone components (stable en V15)" title="Lien direct vers Standalone components (stable en V15)" translate="no">​</a></h3>
<p>L'un des changements les plus anciens maintenant est l'introduction des standalone components, permettant de se passer des ngModules. Ce changement permet des améliorations de performance avec une mise en place de chargement à la demande (lazy loading) de composant bien plus facilement. La contrepartie principale au quotidien étant de prendre l'automatisme d'importer dans chaque composant les éléments externes utiles (Pipe, Directives, Composants…).</p>
<p>Bien sûr l'équipe d'Angular s'efforce de garder la rétrocompatibilité des versions et fonctionnalités, et il n'est pas prévu que les ngModules soient dépréciés de sitôt.</p>
<p>Depuis la version 19 les composants sont d'ailleurs considérés par défaut comme standalone, et <a href="https://angular.dev/extended-diagnostics/NG8113" target="_blank" rel="noopener noreferrer" class="">un warning pour les imports inutilisés a été ajouté</a>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="les-signals">Les signals<a href="https://blog.zatsit.fr/angular-2025-le-recap#les-signals" class="hash-link" aria-label="Lien direct vers Les signals" title="Lien direct vers Les signals" translate="no">​</a></h3>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="le-présent">Le présent<a href="https://blog.zatsit.fr/angular-2025-le-recap#le-pr%C3%A9sent" class="hash-link" aria-label="Lien direct vers Le présent" title="Lien direct vers Le présent" translate="no">​</a></h4>
<p>L'autre changement qui a beaucoup fait parler de lui est l'introduction des Signals (stable en v17), un nouveau type de données, mix entre les variables classiques et des observables. Une erreur souvent commise est de penser que les Signals remplacent les Observables, alors qu'ils viennent en combinaison comme l'illustre ce schéma issu de <a href="https://www.angularspace.com/18-interview-questions-answered-by-angular-experts-live-post/" target="_blank" rel="noopener noreferrer" class="">cet article d'Angular Space "Q14: Signals, Observables, Promises - tell me all about differences and when to use which"</a> :</p>
<p><img decoding="async" loading="lazy" alt="illustration des différents types de variables" src="https://blog.zatsit.fr/assets/images/variables_comparison-1c09724c7656c0c323ce64c9ac674f23.webp" width="1600" height="811" class="img_ev3q"></p>
<p>Je vois personnellement les Signals comme des variables réactives, permettant de gérer l'état d'un composant, tout en optimisant la détection de changement en étant compatible avec la ChangeDetectionStrategy OnPush et Angular sans zone.js. Voici ici <a href="https://www.angularspace.com/how-angular-keeps-your-ui-in-sync/" target="_blank" rel="noopener noreferrer" class="">un rappel sur la manière dont Angular gère cela, notamment avec les signals.</a></p>
<p>L'écosystème des Signals s'est étoffé dans la version 19 avec les input/output/model de composant remplaçant les @Input, @Output. Et aussi les Signals query offrant de nouvelles possibilités aux @ViewChild et consorts.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="amélioration-en-cours-de-lécosystème-des-signals">Amélioration en cours de l'écosystème des Signals<a href="https://blog.zatsit.fr/angular-2025-le-recap#am%C3%A9lioration-en-cours-de-l%C3%A9cosyst%C3%A8me-des-signals" class="hash-link" aria-label="Lien direct vers Amélioration en cours de l'écosystème des Signals" title="Lien direct vers Amélioration en cours de l'écosystème des Signals" translate="no">​</a></h4>
<p>Pour combiner au mieux les RxJS et les Signals, <a href="https://angular.dev/ecosystem/rxjs-interop" target="_blank" rel="noopener noreferrer" class="">le package rxjs-interop</a> (encore expérimental à l'heure actuelle) permet d'utiliser le meilleur des 2 mondes en permettant de transformer un Observable en Signals et inversement.</p>
<p><img decoding="async" loading="lazy" alt="comparaison entre observables et signals" src="https://blog.zatsit.fr/assets/images/observables_vs_signals-8fc914c3ec5e5e7bac04d5fe197616db.webp" width="1100" height="651" class="img_ev3q"></p>
<p>Un autre aspect de la réactivité des Signals passe par les opérateurs permettant de réagir aux changements de valeurs. Ainsi, en plus du <code>computed</code> qui est stable depuis plusieurs versions et <a href="https://angular.dev/api/core/effect" target="_blank" rel="noopener noreferrer" class="">l'Effect</a> qui est toujours en developer preview, Angular s'attaque maintenant à faciliter le travail pour la gestion de l'asynchronisme via l'opérateur <code>resource</code>  (et ses dérivés <code>rxResource</code> et <code>httpResource</code>), dont le cas d'usage principal est de permettre de récupérer des données via une API et de les utiliser comme Signals.
D'ailleurs <a href="https://x.com/Jean__Meche/status/1894795310142009543" target="_blank" rel="noopener noreferrer" class="">deux demandes de commentaires (RFC) ont récemment été publiées</a> pour discuter de ce sujet.</p>
<p>Une bonne illustration faite par un membre de l'équipe d'Angular des différents outils liés aux Signals :
<a href="https://x.com/Jean__Meche/status/1866857244106584575/photo/1" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="image.png" src="https://blog.zatsit.fr/assets/images/signals_operators-73fb1736b5fc6df23f4887aa9c622dea.webp" width="3840" height="2490" class="img_ev3q"></a></p>
<p>Un chantier qui débute est celui d'<a href="https://github.com/angular/angular/tree/prototype/signal-forms/packages/forms/experimental" target="_blank" rel="noopener noreferrer" class="">utiliser les signals au sein des formulaires</a>, avec comme objectif, encore une fois, de faciliter l'expérience de développeur.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="les-signals-en-dehors-dangular">Les signals en dehors d'Angular<a href="https://blog.zatsit.fr/angular-2025-le-recap#les-signals-en-dehors-dangular" class="hash-link" aria-label="Lien direct vers Les signals en dehors d'Angular" title="Lien direct vers Les signals en dehors d'Angular" translate="no">​</a></h4>
<p>La venue de signals permet aussi l'amélioration des librairies connues qui gravitent autour d'Angular.</p>
<p>Le premier exemple qui me vient à l'esprit est la librairie Ngrx qui propose des outils pour gérer l'état de l'application ou de composant. Ils ont ainsi intégré des sélecteurs de type signal dans leur store et component store, mais ils proposent aussi une librairie dédiée pour avoir un <a href="https://ngrx.io/guide/signals" target="_blank" rel="noopener noreferrer" class="">store directement en signal</a>. Si le sujet vous intéresse, voici une <a href="https://www.angulararchitects.io/en/blog/the-new-ngrx-signal-store-for-angular-2-1-flavors/" target="_blank" rel="noopener noreferrer" class="">série d'articles sur le sujet par Angular Architects</a>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="nouveau-control-flow-stable-en-v18">Nouveau control flow (stable en v18)<a href="https://blog.zatsit.fr/angular-2025-le-recap#nouveau-control-flow-stable-en-v18" class="hash-link" aria-label="Lien direct vers Nouveau control flow (stable en v18)" title="Lien direct vers Nouveau control flow (stable en v18)" translate="no">​</a></h3>
<p>La version 18 a permis de murir les nouvelles fonctionnalités liées aux signals, mais a aussi introduit de nouvelles syntaxes dans les templates de composants, autrement appelées Control Flow, permettant de sortir les conditions des balises html et d'améliorer la lisibilité des templates.</p>
<p><img decoding="async" loading="lazy" alt="comparaison des syntaxes de templates des principaux frameworks javascript" src="https://blog.zatsit.fr/assets/images/control_flow_comparison-8b0f662b9e63afe23ce3278d0b9c942f.webp" width="1206" height="1142" class="img_ev3q"></p>
<p>Via l'ajout de cette syntaxe, l'équipe d'Angular a aussi ajouté le bloc @defer qui permet de charger paresseusement les composants/directives/pipe qui sont inclus dans le bloc.</p>
<p>En version 19 une nouvelle balise a fait son apparition, le @let permettant de définir une variable directement dans le template.</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> user$ </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> async</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text">Hello, </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">name</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">h1</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="lhydratation-incrémentale">L'hydratation incrémentale<a href="https://blog.zatsit.fr/angular-2025-le-recap#lhydratation-incr%C3%A9mentale" class="hash-link" aria-label="Lien direct vers L'hydratation incrémentale" title="Lien direct vers L'hydratation incrémentale" translate="no">​</a></h3>
<p>Un point moins mis en avant est le rendu côté serveur (Server side rendering, SSR), qui permet de générer une partie de la vue sur le serveur, permettant une amélioration des performances pour l'utilisateur, ou encore un meilleur référencement SEO.</p>
<p>Pour améliorer les performances au niveau de la réactivité du SSR, l'hydratation permet de réutiliser une partie du code généré côté serveur.</p>
<p>L'hydratation incrémentale vient optimiser l'hydratation en ciblant les parties à hydrater, cela fonctionne via le bloc @defer et permet d'hydrater le contenu du bloc uniquement lorsque l'évènement déclencheur du @defer est activé.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="angular-sans-zonejs">Angular sans zone.js<a href="https://blog.zatsit.fr/angular-2025-le-recap#angular-sans-zonejs" class="hash-link" aria-label="Lien direct vers Angular sans zone.js" title="Lien direct vers Angular sans zone.js" translate="no">​</a></h3>
<p>Avec une disponibilité en mode expérimentale depuis la version 18, il est maintenant possible d'utiliser Angular sans zone.js avec à la clé une amélioration des performances de rafraichissement des vues. Pour refléter ce changement, l'équipe envisage d'ailleurs d'<a href="https://youtu.be/rRWPSvoVSGk?si=SOeFQZLSz_Knt6T1&amp;t=271" target="_blank" rel="noopener noreferrer" class="">utiliser le terme "synchronisation" en remplacement de la "détection de changement"</a>.</p>
<p>Se passer de zone.js permettra :</p>
<ul>
<li class="">d'améliorer les performances en supprimant une libraire supplémentaire au bundle et toute la surcharge que ça implique, tout en optimisant la détection de changement et évitant certains bugs liés à zone.js.</li>
<li class="">Un meilleur débogage avec un suivi simplifié de l'état de l'application et de ses mises à jour.</li>
<li class="">De s'aligner sur l'architecture moderne d'Angular avec les Signals pour une réactivité propre et efficiente.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="nouveau-format-des-composants-authoring-format">Nouveau format des composants (authoring format)<a href="https://blog.zatsit.fr/angular-2025-le-recap#nouveau-format-des-composants-authoring-format" class="hash-link" aria-label="Lien direct vers Nouveau format des composants (authoring format)" title="Lien direct vers Nouveau format des composants (authoring format)" translate="no">​</a></h3>
<p>Un autre point, est la recherche sur le nouveau format des composants (authoring format), avec pour objectif par exemple d'<a href="https://blog.angular.dev/angular-2025-strategy-9ca333dfc334" target="_blank" rel="noopener noreferrer" class="">éviter la duplication d'import entre l'import JavaScript et l'import standalone</a> :</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Checkbox</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'component-library'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@</span><span class="token function" style="color:#d73a49">Component</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  selector</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'my-app'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  imports</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token maybe-class-name">Checkbox</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// &lt;-- an extra import</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  template</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">&lt;my-checkbox/&gt;</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">App</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Les réflexions n'en sont qu'à leurs débuts, plus d'infos sur ce sujet dans <a href="https://x.com/Jean__Meche/status/1849545173920825606?t=W8kwcXGMeJ6yh-I3esjj-g&amp;s=19" target="_blank" rel="noopener noreferrer" class="">cette vidéo partagée par Matthieu Riegler</a>.</p>
<p>Un peu dans la même veine, <a href="https://github.com/angular/angular/discussions/59522" target="_blank" rel="noopener noreferrer" class="">une communication récente fait mention de recommandation visant les noms des fichiers</a>, le guide de style omettra le fait de suffixer les noms avec "component", "directive" ou "service". Et à la place, pour permettre aux différents outils de mieux supporter Angular, de mettre le préfixe "ng" (ng.html, ng.ts…).</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="feedbacks-de-la-communauté">Feedbacks de la communauté<a href="https://blog.zatsit.fr/angular-2025-le-recap#feedbacks-de-la-communaut%C3%A9" class="hash-link" aria-label="Lien direct vers Feedbacks de la communauté" title="Lien direct vers Feedbacks de la communauté" translate="no">​</a></h3>
<p>Parmi les derniers changements, les Signals et Control flow sont les 2 améliorations qui ont le plus d'impact positif pour les développeurs d'après l'<a href="https://blog.angular.dev/angular-2025-strategy-9ca333dfc334" target="_blank" rel="noopener noreferrer" class="">enquête menée par l'équipe Angular</a>.</p>
<p><img decoding="async" loading="lazy" alt="enquête satisfaction nouveautés Angular" src="https://blog.zatsit.fr/assets/images/angular_survey_result-72d347f14f1ef52b63e372dc0f426505.webp" width="626" height="408" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="tips-pour-suivre-les-nouveautés">Tips pour suivre les nouveautés<a href="https://blog.zatsit.fr/angular-2025-le-recap#tips-pour-suivre-les-nouveaut%C3%A9s" class="hash-link" aria-label="Lien direct vers Tips pour suivre les nouveautés" title="Lien direct vers Tips pour suivre les nouveautés" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mise-à-jour-de-la-documentation">Mise à jour de la documentation<a href="https://blog.zatsit.fr/angular-2025-le-recap#mise-%C3%A0-jour-de-la-documentation" class="hash-link" aria-label="Lien direct vers Mise à jour de la documentation" title="Lien direct vers Mise à jour de la documentation" translate="no">​</a></h3>
<p>Sortie en même temps que la version 17, une nouvelle version de la documentation a été mise à disposition sur <a href="https://angular.dev/" target="_blank" rel="noopener noreferrer" class="">angular.dev</a>.</p>
<p>Dans les apports notables, je trouve que l'intégration d'un bac à sable intégré est très pratique pour suivre le tutoriel, ou simplement pour faire des tests rapides dans le <a href="https://angular.dev/playground" target="_blank" rel="noopener noreferrer" class="">playground</a> (et c'est toujours possible sur <a href="https://stackblitz.com/edit/angular" target="_blank" rel="noopener noreferrer" class="">Stackblitz</a>).</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="contenu-des-versions">Contenu des versions<a href="https://blog.zatsit.fr/angular-2025-le-recap#contenu-des-versions" class="hash-link" aria-label="Lien direct vers Contenu des versions" title="Lien direct vers Contenu des versions" translate="no">​</a></h3>
<p>Vous pouvez bien sûr retrouver ces sujets listés sur la <a href="https://angular.dev/roadmap" target="_blank" rel="noopener noreferrer" class="">roadmap officielle d'Angular</a>. Permettant d'avoir un aperçu de l'ensemble des chantiers passés et en cours.</p>
<p>Mais avec le rythme de sortie de 2 versions majeures par an, avec dans chacune des versions des fonctionnalités en expérimentation ou en avant-première, il est parfois facile d'oublier ce que l'on peut utiliser sereinement pour son application en production. Il est bien sûr possible d'aller directement sur la documentation officielle pour voir si la fonctionnalité est stable, mais le Français <a href="https://www.gerome.dev/" target="_blank" rel="noopener noreferrer" class="">Gerome Grignon</a> porte un projet permettant de visualiser rapidement le statut des principales fonctionnalités sur <a href="https://www.angular.courses/caniuse" target="_blank" rel="noopener noreferrer" class="">Angular.courses/caniuse</a>.</p>
<p><img decoding="async" loading="lazy" alt="illustration site caniuse" src="https://blog.zatsit.fr/assets/images/caniuse-318daaba476e47fe272e7ba80fdb181f.webp" width="1020" height="430" class="img_ev3q"></p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mise-à-jour-de-vos-applications">Mise à jour de vos applications<a href="https://blog.zatsit.fr/angular-2025-le-recap#mise-%C3%A0-jour-de-vos-applications" class="hash-link" aria-label="Lien direct vers Mise à jour de vos applications" title="Lien direct vers Mise à jour de vos applications" translate="no">​</a></h3>
<p>Depuis quelque temps, pour simplifier la vie des développeurs lors des mises à jour, des "schematics" sont disponibles via l'outil de ligne de commande.</p>
<p>Il est ainsi possible de facilement passer ses composants en standalone, utiliser la nouvelle syntaxe de control flow ou encore passe les @Input des composants en signal en une commande.</p>
<p>Vous pouvez retrouver tous les schematics disponibles dans la <a href="https://angular.dev/reference/migrations" target="_blank" rel="noopener noreferrer" class="">documentation officielle de migration</a>.</p>
<p>Et pour certains l'action est directement proposée dans VSCode, par exemple la <a href="https://angular.dev/reference/migrations/signal-inputs#vscode-extension" target="_blank" rel="noopener noreferrer" class="">conversion des @Input</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://blog.zatsit.fr/angular-2025-le-recap#conclusion" class="hash-link" aria-label="Lien direct vers Conclusion" title="Lien direct vers Conclusion" translate="no">​</a></h2>
<p>Grâce aux efforts combinés de l'équipe et de la communauté, Angular a connu un regain de popularité face à React et VueJS. En adoptant certaines des meilleures fonctionnalités de ses concurrents, Angular maintient sa compétitivité en termes de performances et d'expérience de développement.</p>
<p>Je trouve d'ailleurs intéressant le <a href="https://x.com/synalx/status/1882879962547659078" target="_blank" rel="noopener noreferrer" class="">feedback d'Alex Rickabaugh</a> à ce sujet, et j'ai l'impression que les efforts fournis portent leurs fruits 🙂</p>
<blockquote>
<p>Pour être honnête, l'un des plus grands moteurs de la « Renaissance Angular » a été un changement de culture de l'équipe au fil des ans, passant d'une vision des problèmes comme des problèmes de <strong>compétences</strong> à une vision des problèmes comme des problèmes de <strong>conception</strong> [du framework].</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="liens">Liens<a href="https://blog.zatsit.fr/angular-2025-le-recap#liens" class="hash-link" aria-label="Lien direct vers Liens" title="Lien direct vers Liens" translate="no">​</a></h2>
<p>Voici quelques ressources utiles (en anglais).</p>
<ul>
<li class="">Blogs<!-- -->
<ul>
<li class=""><a href="https://www.angularspace.com/" target="_blank" rel="noopener noreferrer" class="">Angular Space</a></li>
<li class=""><a href="https://www.angulararchitects.io/en/" target="_blank" rel="noopener noreferrer" class="">Angular Architects</a></li>
<li class=""><a href="https://angular.love/" target="_blank" rel="noopener noreferrer" class="">Angular Love</a></li>
<li class=""><a href="https://angularexperts.io/blog" target="_blank" rel="noopener noreferrer" class="">Angular Experts</a></li>
</ul>
</li>
<li class=""><a href="https://www.reddit.com/r/Angular2/" target="_blank" rel="noopener noreferrer" class="">Angular2 sur Reddit</a></li>
<li class="">X<!-- -->
<ul>
<li class=""><a href="https://x.com/mgechev" target="_blank" rel="noopener noreferrer" class="">Minko Gechev (Angular product lead)</a> - <a href="https://bsky.app/profile/mgechev.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/Jean__Meche" target="_blank" rel="noopener noreferrer" class="">Matthieu Riegler (Angular team)</a> - <a href="https://bsky.app/profile/jeanmeche.com" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/synalx" target="_blank" rel="noopener noreferrer" class="">Alex Rickabaugh (Angular team)</a> - <a href="https://bsky.app/profile/synalx.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/tomastrajan" target="_blank" rel="noopener noreferrer" class="">Tomas Trajan (GDE)</a> - <a href="https://bsky.app/profile/tomastrajan.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/DeborahKurata" target="_blank" rel="noopener noreferrer" class="">Deborah Kurata (GDE)</a> - <a href="https://www.youtube.com/@deborah_kurata" target="_blank" rel="noopener noreferrer" class="">Youtube</a> - <a href="https://bsky.app/profile/deborahkurata.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/Armandotrue" target="_blank" rel="noopener noreferrer" class="">Armen Vardanyan (GDE)</a> - <a href="https://bsky.app/profile/armandotrue.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/Enea_Jahollari" target="_blank" rel="noopener noreferrer" class="">Enea Jahollari(GDE)</a> - <a href="https://bsky.app/profile/eneajaho.me" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/nivekcode" target="_blank" rel="noopener noreferrer" class="">Nivek (GDE)</a></li>
<li class=""><a href="https://x.com/yjaaidi" target="_blank" rel="noopener noreferrer" class="">Younes Jaaidi [français](GDE)</a> - <a href="https://bsky.app/profile/younesjd.dev" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/eugeniyoz" target="_blank" rel="noopener noreferrer" class="">Evgeniy OZ</a></li>
<li class=""><a href="https://x.com/rainerhahnekamp" target="_blank" rel="noopener noreferrer" class="">Rainer Hahnekamp</a> - <a href="https://bsky.app/profile/rainerhahnekamp.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/DanielGlejzner" target="_blank" rel="noopener noreferrer" class="">Daniel Glejzner</a> - <a href="https://bsky.app/profile/danielglejzner.bsky.social" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/GeromeDEV" target="_blank" rel="noopener noreferrer" class="">Gerome Grignon [français]</a> - <a href="https://bsky.app/profile/gerome.dev" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
<li class=""><a href="https://x.com/AngularDevsFr" target="_blank" rel="noopener noreferrer" class="">AngularDevsFr</a> - <a href="https://bsky.app/profile/angulardevs.fr" target="_blank" rel="noopener noreferrer" class="">Bluesky</a></li>
</ul>
</li>
<li class="">Autre<!-- -->
<ul>
<li class=""><a href="https://ngxtension.netlify.app/" target="_blank" rel="noopener noreferrer" class="">Ngxtension : Librairie d'utilitaires pour Angular</a></li>
<li class="">Visualisation de diagrammes RxJS<!-- -->
<ul>
<li class=""><a href="https://rxvisualizer.com/" target="_blank" rel="noopener noreferrer" class="">rxvisualizer.com : Beta de visualisation dynamique</a></li>
<li class=""><a href="https://thinkrx.io/rxjs/debounceTime-vs-throttleTime-vs-auditTime-vs-sampleTime/" target="_blank" rel="noopener noreferrer" class="">thinkrx.io : Visualisation statique avec des comparaisons d'opérateurs</a></li>
</ul>
</li>
</ul>
</li>
</ul>]]></content:encoded>
            <category>web</category>
            <category>javascript</category>
            <category>angular</category>
        </item>
        <item>
            <title><![CDATA[La tyrannie de la commodité]]></title>
            <link>https://blog.zatsit.fr/tyranny-of-convenience</link>
            <guid>https://blog.zatsit.fr/tyranny-of-convenience</guid>
            <pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Grafiti on a wall saying tyranny is already there]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Grafiti on a wall saying tyranny is already there" src="https://blog.zatsit.fr/assets/images/tyranny-744cafdeb2d1220f3f5ff2b2456325a7.webp" width="868" height="1305" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="la-tyrannie-de-la-commodité--ce-que-nous-coûte-la-facilité">La tyrannie de la commodité : ce que nous coûte la facilité<a href="https://blog.zatsit.fr/tyranny-of-convenience#la-tyrannie-de-la-commodit%C3%A9--ce-que-nous-co%C3%BBte-la-facilit%C3%A9" class="hash-link" aria-label="Lien direct vers La tyrannie de la commodité : ce que nous coûte la facilité" title="Lien direct vers La tyrannie de la commodité : ce que nous coûte la facilité" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="la-tyrannie-de-la-commodité-quest-ce-que-cest-">La Tyrannie de la commodité, qu'est-ce que c'est ?<a href="https://blog.zatsit.fr/tyranny-of-convenience#la-tyrannie-de-la-commodit%C3%A9-quest-ce-que-cest-" class="hash-link" aria-label="Lien direct vers La Tyrannie de la commodité, qu'est-ce que c'est ?" title="Lien direct vers La Tyrannie de la commodité, qu'est-ce que c'est ?" translate="no">​</a></h3>
<p>Traduction littérale de l'Anglais "tyranny of convenience", le concept n'est pas si récent. Evan Williams, co-fondateur de Twitter, le déclarait déjà en 2018 : « la commodité décide de tout ».
Clef de voûte du marketing, certaines marques en ont même fait leur argument principal : "Pratique et intuitif", "Tous vos outils au même endroit".
Pourtant, on devrait le savoir, un argument marketing est rarement un argument rationnel.</p>
<p>Nous savons que le fast-food est mauvais pour la santé, qu'il y a plein d'alternatives souvent plus savoureuses et meilleures pour la santé, pourtant, la facilité de passer au kebab semble souvent l’emporter. Et non seulement on a cédé à la facilité sur le coup, mais on crée un précédent qui va nous pousser à recommencer.</p>
<p>Lorsqu’une option est bien plus "simple" que les autres, les alternatives paraissent vite irrationnelles. La tyrannie de la commodité,
ce sont tous ces choix que l'ont fait non pas parce que ce sont les meilleurs, les plus adaptés, les plus rationnels,
mais parce que sortir de la commodité nous semble impossible, impensable. C'est le moment où la commodité n'est plus un atout, mais une contrainte.</p>
<p>L'IT est particulièrement sensible à cette problématique. Tenu par des objectifs d'efficacité et de rapidité, il est facile d'aller au plus simple et surtout, d'y rester.
Et ce n'est pas nécessairement une mauvaise chose ! Comme le dit le dicton bien connu dans les métiers du numérique : inutile de réinventer la roue. Il faut savoir s'appuyer sur des solutions déjà existantes pour travailler plus efficacement.
En revanche, il est important de s'interroger sur ce que cela nous coûte : cet écosystème clef en main deviendra-t-il une prison ?
Quid de la dépendance à un seul outil, à une seule entreprise ?
À quel moment devient-on esclave de la commodité ?</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="commodité-et-liberté--des-conséquences-à-diverses-échelles">Commodité et Liberté : des conséquences à diverses échelles<a href="https://blog.zatsit.fr/tyranny-of-convenience#commodit%C3%A9-et-libert%C3%A9--des-cons%C3%A9quences-%C3%A0-diverses-%C3%A9chelles" class="hash-link" aria-label="Lien direct vers Commodité et Liberté : des conséquences à diverses échelles" title="Lien direct vers Commodité et Liberté : des conséquences à diverses échelles" translate="no">​</a></h3>
<p>La commodité n'est pas en nécessairement mauvaise et n'est pas à fuir par principe. Cependant, elle peut créer une dépendance et une résistance
au changement qui peut s'avérer délétère.</p>
<p>Un exemple dans lequel tout le monde se reconnaitra est le choix du système d'exploitation de notre matériel informatique,
et particulièrement de nos terminaux mobiles.
iOS ou Android ? Est-ce vraiment la rationalité qui détermine notre choix ? Si c'était le cas, nous n'aurions aucun mal à
passer de l'un à l'autre quand une nouvelle fonctionnalité fait son apparition chez la concurrence.
Pourtant, la plupart des utilisateurs·rices restent "fidèles" à leur système à chaque renouvellement de mobile, sans même
s'interroger sur les alternatives.
Cette "fidélité" va même parfois jusqu'à nous faire accepter des défauts majeurs (confidentialité, durée de vie de la batterie, obsolescence programmée...)
pour ne pas changer nos habitudes.</p>
<p>Dans nos métiers, la tyrannie de la commodité peut avoir de nombreuses conséquences : elle peut nous empêcher de choisir le meilleur outil pour notre besoin,
elle peut coûter cher parce que l'on reste prisonnier d'un environnement trop coûteux, car on en est dépendant. Elle nous empêche de voir et de réfléchir aux alternatives à ce qui nous semble le plus évident.
Pour prendre un exemple parlant : une grande part (si ce n'est une majorité) de professionel·le·s du numérique préfère (ou gagnerait à) travailler sur macOS ou sur Linux. Pourtant, iels sont souvent contraint·es à utiliser Windows par... la tyrannie de la commodité.
On a l'habitude de cet environnement, on a grandi avec. Pire ! On y est parfois contraint par les protocoles de sécurités de notre entreprise ou de nos client·es, car les VPNs, les antivirus, fournis par des sociétés tierces, ne supportent pas d'autres OS... ou pour un prix plus élevé.
Pourtant, le système d'exploitation que l'on utilise va influencer grandement tous les choix d'outil que l'on va pouvoir utiliser !</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="la-commodité-et-son-influence-sur-linnovation">La commodité et son influence sur l'innovation<a href="https://blog.zatsit.fr/tyranny-of-convenience#la-commodit%C3%A9-et-son-influence-sur-linnovation" class="hash-link" aria-label="Lien direct vers La commodité et son influence sur l'innovation" title="Lien direct vers La commodité et son influence sur l'innovation" translate="no">​</a></h3>
<p>Au-delà de l’influence sur les choix individuels ou à l'échelle d'un projet, la commodité anime les grandes tendances technologiques et pose des freins à l'innovation.
La tyrannie de la commodité joue un rôle important dans une logique du "too big to fail", ce moment où un outil est tellement dans une situation de monopole qu'il devient l'outil par défaut même s'il n'est ni le moins cher ni le plus adapté.</p>
<p>Encore une fois, prenons un exemple que nous connaissons tous : le site de vente en ligne Amazon.</p>
<p>Plus Amazon devient accessible, plus les gens l'utilisent. Et ce cycle renforce la portée et l'attrait d'Amazon, en faisant le choix privilégié et par défaut.
Cependant, cette centralisation a un effet délétère : le monopole étouffe la concurrence. Ainsi, de nombreux produits, notamment informatique et numérique, ne sont plus disponibles ailleurs que sur Amazon.
Vous cherchez un câble USB-C d'une certaine longueur, un chargeur de secours pour votre ordinateur, des coussinets de remplacement pour votre casque audio ? Vous avez très peu de chance de trouver la référence qu'il vous faut ailleurs que sur Amazon.
Et même si vous la trouvez, cela coutera facilement deux fois plus cher ailleurs !
Par ailleurs, qu'importe si l'on n'est pas en accord avec les valeurs de cette entreprise, si la qualité est variable, si l'on cherche une alternative plus écologique ou locale : Amazon a tué la concurrence. Par commodité, il s'est imposé dans nos pratiques de consommation.
Dans l'impossibilité de s'aligner, les autres distributeurs ont rendu les armes sur certaines références, laissant à Amazon le champ libre pour vendre des produits de moins bonne qualité ou dans des conditions éthiques discutables.
La "commodité" n'est alors plus un choix rationnel : elle est devenue une contrainte. Elle empêche le développement d'une concurrence qui pourrait proposer des alternatives.
Car l'absence de concurrence permet de moins se soucier de l'innovation et de la qualité ! Quand vous avez le monopole, moins besoin d'être compétitif.</p>
<p>Un autre exemple : chez <strong>zatsit</strong>, nous avons eu l'occasion dans le cadre de nos journées de recherche en greenIT de tester <a href="https://github.com/hubblo-org/scaphandre" target="_blank" rel="noopener noreferrer" class="">Scaphandre</a>, un outil de monitoring de la consommation énergétique des clusters kubernetes.
Open source, un tel outil permettrait d'avoir des mesures directes de consommation réelle. Problème : les fournisseurs cloud comme Google ou Amazon n'exposent pas ces métriques.
Une excellente initiative qui est donc bloquée (pour l'instant) par le monopole des fournisseurs cloud.
Bloquée dans son utilisation, mais aussi son développement : difficile de mobiliser la communauté FOSS autour d'un outil qui est inutilisable dans énormément des cas de production.</p>
<hr>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="lutter-contre-la-tyrannie-de-la-commodité--une-hygiène-du-quotidien">Lutter contre la tyrannie de la commodité : une hygiène du quotidien<a href="https://blog.zatsit.fr/tyranny-of-convenience#lutter-contre-la-tyrannie-de-la-commodit%C3%A9--une-hygi%C3%A8ne-du-quotidien" class="hash-link" aria-label="Lien direct vers Lutter contre la tyrannie de la commodité : une hygiène du quotidien" title="Lien direct vers Lutter contre la tyrannie de la commodité : une hygiène du quotidien" translate="no">​</a></h3>
<p>Une fois ce constat établi, on peut facilement se sentir découragé. Comment remettre en question des géants comme Windows, Google, Apple, Amazon ? Comment faire valoir dans nos équipes et dans notre entourage que "facile" n'est pas toujours un bon argument ?
Nous vous proposons 3 axes, faciles à mettre en place dans votre quotidien et dans son environnement professionnel, pour lutter contre la tyrannie de la commodité :</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="1-prendre-toujours-le-temps-de-questionner-">1. Prendre toujours le temps de questionner :<a href="https://blog.zatsit.fr/tyranny-of-convenience#1-prendre-toujours-le-temps-de-questionner-" class="hash-link" aria-label="Lien direct vers 1. Prendre toujours le temps de questionner :" title="Lien direct vers 1. Prendre toujours le temps de questionner :" translate="no">​</a></h4>
<p>À chaque tournant de votre projet, à chaque choix technique, à chaque remplacement de matériel, prendre le temps de questionner les choix "évidents".
Une bonne façon de savoir si nos choix sont dictés par la commodité est de se demander "si je prenais cette décision pour la première fois, est-ce que je ferais le même choix ?".
Si la réponse est non, et particulièrement si la raison pour laquelle vous prenez cette décision est "par habitude" (pour ne pas avoir à transférer vos données/contacts, parce que vous avez l'habitude de l'UI,
parce que c'est ce qui est fait partout ailleurs dans le projet, parce que votre cloud provider propose une solution clef en main, parce que c'est inclus dans notre offre, parce que c'est un outil que vous maitrisez déjà...)
alors vous ne prenez pas une décision rationnelle : vous vous pliez au marketing et à la tyrannie de la commodité.</p>
<p>Prenez le temps d'envisager d'autres options, de regarder du côté de l'open source. Ne partez pas du principe que le plus évident est le plus rationnel.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="2-apprendre-à-repérer-les-situations-à-risques-">2. Apprendre à repérer les situations à risques :<a href="https://blog.zatsit.fr/tyranny-of-convenience#2-apprendre-%C3%A0-rep%C3%A9rer-les-situations-%C3%A0-risques-" class="hash-link" aria-label="Lien direct vers 2. Apprendre à repérer les situations à risques :" title="Lien direct vers 2. Apprendre à repérer les situations à risques :" translate="no">​</a></h4>
<p>Il est plus facile de lutter contre la tyrannie de la commodité avant d'en être victime. Certains concepts doivent nous mettre la puce à l'oreille au moment de choisir un outil :
"Facile", "clef en main", "tout compris", "le plus utilisé". Ce genre de mot clef doit nous interroger. Soyons clair : il ne faut pas fuir la commodité par principe, mais être conscient de ses effets négatifs.
"Facile" doit venir en bonus de "adapté". "Facile" n'est pas le synonyme d'"efficace". Et on sait que, de la mécanique automobile au développement d'application,
il est souvent plus simple pour les entreprises fabriquant des outils de garder les utilisateurs·ices captifs·ves plutôt que de fournir les meilleurs outils et les plus adaptés.
Au moment de choisir un nouvel outil, ou de faire un choix technique, soyons attentifs aux arguments de commodité : les décisions que nous prenons maintenant vont nous contraindre dans le futur. Faisons en sorte que ce soit pour de bonnes raisons.</p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="3-éduquer-notre-entourage-">3. Éduquer notre entourage :<a href="https://blog.zatsit.fr/tyranny-of-convenience#3-%C3%A9duquer-notre-entourage-" class="hash-link" aria-label="Lien direct vers 3. Éduquer notre entourage :" title="Lien direct vers 3. Éduquer notre entourage :" translate="no">​</a></h4>
<p>Comme nous l'avons vu, la tyrannie de la commodité a des effets plus larges qu'à l'échelle d'un projet, d'un choix technique, ou de l'achat d'un nouveau smartphone : elle appauvrit tout notre environnement technique,
limite nos choix, et ralentit l'innovation. Pourtant, si vous essayez demain de convaincre vos collègues de ne pas utiliser Google, ou de passer de iOS à Android, vous risquez de vous heurter à un mur.
Les habitudes sont difficiles à changer et la tyrannie de la commodité a cela de pernicieux qu'elle fait apparaître toutes les alternatives comme stupides, irrationnelles, irréalisables.
Parler de la tyrannie de la commodité et de ses effets délétères (en partageant cet article par exemple 😊) peut permettre de faire changer les mentalités,
en faisant prendre conscience à votre entourage et à vos collègues que ce qu'iels pensent être un choix dicté par leur rationalité est en réalité une contrainte,
ou pire : une manipulation marketing. En cédant à cette facilité, iels limitent non seulement leurs options, mais celle de communauté entière.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="la-tyrannie-de-la-commodité--une-part-dun-problème-global">La tyrannie de la commodité : une part d'un problème global.<a href="https://blog.zatsit.fr/tyranny-of-convenience#la-tyrannie-de-la-commodit%C3%A9--une-part-dun-probl%C3%A8me-global" class="hash-link" aria-label="Lien direct vers La tyrannie de la commodité : une part d'un problème global." title="Lien direct vers La tyrannie de la commodité : une part d'un problème global." translate="no">​</a></h3>
<p>En réalité, la tyrannie de la commodité est une partie d'un problème bien connu dans le milieu du numérique : le "courtermisme". Pris dans des considérations de coût et d'efficacité, le milieu de l'entreprise
a souvent tendance à aller vers une solution à court terme et à bas coût. En tant que professionnel·les du numérique, nous luttons déjà contre cette tendance, non pas par principe, mais par rationalité :
Nous savons par exemple que prendre 20% de temps supplémentaire pour écrire des tests nous fera gagner du temps et de l'argent à moyen terme. Nous savons qu'il faut faire relire son code par ses pairs, qu'il faut être attentif aux bonnes pratiques, aux bons outils pour garder un code propre et maintenable à long terme.
Mais nous savons aussi que tout est affaire de compromis et que l'on ne peut pas ignorer les contraintes de temps et de moyen.</p>
<p>Il ne faut pas tomber dans une position extrême où tout ce qui est efficace et pratique deviendrait suspect !
Connaître le concept de tyrannie de la commodité permet de rester vigilant et de reconnaitre plus facilement les situations qui pourraient, plus tard être problématiques. Elle nous rappelle aussi l'importance de
maintenir une veille professionnelle active, de promouvoir l'open source pour toujours garder ses alternatives ouvertes, et que la commodité ne devienne pas une prison.</p>]]></content:encoded>
            <category>general</category>
        </item>
        <item>
            <title><![CDATA[Utiliser votre assistant IA en local (et sur VSCode) pour mieux respecter la planête.]]></title>
            <link>https://blog.zatsit.fr/local-ai-assistant-in-vscode</link>
            <guid>https://blog.zatsit.fr/local-ai-assistant-in-vscode</guid>
            <pubDate>Thu, 19 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Vous rêvez d'un assistant intelligent comme GitHub Copilot, mais moins couteux en ressources machine, et gratuit ? Vous êtes au bon endroit.]]></description>
            <content:encoded><![CDATA[<p>Vous rêvez d'un assistant intelligent comme GitHub Copilot, mais moins couteux en ressources machine, et gratuit ? Vous êtes au bon endroit.</p>
<p>Dans cet article, nous allons vous guider, étape par étape, pour créer votre propre assistant IA local et le déployer dans votre environnement de développement (VSCode ici); à l’aide de <a href="https://lmstudio.ai/" target="_blank" rel="noopener noreferrer" class="">LM Studio</a> et de l’extension <a href="https://docs.codegpt.co/docs/tutorial-basics/installation" target="_blank" rel="noopener noreferrer" class="">CodeGPT</a>.</p>
<h1>Disclaimer</h1>
<p>Vous le savez sans doute, l'utiliation d modèles d'IA nécessitent beaucoup de ressources machine : un processeur performant, une carte graphique puissante (GPU) et une grande quantité de RAM sont généralement recommandés (LM Studio permet de choisir l’utilisation du CPU et/ou GPU, au passage).</p>
<h1>Prérequis</h1>
<p>Avant de commencer, assurez-vous d’avoir NodeJS d’installé en version 18+ et Visual Studio Code (VSCode).</p>
<h1>Installation de LM Studio</h1>
<p>👉 Allez sur le site de <a href="https://lmstudio.ai/download" target="_blank" rel="noopener noreferrer" class="">LM Studio</a> et téléchargez la version adaptée à votre matériel.</p>
<p>👉 Une fois installée, il est temps de choisir le modèle le plus adapté à votre besoin.</p>
<p>Nous vous proposons de tester le nouveau modèle de Mistral AI, <a href="https://mistral.ai/fr/news/codestral/" target="_blank" rel="noopener noreferrer" class="">Codestral</a> : un modèle qui supporte plus de 80 langages de programmation.</p>
<p>Il existe d'ailleurs des modèles alternatifs pour des assistants de code comme <a href="https://codellama.dev/about" target="_blank" rel="noopener noreferrer" class="">Code llama</a> ou <a href="https://github.com/bigcode-project/starcoder" target="_blank" rel="noopener noreferrer" class="">StarCoder</a> si vous souhaitez comparer.</p>
<p>👉 Ouvrez <strong>LM Studio</strong> et sélectionnez la loupe (dans le menu de gauche) afin de rechercher le modèle <strong>Codestral</strong> via la barre de recherche :</p>
<p><img decoding="async" loading="lazy" alt="LM Studio - Rechercher un modèle" src="https://blog.zatsit.fr/assets/images/lm-studio-1-6d3e1934f55dc06850ffbfd18054a931.webp" width="1657" height="1060" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="LM Studio - Ajouter un nouveau modèle" src="https://blog.zatsit.fr/assets/images/lm-studio-2-dca297b978f53ffd935b96d9a372aa7e.webp" width="1657" height="1060" class="img_ev3q"></p>
<p>👉 Une fois le modèle trouvé, cliquez sur le bouton <strong>Use in New Chat</strong> pour télécharger le modèle.</p>
<p><em>Patientez quelques instants, le temps de télécharger le modèle qui pèse un peu plus de 13 GB.</em></p>
<p>👉 Une fois téléchargé, accédez au menu <strong>Developer</strong> (icône <strong>Terminal</strong> sur la sidebar de gauche), puis sélectionnez le modèle à charger dans la barre du haut :</p>
<p><img decoding="async" loading="lazy" alt="LM Studio - Créer un serveur local utilisant le modèle téléchargé" src="https://blog.zatsit.fr/assets/images/lm-studio-3-e3a6c3dd1d0b2a26ca8bd984364caa3f.webp" width="1874" height="1088" class="img_ev3q"></p>
<p>👉 Chargez le modèle <strong>Codestral</strong> que vous venez de télécharger.</p>
<p>Patienter quelques instants, le modèle se charge en mémoire.</p>
<p>Une fois le chargement terminé, il ne vous reste plus qu’à cliquer sur <strong>Start Server</strong> pour commencer à utiliser votre assistant.</p>
<p><img decoding="async" loading="lazy" alt="LM Studio - Démarrer le serveur local" src="https://blog.zatsit.fr/assets/images/lm-studio-4-f31017538184b842233f836c41c49a2d.webp" width="1874" height="1088" class="img_ev3q"></p>
<p>La configuration de <strong>LM Studio</strong> est maintenant terminée.</p>
<p>Voyons comment effectuer son intégration dans <strong>VS Code</strong>.</p>
<h1>Intégration dans Visual Studio Code</h1>
<p>👉 La première chose à faire est de télécharger l’extension <a href="https://docs.codegpt.co/docs/tutorial-basics/installation" target="_blank" rel="noopener noreferrer" class="">CodeGPT</a> qui permet, en s’inscrivant sur leur site, d’accéder aux APIs de différentes IAs comme <strong>ChatGPT</strong> ou encore <strong>ClaudeAI</strong>.</p>
<p><img decoding="async" loading="lazy" alt="VSCode - Ajouter l&amp;#39;extension CodeGPT" src="https://blog.zatsit.fr/assets/images/vscode-1-5e16ad7705191f20f0836e81f2d8c211.webp" width="1363" height="1097" class="img_ev3q"></p>
<p>Toutefois, ce n’est pas ce que l’on souhaite faire ici.</p>
<p>Nous cherchons à utiliser l'infrastructure de nos machines, plutôt que celles de serveurs distants, souvent alimentés avec une énergie à la provenance inconnue et dans un datacenter sûrement pas tout proche.</p>
<p>Une belle façon d’être un peu plus <strong>green</strong> et de réduire notre empreinte 🌱.</p>
<p>👉 Une fois l’extension installée, cliquez sur l’icône <strong>ChatGPT</strong> dans la <em>sidebar</em> de gauche, puis sélectionnez l’assistant à utiliser.</p>
<p><img decoding="async" loading="lazy" alt="VSCode - Configurer l&amp;#39;extension CodeGPT" src="https://blog.zatsit.fr/assets/images/vscode-2-0ced2fa2a1c49077c81aab9661057535.webp" width="1363" height="1097" class="img_ev3q"></p>
<p>👉À la place de <strong>CodeGPT Plus</strong> (qui vous incite à utiliser les API des GAFAM de l’IA), choisissez <strong>LM Studio</strong> comme <strong>Provider Local</strong>.</p>
<p><img decoding="async" loading="lazy" alt="VSCode - Configurer le serveur local de LM Studio dans CodeGPT" src="https://blog.zatsit.fr/assets/images/vscode-3-0831694339b82eeec3d7adfd3303b250.webp" width="1363" height="1097" class="img_ev3q"></p>
<p>Et voilà ! Le tour est joué.</p>
<p>Vous avez à présent un assistant d’aide à la programmation, qui utilise directement vos ressources locales pour fonctionner.</p>
<p>Qui vous a dit qu'il n'était pas possible de faire de l'IA frugale ?</p>
<h1>Utiliser votre nouvel assistant</h1>
<p>Pour vérifier que l’assistant fonctionne bien, nous allons lui demander de créer un composant <em>Product Card</em> en ReactJS avec une image, un nom du produit, une courte description, un prix et un bouton d’ajout au panier, en interagissant directement avec la fenêtre de chat via le prompt suivant :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Create a product card component in react with product image, product name, short description, price and add to cart button</span><br></span></code></pre></div></div>
<p><em>Attention, les prompts sont à rédiger en anglais. Votre assistant ne fait pas encore la traduction automatique</em>.</p>
<p><img decoding="async" loading="lazy" alt="VSCode - Utiliser votre assistant IA directement dans VSCode avec CodeGPT" src="https://blog.zatsit.fr/assets/images/vscode-4-c73325f35a1c3eab2a3ae4315a2642b8.webp" width="1565" height="1070" class="img_ev3q"></p>
<p>Une fois le prompt envoyé, l’IA générative utilise le modèle <strong>Codestral</strong>  de votre <strong>LM Studio</strong> pour répondre.</p>
<p>Si vous vérifiez la fenêtre de votre LM Studio, vous verrez bien le prompt et la réponse dans les logs.</p>
<h1>Conclusion</h1>
<p>Le code généré par l’assistant n’est peut-être pas encore au niveau de ce que peut produire <a href="http://bolt.new/" target="_blank" rel="noopener noreferrer" class="">Bolt.new</a> de StackBlitz ou <a href="http://v0.dev/" target="_blank" rel="noopener noreferrer" class="">v0.dev</a> de Vercel, mais c’est déjà une première approche d’utilisation de l’IA beaucoup plus responsable (et économique).</p>
<p>Cet assistant se révèle toutefois plus efficace que ses alternatives, pour générer des tests unitaires à partir de votre code ou pour optimiser ce dernier.</p>
<p>Maintenant, c'est à vous de faire le reste :</p>
<ul>
<li class="">explorer les possibilités que vous offrent cet assistant</li>
<li class="">tester d’autres modèles d’IA (en local) plus adaptés à vos besoins.</li>
<li class="">en parler autour de vous, pour favoriser l'adoption de cette technique.</li>
</ul>
<p><strong>Aidez nous à avoir un impact en partageant cet article sur vos réseaux sociaux :</strong></p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Flocal-ai-assistant-in-vscode%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/tweet?text=https://blog.zatsit.fr/blog/local-ai-assistant-in-vscode" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage X" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>dev</category>
            <category>web</category>
            <category>green</category>
        </item>
        <item>
            <title><![CDATA[Crossplane - Présentation des concepts]]></title>
            <link>https://blog.zatsit.fr/crossplane-presentation-des-concepts</link>
            <guid>https://blog.zatsit.fr/crossplane-presentation-des-concepts</guid>
            <pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Crossplane est une extension open-source à Kubernetes qui permet aux équipes plateforme d'assembler l'infrastructure provenant de plusieurs cloud providers, et d'exposer des APIs de plus haut niveau pour que les équipes d'applicatives puissent les consommer.]]></description>
            <content:encoded><![CDATA[<p>Crossplane est une extension open-source à Kubernetes qui permet aux équipes plateforme d'assembler l'infrastructure provenant de plusieurs cloud providers, et d'exposer des APIs de plus haut niveau pour que les équipes d'applicatives puissent les consommer.</p>
<p><img decoding="async" loading="lazy" alt="Crossplane Logo" src="data:image/webp;base64,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" width="1161" height="653" class="img_ev3q"></p>
<p>Crossplane se définit comme annoncé sur leur baseline :</p>
<blockquote>
<p>Build control planes without needing to write code.
Crossplane has a highly extensible backend that enables you to orchestrate applications and infrastructure no matter where they run, and a highly configurable frontend that lets you define the declarative API it offers.</p>
</blockquote>
<p>...comme un orchestrateur de ressources multi-cloud.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="introduction">Introduction<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#introduction" class="hash-link" aria-label="Lien direct vers Introduction" title="Lien direct vers Introduction" translate="no">​</a></h2>
<p>Crossplane permet de définir des ressources de manière déclarative, et de les provisionner sur des clouds publics (AWS, Azure, GCP, etc.) ou privés (VMware, OpenStack, etc.).</p>
<p>Membre de la CNCF depuis 2020, ils ont rejoint le programme d'incubation (incubating) en 2021, dans la catégorie "Scheduling &amp; Orchestration" ce qui en fait un projet prometteur, puisque synonyme de stabilité et d'utilisation en production.</p>
<p>Crossplane se rapproche du mode de fonctionnement de Terraform et apporte des fonctionnalités supplémentaires qui le font se démarquer :</p>
<ul>
<li class="">Définition de ressources de manière déclarative</li>
<li class="">Réconciliation sur base du pattern des Kubernetes Operators</li>
</ul>
<p>Crossplane est un projet open source, disponible sur <a href="https://github.com/crossplane/crossplane" target="_blank" rel="noopener noreferrer" class="">GitHub</a> sous licence Apache 2.0 et majoritairement développé par la société <a href="https://upbound.io/" target="_blank" rel="noopener noreferrer" class="">Upbound</a>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="intérêt">Intérêt<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#int%C3%A9r%C3%AAt" class="hash-link" aria-label="Lien direct vers Intérêt" title="Lien direct vers Intérêt" translate="no">​</a></h2>
<p>Crossplane se démarque de ses concurrents par sa capacité à gérer des ressources et appliquer les modifications en live.
Le pattern de réconciliation lui permet d'être réactif et d'appliquer les changements sur les ressources distantes en temps réel, qui est une vue de l'esprit étant donné que la réconciliation est une boucle qui s'exécute à intervalles réguliers.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="architecture">Architecture<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#architecture" class="hash-link" aria-label="Lien direct vers Architecture" title="Lien direct vers Architecture" translate="no">​</a></h2>
<p>Crossplane s'architecture autour de plusieurs concepts :</p>
<ul>
<li class="">Manipuler les ressources Cloud</li>
<li class="">Orchestrer et ordonner la création des ressources</li>
<li class="">Provisionner une architecture complexe</li>
<li class="">Proposer un objet simple à manipuler</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="concepts">Concepts<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#concepts" class="hash-link" aria-label="Lien direct vers Concepts" title="Lien direct vers Concepts" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="provider">Provider<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#provider" class="hash-link" aria-label="Lien direct vers Provider" title="Lien direct vers Provider" translate="no">​</a></h3>
<p>Le Provider est le composant en charge de la gestion des ressources Cloud.
Il est responsable de la communication avec l'API du Cloud Provider, de la gestion du cycle de vie des ressources.</p>
<p><img decoding="async" loading="lazy" alt="Crossplane Providers" src="https://blog.zatsit.fr/assets/images/crossplane-providers-23668e7e00156f3ad9bd50762bef0f00.webp" width="642" height="598" class="img_ev3q"></p>
<p>Les providers sont labelisés <strong>Official</strong> (développés par Upbound) ou <strong>Community</strong> (développés par la communauté).</p>
<p>Chaque Provider s'installe avec des CRDs spécifiques qui définissent les ressources gérées par le Provider.
Ces CRDs permettent de décrire l'objet distant à créer, mettre à jour ou supprimer.</p>
<p><a href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/" target="_blank" rel="noopener noreferrer" class="">Lien vers la documentation des CRDs dans Kubernetes</a></p>
<p>Exemple avec le Provider Google Cloud Pub/Sub.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pkg.crossplane.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Provider</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> provider</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gcp</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pubsub</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">package</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xpkg.upbound.io/upbound/provider</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gcp</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pubsub</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">v1.8.3</span><br></span></code></pre></div></div>
<p>Le Provider accède au Cloud Provider dès lors qu'il est configuré avec les informations d'authentification (clé API, token, etc.) au travers de l'objet <code>ProviderConfig</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gcp.upbound.io/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ProviderConfig</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">credentials</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">source</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Secret</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">secretRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> upbound</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> provider</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">creds </span><span class="token comment" style="color:#999988;font-style:italic"># Nom du secret qui contient les credentials</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> creds </span><span class="token comment" style="color:#999988;font-style:italic"># Nom de l'attribut du secret qui contient les credentials</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">projectID</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> zatsit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">crossplane</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">demo</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="catalogue-des-providers">Catalogue des Providers<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#catalogue-des-providers" class="hash-link" aria-label="Lien direct vers Catalogue des Providers" title="Lien direct vers Catalogue des Providers" translate="no">​</a></h3>
<p>L'ensemble des Providers publiques sont disponibles sur la <a href="https://marketplace.upbound.io/" target="_blank" rel="noopener noreferrer" class="">Upbound Marketplace</a>.</p>
<p>Pour les Providers complexes, on retrouve le découpage par ressource sous la forme de Provider Family.</p>
<p>On retrouve donc des Providers pour les ressources EC2, S3, RDS, etc pour AWS, et de manière similaire pour les autres Cloud Providers.
Tous ces Providers sont regroupés dans une Provider Familiy qui contrôle la configuration des Providers du Cloud Provider.</p>
<p>Prenons exemple du provider <a href="https://marketplace.upbound.io/providers/upbound/provider-family-gcp/v1.8.3" target="_blank" rel="noopener noreferrer" class="">Google Cloud</a>, on retrouve la hiérarchie suivante :</p>
<ul>
<li class="">Provider Family <code>provider-family-gcp</code></li>
<li class="">Provider Config <code>ProviderConfig</code> lié à au Provider Family</li>
<li class="">Providers: <code>provider-gcp-compute</code>, <code>provider-gcp-container</code>, <code>provider-gcp-appengine</code>, etc</li>
</ul>
<blockquote>
<p>Dans l'histoire de Crossplane, les Providers historiques de AWS, Google Cloud et Azure étaient composés d'un seul agent responsable de la gestion de toutes les ressources du Cloud Provider.
Face à l'installation d'un nombre massif de CRDs dans le cluster Kubernetes, les développeurs ont décidé de découper les Providers en plusieurs sous-Providers, un par ressource, ce qui réduit drastiquement le nombre de CRDs installés et améliore le ratio CRD-utilisés / CRDs-installés.</p>
</blockquote>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="managed-resource-mr">Managed Resource (MR)<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#managed-resource-mr" class="hash-link" aria-label="Lien direct vers Managed Resource (MR)" title="Lien direct vers Managed Resource (MR)" translate="no">​</a></h3>
<p>Le Managed Resource est l'objet qui représente la ressource distante à gérer.
Il est défini par le Provider et est utilisé pour décrire la ressource à créer, mettre à jour ou supprimer.</p>
<p>Ce sont des objets Kubernetes qui sont créés dans le cluster Kubernetes et qui sont gérés par le Provider.</p>
<p>Exemple avec la ressource <a href="https://marketplace.upbound.io/providers/upbound/provider-gcp-pubsub/v1.8.3/resources/pubsub.gcp.upbound.io/Topic/v1beta1" target="_blank" rel="noopener noreferrer" class=""><code>Topic</code></a> du Provider <a href="https://marketplace.upbound.io/providers/upbound/provider-gcp-pubsub/v1.8.3" target="_blank" rel="noopener noreferrer" class="">Google Cloud Pub/Sub</a>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pubsub.gcp.upbound.io/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">meta.upbound.io/example-id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pubsub/v1beta1/topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">testing.upbound.io/example-name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">forProvider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Ce simple manifeste suffit amplement pour créer un Topic dans Google Cloud Pub/Sub du même nom que le nom du manifest (défini dans <code>metadata.name</code>).</p>
<p>On distingue deux types de Managed Resources :</p>
<ul>
<li class="">Les Managed Resources de type Crossplane : gérés par les providers du Cloud Provider.</li>
<li class="">Les Managed Resources de type Kubernetes : gérés par un autre contrôleur Kubernetes, externe à Crossplane.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Crossplane Managed Resources" src="https://blog.zatsit.fr/assets/images/crossplane-managed-resources-041aa426a344ed4a2313c74fff6e9741.webp" width="1341" height="727" class="img_ev3q"></p>
<p>Les deux types de Managed Resources possèdent leur avantages et inconvénients.
On détaillera cela dans un prochain article.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="composition">Composition<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#composition" class="hash-link" aria-label="Lien direct vers Composition" title="Lien direct vers Composition" translate="no">​</a></h3>
<p>La Composition est un objet qui permet de définir un ensemble d'objets qui cohabitent ensemble dans le but de créer une architecture complexe.</p>
<p>La Composition est un objet Kubernetes qui est géré par Crossplane et qui est responsable de la création, mise à jour et suppression des objets qui le composent.
Il est la pierre angulaire car c'est l'élément qui donne toute sa puissance en orchestrant les ressources.</p>
<p>Exemple avec une Composition qui crée les éléments suivants :</p>
<ul>
<li class="">Un Topic dans Google Cloud Pub/Sub</li>
<li class="">Un Job dans Cloud Scheduler</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apiextensions.crossplane.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Composition</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> job</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">notif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">compositeTypeRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog.zatsit.fr/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> XJobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Resources</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">base</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pubsub.gcp.upbound.io/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">meta.upbound.io/example-id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pubsub/v1beta1/topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">testing.upbound.io/example-name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dynamically</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">set</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">forProvider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">patches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> FromCompositeFieldPath</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">fromFieldPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> spec.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">toFieldPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metadata.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">base</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cloudscheduler.gcp.upbound.io/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">meta.upbound.io/example-id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cloudscheduler/v1beta1/job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">testing.upbound.io/example-name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">forProvider</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Test job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">httpTarget</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">body</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dGVzdAo=</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">httpMethod</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> POST</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">uri</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//postman</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">echo.com/post</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">region</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> us</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">central1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">schedule</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1 * * * *"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">patches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> FromCompositeFieldPath</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">fromFieldPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> spec.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">toFieldPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> metadata.name</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="composite-resource-definition-xrd">Composite Resource Definition (XRD)<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#composite-resource-definition-xrd" class="hash-link" aria-label="Lien direct vers Composite Resource Definition (XRD)" title="Lien direct vers Composite Resource Definition (XRD)" translate="no">​</a></h3>
<p>La Composite Resource Definition (XRD) est un objet plus haut niveau qui a pour but de définir l'architecture interne de notre Composition en définissant 2 objets :</p>
<ul>
<li class="">La Composite Resource (XR) : l'objet instancié qui définira le cycle de vie de notre objet complexe</li>
<li class="">Le Composite Resource Claim (XRC) : l'objet qui sera manipulé par l'utilisateur final et qui se veut simple</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Crossplane Composite Resource Definition" src="https://blog.zatsit.fr/assets/images/crossplane-xrd-611204b3ffdfb2bbe4d3aed265e08fcc.webp" width="729" height="387" class="img_ev3q"></p>
<p>La XRD est un objet complexe en apparence qui est juste très structuré.
Il comporte de façon très pragmatique 2 grandes sections :</p>
<ul>
<li class=""><code>claim</code> et <code>spec</code> : qui définissent la dénomination et la structure du Claim sous forme d'une CRD</li>
<li class=""><code>status</code> : qui définit la structure du XR lors de son instanciation</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Crossplane XRD Generation" src="https://blog.zatsit.fr/assets/images/crossplane-xrd-generation-64ca6a454f2754b3baf08483d9633daa.webp" width="1601" height="748" class="img_ev3q"></p>
<p>La XRD définit à la fois la XRC et la XR afin de garantir une cohérence entre les deux objets manipulés.
La XR n'a de sens que si les valeurs manipulées sont bien définies par les paramètres utilisateur.</p>
<p>En résumé, notre XRD est une CRD qui définit 2 autres CRDs : la XRC et la XR.</p>
<p>Voici un exemple de XRD pour notre Composition <code>JobNotif</code> :</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apiextensions.crossplane.io/v1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CompositeResourceDefinition</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xjobnotifs.blog.zatsit.fr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog.zatsit.fr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">names</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">plural</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> xjobnotifs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> XJobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">claimNames</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> JobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">plural</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotifs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">versions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">referenceable</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">served</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">openAPIV3Schema</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> object</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> string</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Name of the JobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">properties</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> object</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> object</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="composite-resource-claim-xrc">Composite Resource Claim (XRC)<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#composite-resource-claim-xrc" class="hash-link" aria-label="Lien direct vers Composite Resource Claim (XRC)" title="Lien direct vers Composite Resource Claim (XRC)" translate="no">​</a></h3>
<p>La Composite Resource Claim (XRC) est l'objet qui est manipulé par l'utilisateur.
Il a pour objectif d'être simmple et d'abstraire toute complexité liée à l'architecture en dessous.</p>
<p>Par exemple, pour notre Composition <code>JobNotif</code>, l'utilisateur final n'a pas besoin de connaître les sous-ressources créées en dessous, telle que le Service Account (SA) et ses credentials, la gestion des policies liées au SA ainsi que le stockage des valeurs sensibles dans le Secret Manager.
Toute cette complexité doit être masquée pour ne fournir à l'utilisateur la seule véritable information utile : le nom du Topic.</p>
<p><img decoding="async" loading="lazy" alt="Crossplane Claim" src="https://blog.zatsit.fr/assets/images/corssplane-claim-e3b00aea75c1835835e5dcd43dcbf7be.webp" width="1231" height="663" class="img_ev3q"></p>
<p>Voici un exemple de XRC pour notre Composition <code>JobNotif</code> :</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog.zatsit.fr/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> JobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> my</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">jobnotif</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="composite-resource-xr">Composite Resource (XR)<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#composite-resource-xr" class="hash-link" aria-label="Lien direct vers Composite Resource (XR)" title="Lien direct vers Composite Resource (XR)" translate="no">​</a></h3>
<p>La Composite Resource (XR) est l'objet qui est créé par Crossplane lors de l'instanciation de la XRC.</p>
<p><img decoding="async" loading="lazy" alt="Crossplane Composite Resource Status" src="https://blog.zatsit.fr/assets/images/crossplane-xr-status-115223392a57df82937c6170c231ae35.webp" width="1601" height="748" class="img_ev3q"></p>
<p>Il est responsable de la gestion des ressources sous-jacentes et de leur cycle de vie.
On trouve les sous-objets managés dans la structure <code>spec.resourceRefs</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Extrait du yaml de l'objet XR</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># kubectl get xjobnotifs/jobnotif-sample-hs772 -o yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog.zatsit.fr/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> XJobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourceRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pubsub.gcp.upbound.io/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Topic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">5ph7f</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cloudscheduler.gcp.upbound.io/v1beta1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">p8vqk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>La XR expose également l'état de l'objet dans sa globalité dans la structure <code>status</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Extrait du yaml de l'objet XR</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># kubectl get xjobnotifs/jobnotif-sample-hs772 -o yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog.zatsit.fr/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> XJobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">conditions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2024-11-28T12:00:40Z"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ReconcileSuccess</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Synced</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2024-11-28T12:01:05Z"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Available</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Ready</span><br></span></code></pre></div></div>
<p>On y trouve enfin les données manipulés et stockées pour les réutiliser dans les autres objets manipulés dans la composition.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Extrait du yaml de l'objet XR</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># kubectl get xjobnotifs/jobnotif-sample-hs772 -o yaml</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> blog.zatsit.fr/v1alpha1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> XJobNotif</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">job</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">p8vqk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jobnotif</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sample</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">hs772</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">5ph7f</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="approche-plateforme">Approche Plateforme<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#approche-plateforme" class="hash-link" aria-label="Lien direct vers Approche Plateforme" title="Lien direct vers Approche Plateforme" translate="no">​</a></h2>
<p>Crossplane se veut dichotomique en proposant une approche plateforme en distinguant 2 personas :</p>
<ul>
<li class="">Le développeur de la plateforme : qui consomme les ressources mises à disposition</li>
<li class="">L'ingénieur plateforme : qui compose les ressources et les expose aux développeurs</li>
</ul>
<p>Toute la complexité réside dans la définition du contrat de service entre les deux personas ainsi que la gestion des ressources sous-jacentes.</p>
<p>Une fois le contrat clair, le développeur écrit le manifest (XRC) qui décrit le besoin fondamental.</p>
<p><img decoding="async" loading="lazy" alt="Crossplane Approche Plateforme" src="https://blog.zatsit.fr/assets/images/crossplane-approche-plateforme-50c4a023b2658f591454ccee76a0f568.webp" width="1264" height="925" class="img_ev3q"></p>
<p>Cette approche amène des avantages intéressants qui en font un outil pertinent pour les équipes plateforme :</p>
<ul>
<li class="">La simplicité et la lisibilité des objets manipulés</li>
<li class="">La réutilisation des objets</li>
<li class="">L'autonomie des développeurs</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#conclusion" class="hash-link" aria-label="Lien direct vers Conclusion" title="Lien direct vers Conclusion" translate="no">​</a></h2>
<p>Crossplane est un outil qui permet d'abstraire la complexité des ressources Cloud et de les manipuler de manière déclarative.</p>
<p>Cette rapide introduction à Crossplane vous permet de comprendre les concepts de base et les forces de la solution.
Dans un prochain article, nous entrerons plus en détail sur l'utilisation de Crossplane avec des objets plus complexes et des cas d'utilisation plus avancés.</p>
<p>Il est important de noter que Crossplane est un outil qui s'adresse à des équipes plateforme qui ont une bonne connaissance de Kubernetes et des ressources Cloud.
Cet outil n'est pas à mettre sur tous vos projets, car il apporte une complexité supplémentaire qui n'est pas toujours nécessaire et qui peut engendrer des coûts (sous toutes formes possibles) supplémentaires.</p>
<p>Vous trouverez dans un prochain article un exemple concret d'utilisation de Crossplane pour provisionner une architecture qui manipule des objets non-predictifs.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="liens-utiles">Liens utiles<a href="https://blog.zatsit.fr/crossplane-presentation-des-concepts#liens-utiles" class="hash-link" aria-label="Lien direct vers Liens utiles" title="Lien direct vers Liens utiles" translate="no">​</a></h2>
<ul>
<li class="">Site officiel de Crossplane : <a href="https://crossplane.io/" target="_blank" rel="noopener noreferrer" class="">crossplane.io</a></li>
<li class="">GitHub Crossplane : <a href="https://github.com/crossplane/crossplane" target="_blank" rel="noopener noreferrer" class="">github.com/crossplane/crossplane</a></li>
<li class="">CNCF Crossplane : <a href="https://www.cncf.io/projects/crossplane/" target="_blank" rel="noopener noreferrer" class="">cncf.io/projects/crossplane</a></li>
</ul>]]></content:encoded>
            <category>cloud</category>
        </item>
        <item>
            <title><![CDATA[Hacktoberfest 2024 : l'engagement de zatsit]]></title>
            <link>https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source</link>
            <guid>https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source</guid>
            <pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Le mois d'octobre est LE mois de l'année pour tous les amoureux de l'open source, c'est le mois du Hacktoberfest !]]></description>
            <content:encoded><![CDATA[<p>Le mois d'octobre est LE mois de l'année pour tous les amoureux de l'open source, c'est le mois du <a href="https://hacktoberfest.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Hacktoberfest</strong></a> !
La communauté open source a besoin d'aide (d'idées, de compétences, de temps) pour faire avancer ses projets.</p>
<p>Il était donc évident pour nous de participer activement à cet événement, en contribuant sur des projets qui nous tiennent à cœur, ou que nous utilisons au quotidien.</p>
<p><img decoding="async" loading="lazy" alt="hacktoberfest banner" src="https://blog.zatsit.fr/assets/images/hbf-b398079d4cef223f2bc5682370bab868.avif" width="1200" height="720" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="faut-il-rappeler-ce-quest-lopen-source-">Faut-il rappeler ce qu'est l'open source ?<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#faut-il-rappeler-ce-quest-lopen-source-" class="hash-link" aria-label="Lien direct vers Faut-il rappeler ce qu'est l'open source ?" title="Lien direct vers Faut-il rappeler ce qu'est l'open source ?" translate="no">​</a></h2>
<p>L'open source est un modèle de développement qui repose sur la collaboration et le partage.
Les projets open source sont accessibles à tous, permettant à chacun de consulter, modifier et/ou partager le code.</p>
<p>Le mouvement open source est animé par une communauté mondiale de développeurs (mais pas que...) qui donnent de leur temps pour faire évoluer les projets.
Le code est hébergé sur une multitude de plateformes, dont les plus connues sont GitHub et GitLab.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="quest-ce-que-le-hacktoberfest-">Qu'est-ce que le Hacktoberfest ?<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#quest-ce-que-le-hacktoberfest-" class="hash-link" aria-label="Lien direct vers Qu'est-ce que le Hacktoberfest ?" title="Lien direct vers Qu'est-ce que le Hacktoberfest ?" translate="no">​</a></h2>
<p>Le <a href="https://hacktoberfest.com/" target="_blank" rel="noopener noreferrer" class=""><strong>Hacktoberfest</strong></a> est un événement annuel qui se déroule tout au long du mois d'octobre.
Il a pour objectif d'encourager les contributions à des projets open source en récompensant les participants qui réalisent des <strong>pull requests</strong>/<strong>merge requests</strong> sur des dépôts publics.</p>
<p>L'année 2024 sonne la 11ème édition du Hacktoberfest, événement sponsorisé par <a href="https://hacktoberfest.com/about/" target="_blank" rel="noopener noreferrer" class="">DigitalOcean, Cloudflare et Quira</a>, et pour lequel l'engouement ne cesse de croître.
C'est l'occasion pour des milliers de développeurs, étudiants, passionnés et/ou curieux de rejoindre la communauté open source, d'apprendre, de partager, voire de s'amuser.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="nos-contributions-au-hacktoberfest-2024">Nos contributions au Hacktoberfest 2024<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#nos-contributions-au-hacktoberfest-2024" class="hash-link" aria-label="Lien direct vers Nos contributions au Hacktoberfest 2024" title="Lien direct vers Nos contributions au Hacktoberfest 2024" translate="no">​</a></h2>
<p>Nous avons mis le collectif à contribution sur tout le mois d'octobre, pendant nos midis à l'agence pour certains, et lors de <a href="https://www.linkedin.com/posts/zatsit_prs-gouvernance-zatsday-activity-7255604241640173569-4-cJ?utm_source=share&amp;utm_medium=member_desktop" target="_blank" rel="noopener noreferrer" class="">notre zatsday d'Octobre</a>, pour contribuer à des projets open source.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="consul-democracy---amélioration-de-linterface-utilisateur">Consul Democracy - Amélioration de l'interface utilisateur<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#consul-democracy---am%C3%A9lioration-de-linterface-utilisateur" class="hash-link" aria-label="Lien direct vers Consul Democracy - Amélioration de l'interface utilisateur" title="Lien direct vers Consul Democracy - Amélioration de l'interface utilisateur" translate="no">​</a></h3>
<ul>
<li class="">Projet : <a href="https://github.com/consuldemocracy/consuldemocracy" target="_blank" rel="noopener noreferrer" class="">Consul Democracy</a></li>
<li class="">Description : Consul Democracy est une plateforme de participation citoyenne. (<em>Consul Democracy - Open Government and E-Participation Web Software</em>)</li>
<li class="">Contributeur : <a href="https://github.com/nfourre" target="_blank" rel="noopener noreferrer" class="">Nicolas FOURRE</a></li>
<li class="">Pull Request : <a href="https://github.com/consuldemocracy/consuldemocracy/pull/5757" target="_blank" rel="noopener noreferrer" class="">Fill in space in social buttons when options are turned off</a></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="impact-framework---amélioration-de-la-documentation">Impact Framework - Amélioration de la documentation<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#impact-framework---am%C3%A9lioration-de-la-documentation" class="hash-link" aria-label="Lien direct vers Impact Framework - Amélioration de la documentation" title="Lien direct vers Impact Framework - Amélioration de la documentation" translate="no">​</a></h3>
<ul>
<li class="">Projet : <a href="https://github.com/Green-Software-Foundation/if-docs" target="_blank" rel="noopener noreferrer" class="">Impact Framework - Documentation</a></li>
<li class="">Description : Documentation pour le projet Impact Framework de la Green Software Foundation. (<em>Documentation website for the Impact Framework project</em>)</li>
<li class="">Contributeur : <a href="https://github.com/quentin-burg" target="_blank" rel="noopener noreferrer" class="">Quentin BURG</a></li>
<li class="">Pull Request : <a href="https://github.com/Green-Software-Foundation/if-docs/pull/117" target="_blank" rel="noopener noreferrer" class="">Fix example in quick-start.md</a></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="asyncapi---amélioration-de-lexperience-utilisateur">AsyncAPI - Amélioration de l'experience utilisateur<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#asyncapi---am%C3%A9lioration-de-lexperience-utilisateur" class="hash-link" aria-label="Lien direct vers AsyncAPI - Amélioration de l'experience utilisateur" title="Lien direct vers AsyncAPI - Amélioration de l'experience utilisateur" translate="no">​</a></h3>
<ul>
<li class="">Projet : <a href="https://github.com/asyncapi/website" target="_blank" rel="noopener noreferrer" class="">AsyncAPI - Website</a></li>
<li class="">Description : Site web de AsyncAPI (<em>AsyncAPI specification website</em>)</li>
<li class="">Contributeur : <a href="https://github.com/GuillaumeGayot" target="_blank" rel="noopener noreferrer" class="">Guillaume GAYOT</a></li>
<li class="">Pull Request : <a href="https://github.com/asyncapi/website/pull/3268" target="_blank" rel="noopener noreferrer" class="">fix(migrating-to-v3): fix mark down to ensure correct highlighting</a></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="cocogitto---gestion-des-identifiants-utilisateur-dans-la-github-action">Cocogitto - Gestion des identifiants utilisateur dans la Github Action<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#cocogitto---gestion-des-identifiants-utilisateur-dans-la-github-action" class="hash-link" aria-label="Lien direct vers Cocogitto - Gestion des identifiants utilisateur dans la Github Action" title="Lien direct vers Cocogitto - Gestion des identifiants utilisateur dans la Github Action" translate="no">​</a></h3>
<ul>
<li class="">Projet : <a href="https://github.com/cocogitto/cocogitto-action" target="_blank" rel="noopener noreferrer" class="">Cocogitto - Github Action</a></li>
<li class="">Description : Github Action pour vérifier la compliance au conventional commit. (<em>A github action to ensure your current gitlog respect the conventional commit specification</em>)</li>
<li class="">Contributeur : <a href="https://github.com/sergejomon" target="_blank" rel="noopener noreferrer" class="">Guillaume GAYOT</a></li>
<li class="">Pull Request : <a href="https://github.com/cocogitto/cocogitto-action/pull/31" target="_blank" rel="noopener noreferrer" class="">Feat/add input for profile</a></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="crossplane-assistant---création-de-la-documentation-du-projet">Crossplane Assistant - Création de la documentation du projet<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#crossplane-assistant---cr%C3%A9ation-de-la-documentation-du-projet" class="hash-link" aria-label="Lien direct vers Crossplane Assistant - Création de la documentation du projet" title="Lien direct vers Crossplane Assistant - Création de la documentation du projet" translate="no">​</a></h3>
<ul>
<li class="">Projet : <a href="https://github.com/crossplane-assistant/readthedocs" target="_blank" rel="noopener noreferrer" class="">Crossplane Assistant - Documentation</a></li>
<li class="">Description : Documentation du projet Crossplane Assistant (<em>Crossplane Assistant documentation website</em>)</li>
<li class="">Contributeur : <a href="https://github.com/germainlefebvre4" target="_blank" rel="noopener noreferrer" class="">Germain LEFEBVRE</a></li>
<li class="">Pull Request : <a href="https://github.com/crossplane-assistant/readthedocs/pull/1" target="_blank" rel="noopener noreferrer" class="">feat: Full website documentation</a></li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mocked-api---ajout-dune-nouvelle-fonctionnalité">Mocked API - Ajout d'une nouvelle fonctionnalité<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#mocked-api---ajout-dune-nouvelle-fonctionnalit%C3%A9" class="hash-link" aria-label="Lien direct vers Mocked API - Ajout d'une nouvelle fonctionnalité" title="Lien direct vers Mocked API - Ajout d'une nouvelle fonctionnalité" translate="no">​</a></h3>
<ul>
<li class="">Projet : <a href="https://github.com/ageddesi/Mocked-API" target="_blank" rel="noopener noreferrer" class="">Mocked API - Github</a></li>
<li class="">Description : Ajout d'une fonctionnalité sur l'envoi de mail</li>
<li class="">Contributeur : <a href="https://github.com/sergejomon" target="_blank" rel="noopener noreferrer" class="">Guillaume GAYOT</a></li>
<li class="">Pull Request : <a href="https://github.com/ageddesi/Mocked-API/pull/368" target="_blank" rel="noopener noreferrer" class="">feat(emails): add endpoint for random email using user names #368</a></li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="pourquoi-promouvoir-lopen-source-">Pourquoi promouvoir l’open source ?<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#pourquoi-promouvoir-lopen-source-" class="hash-link" aria-label="Lien direct vers Pourquoi promouvoir l’open source ?" title="Lien direct vers Pourquoi promouvoir l’open source ?" translate="no">​</a></h2>
<p>Chez <strong>zatsit</strong>, nous croyons fermement que l’open source est un véritable tremplin pour l’innovation et la démocratisation des technologies, de la simple librairie de développement jusqu'à la gestion complète d'un CRM.</p>
<p>En participant au Hacktoberfest, nous promouvons cette culture de partage et de collaboration.
Pour nous, chaque contribution est importante, qu’elle soit technique ou non, et permet de faire avancer les projets.</p>
<p>Voici quelques raisons pour lesquelles nous encourageons l’open source :</p>
<ul>
<li class=""><strong>Accessibilité</strong> : Le code source est public et permet à toute personne/développeur, quelle que soit sa localisation, d'y accéder, d’apprendre, d’utiliser, de partager et d'y contribuer.</li>
<li class=""><strong>Innovation</strong> : La communauté open source regorgent de talents, et c'est tous ensemble que les projets les plus innovants peuvent voir le jour. L'exposition des projet au grand public permet de diffuser le savoir des plus innovants et partager cette connaissance.</li>
<li class=""><strong>Transparence et sécurité</strong> : Le code source est publique donc la transparence est totale, ce qui permet à la communauté d’auditer, d’identifier et de corriger les failles de sécurité plus efficacement.</li>
<li class=""><strong>Indépendance technologique</strong> : L’open source permet aux entreprises et aux utilisateurs de ne pas dépendre d'un provider en particulier et ainsi adapter les outils selon leurs besoins.</li>
<li class=""><strong>Gratuité</strong> : La plupart des projets open source sont gratuits, ce qui permet à tous d’y accéder, de les utiliser voir de les modifier (fork).</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="remerciements-à-la-communauté-open-source">Remerciements à la communauté open source<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#remerciements-%C3%A0-la-communaut%C3%A9-open-source" class="hash-link" aria-label="Lien direct vers Remerciements à la communauté open source" title="Lien direct vers Remerciements à la communauté open source" translate="no">​</a></h3>
<p>Le Hacktoberfest est un moment privilégié pour remercier toutes les personnes qui font vivre cette communauté.
Que vous soyez développeur, traducteur, testeur ou simple utilisateur, votre contribution est précieuse.
C'est grâce à vous que des projets d’envergure internationale voient le jour, évoluent, et restent accessibles à tous.</p>
<p>Nous remercions tous les contributeurs de <strong>zatsit</strong>.
Ce mois d'octobre a permis de mettre en lumière nos efforts sur la partie open source.
Mais cet engagement ne s'arrête pas au mois d'octobre, il est permanent et nous continuons de contribuer au sein de la communauté tout au long de l'année.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rejoignez-nous-pour-le-prochain-hacktoberfest">Rejoignez-nous pour le prochain Hacktoberfest<a href="https://blog.zatsit.fr/hacktoberfest-2024-zatsit-engage-open-source#rejoignez-nous-pour-le-prochain-hacktoberfest" class="hash-link" aria-label="Lien direct vers Rejoignez-nous pour le prochain Hacktoberfest" title="Lien direct vers Rejoignez-nous pour le prochain Hacktoberfest" translate="no">​</a></h3>
<p>Le Hacktoberfest est une aventure collective ouverte à tous, des débutants aux experts.
Si vous souhaitez vous lancer ou approfondir vos compétences, <a href="https://www.zatsit.fr/collaborer-avec-zatsit/" target="_blank" rel="noopener noreferrer" class="">rejoignez-nous</a> !
Chaque contribution, même minime, aide à faire avancer la technologie.</p>
<p>Ensemble, continuons à construire de meilleurs outils, plus justes et plus accessibles.</p>
<p><img decoding="async" loading="lazy" alt="team zatsit" src="https://blog.zatsit.fr/assets/images/zatsit-d99eb3f4b7b8aedf14ac214691517ed1.avif" width="1163" height="856" class="img_ev3q"></p>
<p>Vous avez aimé ce post ? Partagez le !</p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https://blog.zatsit.fr/blog/hacktoberfest-2024-zatsit-engage-open-source" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/tweet?text=https://blog.zatsit.fr/blog/hacktoberfest-2024-zatsit-engage-open-source" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage X" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>hacktoberfest</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Realworld, ou la mère des applications démo]]></title>
            <link>https://blog.zatsit.fr/realworld-app</link>
            <guid>https://blog.zatsit.fr/realworld-app</guid>
            <pubDate>Tue, 29 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Hello, world! Et voilà ! Je sais comment développer avec Vue | Java | Rust | GoLang ! 🤓]]></description>
            <content:encoded><![CDATA[<p><code>Hello, world!</code> Et voilà ! Je sais comment développer avec <code>Vue | Java | Rust | GoLang</code> ! 🤓
Faire de la veille sur un projet technologique nécessite de trouver des cas d'implémentation, ce qui n'est jamais vraiment simple à trouver, non ?</p>
<p>Ca tombe bien, on a la solution pour vous : <em>Realworld</em> !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="realworld-cest-quoi--">Realworld, c'est quoi ? 🤔<a href="https://blog.zatsit.fr/realworld-app#realworld-cest-quoi--" class="hash-link" aria-label="Lien direct vers Realworld, c'est quoi ? 🤔" title="Lien direct vers Realworld, c'est quoi ? 🤔" translate="no">​</a></h2>
<p><a href="https://github.com/gothinkster/realworld" target="_blank" rel="noopener noreferrer" class="">Realworld</a> est un projet open-source se basant sur un clone du site blog Medium.com. Il a pour objectif de montrer comment implémenter une application web moderne en utilisant différents frameworks et langages de programmation.</p>
<p><em>Comment ?</em> me direz-vous. Très simple, il suffit de suivre les <a href="https://github.com/gothinkster/realworld/tree/main/api" target="_blank" rel="noopener noreferrer" class="">spécifications de l'API</a> pour implémenter les fonctionnalités de base d'un site de blog.</p>
<p>L'avantage de cette approche est que le site permet de mixer le frontend et le backend de votre choix parmi plus de <a href="https://codebase.show/projects/realworld" target="_blank" rel="noopener noreferrer" class="">100 implémentations de l'API</a> le tout se reposant sur cette même API définie.</p>
<p>C'est un excellent moyen de partager vos connaissances, pourquoi ne pas contribuer en <a href="https://codebase.show/projects/realworld/implementations/submit" target="_blank" rel="noopener noreferrer" class="">ajoutant votre propre implémentation</a> ?</p>
<p>N'hésitez pas à partager ce projet à vos connaissances, c'est une excellente ressource pour apprendre de nouvelles technologies !</p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Frealworld-app%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/post?text=Pr%C3%A9sentation%20de%20Realworld%2C%20un%20projet%20pour%20faire%20une%20application%20d%C3%A9mo%20selon%20vos%20envies.&amp;url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Frealworld-app%2F%20" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage X" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>architecture</category>
            <category>dev</category>
        </item>
        <item>
            <title><![CDATA[Mon onboarding chez zatsit]]></title>
            <link>https://blog.zatsit.fr/onboarding</link>
            <guid>https://blog.zatsit.fr/onboarding</guid>
            <pubDate>Sat, 10 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Mon arrivée dans une nouvelle aventure ! Découvrez les valeurs que j'aime chez zatsit et comment se passe l'onboarding.]]></description>
            <content:encoded><![CDATA[<p>Mon arrivée dans une nouvelle aventure ! Découvrez les valeurs que j'aime chez <strong>zatsit</strong> et comment se passe l'onboarding.</p>
<p><img decoding="async" loading="lazy" alt="Gourde  et sweat" src="https://blog.zatsit.fr/assets/images/gourde_sweat_banniere-c23555541c421f16fbbcd710dedb7121.webp" width="4077" height="789" class="img_ev3q"></p>
<p>Lundi ! Arrivée dans les locaux, je suis accueilli par Flavien (un des co-fondateurs) et Océane (notre chargée de missions RH de choc). Un bureau m'attend avec quelques goodies estampillés aux couleurs de l'entreprise : gourde en métal recyclé, sweat (dont le fabricant et membre de <a href="https://www.fairwear.org/" target="_blank" rel="noopener noreferrer" class="">fairwear.org</a>), sticker et un petit mot d'accueil qui me font très plaisir.</p>
<p>La matinée commence par la partie administrative (ce que tout le monde «&nbsp;adore&nbsp;», n'est ce pas ?)</p>
<ul>
<li class="">les divers documents à fournir et quelques validations d’identité habituelles.</li>
<li class="">On active mes accès à <a href="https://www.ekip.app/" target="_blank" rel="noopener noreferrer" class="">Ekip</a>. Je découvre ainsi les tickets restaurants <strong>écoresponsables</strong>.</li>
<li class="">Puis avec Océane on passe en revue les accès aux outils qui permettent le suivi pour mes futures missions. D'ailleurs, <strong>zatsit</strong> a mis en place une plateforme dédiée pour l'onboarding des consultants, permettant de mettre en avant les quelques «&nbsp;formations&nbsp;» a dérouler pour être opérationnel.</li>
</ul>
<p>On reparle avec tous le monde de ce l’on veut construire à l’avenir et des impacts que veut avoir <strong><a href="https://zatsit.fr/" target="_blank" rel="noopener noreferrer" class="">zatsit</a></strong> sur les aspects sociétal et environnemental.</p>
<p>Ce qui m’amène à vous parler du choix sur le matériel qu’a fait la société.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mon-meilleur-moment-de-la-journée--la-découverte-de-mon-outil-de-travail">Mon meilleur moment de la journée : la découverte de mon outil de travail<a href="https://blog.zatsit.fr/onboarding#mon-meilleur-moment-de-la-journ%C3%A9e--la-d%C3%A9couverte-de-mon-outil-de-travail" class="hash-link" aria-label="Lien direct vers Mon meilleur moment de la journée : la découverte de mon outil de travail" title="Lien direct vers Mon meilleur moment de la journée : la découverte de mon outil de travail" translate="no">​</a></h2>
<p>Peu de temps avant mon arrivée, j’ai reçu un message qui me demandait de choisir la configuration de mon futur poste de travail <a href="https://frame.work/fr/fr" target="_blank" rel="noopener noreferrer" class="">Framework</a>.</p>
<p>J’ai ainsi découvert leur concept : proposer du matériel réparable et évolutif. Ce choix permet à <strong>zatsit</strong> de rester cohérent dans sa politique environnementale et avoir un impact le plus restreint possible sur la planête.</p>
<p>J’ai donc choisi les différents éléments de ma machine : un&nbsp;13 pouces avec coque en aluminium, le processeur, la ram, le disque, les extensions… Et pour le fun, le montage à faire par mes soins pour prendre en main l'assemblage du hardware.</p>
<p><img decoding="async" loading="lazy" alt="Etapes de l&amp;#39;assembalge" src="https://blog.zatsit.fr/assets/images/framework_assembling-3462bf4c484110f7dad9dc2b6a488e30.webp" width="992" height="992" class="img_ev3q"></p>
<p>Donc tout était là, dans un carton contenant les diverses parties de mon ordinateur. Quand on a l’habitude de monter des configurations, et comme tout est suffisamment indiqué sur la carte mère, l'assemblage se fait plutôt facilement et en quelques minutes : on installe le disque SSD et la mémoire, on referme avec le couvercle, qui est le clavier, on serre quelque vis avec l’outil qui est fournit, et <strong>zatsit</strong> !</p>
<p>Le petit plus sympa : le contour de l’écran est amovible et il existe plusieurs couleurs. Moi, j’ai choisi le orange.</p>
<p><img decoding="async" loading="lazy" alt="les extensions et leurs emplacements" src="https://blog.zatsit.fr/assets/images/extensions-3827aff034b6ade2eb731c991a709d0b.webp" width="992" height="337" class="img_ev3q"></p>
<p>Pour pouvoir alimenter la machine et la connecter à des périphériques, il y a 4 emplacements qui peuvent recevoir des modules d’extension en tous genres&nbsp;: USB type A ou C, HDMI, Ethernet et autres que l'on peut interchanger, et à chaud.</p>
<p>Et pour certaines extensions, on peut également y ajouter un peu de couleur.</p>
<p><img decoding="async" loading="lazy" alt="La machine une fois assemblée" src="https://blog.zatsit.fr/assets/images/setup-5efe80a24033a0ec2713951120a7d9ba.webp" width="918" height="1143" class="img_ev3q"></p>
<p>Une fois tout en place, j’ai installé une distribution Linux (Ubuntu 24.04) à partir d’une clé USB que j’avais préparé en avance en suivant les <a href="https://guides.frame.work/Guide/Ubuntu+22.04+LTS+Installation+on+the+Framework+Laptop+13/109" target="_blank" rel="noopener noreferrer" class="">indications fournies sur le site du fabriquant</a>.</p>
<p>Et tout était fonctionnel au premier démarrage !</p>
<p>J’ai commencé à travailler sur ce poste après avoir configuré un environnent de développement. Je suis enthousiaste à l’idée d'utiliser ma machine lors de mes missions.</p>
<p>Parcourir le site de Framework <a href="https://frame.work/fr/fr" target="_blank" rel="noopener noreferrer" class="">Framework</a> est intéressant :</p>
<ul>
<li class="">On y découvre que beaucoup de matériaux constituant les postes de travail sont en bonne partie recyclés.</li>
<li class="">Qu’il est aussi possible de commander tous les composants séparément (cela va jusqu'au kit de visserie) ce qui permet de réparer ou de faire évoluer sa configuration facilement au fil des années (Idée que je trouve intéressante quand on à déjà ouvert un ordinateur portable et de constaté que l’on ne pourra pas faire grand chose pour se dépanner)</li>
<li class="">Pour chaque composant proposé sur la marketplace, il existe un tutoriel de remplacement avec la difficulté, les étapes et le temps nécessaire à l'opération. Ce qui permet d'effectuer facilement la maintenance de son poste de travail par ses propres moyens.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Exemple d&amp;#39;un guide de réparation" src="https://blog.zatsit.fr/assets/images/reparation-fc8a0107b002050417a31081aca84148.webp" width="992" height="992" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="en-attendant-de-démarrer-mon-nouveau-projet-client">En attendant de démarrer mon nouveau projet client...<a href="https://blog.zatsit.fr/onboarding#en-attendant-de-d%C3%A9marrer-mon-nouveau-projet-client" class="hash-link" aria-label="Lien direct vers En attendant de démarrer mon nouveau projet client..." title="Lien direct vers En attendant de démarrer mon nouveau projet client..." translate="no">​</a></h2>
<p>En attendant mon démarrage chez un client, j'en ai profité pour commencer les <em>Classrooms</em> élaborées par <strong>zatsit</strong>.</p>
<p>Les premiers ateliers m’ont permis de découvrir les principes de l’éco-conception ou d’étudier et de comprendre les solutions de monitoring pour l’empreinte carbone de projets cloud.</p>
<p>La société veut sensibiliser ses collaborateurs aux impacts environnementaux de nos métiers.</p>
<p>Des sujets très intéressants et que j’avais un peu survolé jusqu’à aujourd’hui. Cela va <strong>impacter</strong> ma façon de concevoir mes futurs projets en tant que technical leader.</p>
<p>J'ai pu collaborer à un premier projet, qui m'a fait découvrir certaines solutions de Firebase et Google Cloud Platform, auquel mes collègues pourront contribuer dans les semaines qui arrivent.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mon-avenir-chez-zatsit-">Mon avenir chez zatsit ?<a href="https://blog.zatsit.fr/onboarding#mon-avenir-chez-zatsit-" class="hash-link" aria-label="Lien direct vers Mon avenir chez zatsit ?" title="Lien direct vers Mon avenir chez zatsit ?" translate="no">​</a></h2>
<p>Je suis persuadé que les mois à venir vont être enrichissants et vont me faire grandir.</p>
<p>D’une part, l’équipe <strong>zatsit</strong> est à l’écoute quant à mes souhaits sur le périmètre de mes futures missions, mes envies de découvrir d’autres écosystèmes chez nos clients, et de me donner l’opportunité de faire mes preuves en tant que tech lead.</p>
<p>D’autre part, je vais pouvoir participer à des projets internes&nbsp;toujours en lien avec les convictions de la société qui vont favoriser les échanges au sein d’un collectif de passionnés.</p>
<p>Pour donner un exemple, on se prépare à participer à l’Hacktoberfest, événement qui encourage les développeurs à contribuer sur des projets open source.
Il se peut d'ailleurs que l’on se croise lors d’un BBL, ou d’un Meetup sur des sujets passionnants organisé par <strong>zatsit</strong></p>
<p>Alors, prêt à rejoindre l'aventure <strong>zatsit</strong> ?</p>]]></content:encoded>
            <category>general</category>
        </item>
        <item>
            <title><![CDATA[Faites maigrir votre JavaScript]]></title>
            <link>https://blog.zatsit.fr/bundlephobia-reduire-javascript</link>
            <guid>https://blog.zatsit.fr/bundlephobia-reduire-javascript</guid>
            <pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Dans l’écosystème JavaScript, rien de plus facile que d’ajouter une nouvelle librairie à son projet, qu’il soit front-end ou back-end. NPM est là pour nous aider, un simple “npm install @theultimatelib” et hop, le tour est joué.]]></description>
            <content:encoded><![CDATA[<p>Dans l’écosystème JavaScript, rien de plus facile que d’ajouter une nouvelle librairie à son projet, qu’il soit front-end ou back-end. NPM est là pour nous aider, un simple “npm install @theultimatelib” et hop, le tour est joué.</p>
<p>Mais dans une démarche d’éco-conception et de performance, comment savoir si la librairie que l’on vient d’installer est la meilleure ? Ou la plus adaptée ? A-t-elle un impact sur le poids de mon application ?</p>
<p>Pour avoir plus d’information sur les librairies JavaScript que vous utilisez, un petit outil en ligne vous permet d’analyser leur impact sur le poids de votre application, mais également pour les applications front-end, l’impact sur le temps de chargement.</p>
<p>Cet outil, c'est BUNDLEPHOBIA ! (<a href="https://bundlephobia.com/" target="_blank" rel="noopener noreferrer" class="">https://bundlephobia.com/</a>)</p>
<p><img decoding="async" loading="lazy" alt="Bundlephobia" src="https://blog.zatsit.fr/assets/images/bundlephobia_1-66619dde1c7f601574c016aa91aa9e9b.webp" width="785" height="501" class="img_ev3q"></p>
<p>Voici un petit exemple de ce que propose “bundlephobia” pour la librairie Axios, libraire bien connue des développeurs front-end et back-end (Node.js) qui permet d’effectuer des appels HTTP.</p>
<p><img decoding="async" loading="lazy" alt="Librairie Axios" src="https://blog.zatsit.fr/assets/images/axios_lib-5664164a0cec25003aab177ebd445625.webp" width="1338" height="725" class="img_ev3q"></p>
<p>On retrouve plusieurs informations sur la librairie :</p>
<ul>
<li class="">sa dernière version, ici la 1.7.2</li>
<li class="">savoir si la librairie utilise le “tree-shaking” ou non (ce qui permet une réduction du bundle généré si on n'utilise pas toutes les fonctions de la librairie)</li>
<li class="">si la librairie est sensible aux interférences avec d’autres librairies tierces</li>
<li class="">le nombre de dépendances qu’elle possède, ici 3 dépendances</li>
<li class="">le poids de la librairie minifiée ou minifiée et compressée</li>
<li class="">le temps de chargement de cette librairie en slow 3G et 4G (ce temps peut être réduit avec l’utilisation du “tree-shaking”)</li>
<li class="">l’évolution du poids de la librairie au fil des versions</li>
<li class="">la composition de la libraire (si le code est majoritairement interne à la librairie ou provient des dépendances), ici 99,8% du code est du code source de la librairie.</li>
</ul>
<p>Petit bonus, “Bundlephobia” propose des alternatives à l’utilisation de la librairie, avec l’impact sur le poids du bundle. Ici, “Bundlephobia” propose “Phin” comme alternative qui est aussi un client HTTP pour Node.js. Ce dernier est 66% plus léger, mais attention, il ne propose peut-être pas toutes les fonctionnalités d’Axios, il vous revient le choix de tester ou non. Vous pouvez également proposer d’autres librairies alternatives à Axios et venir enrichir la base de donnée de “Bundlephobia” et contribuer à son développement.</p>
<p>À vous maintenant, de tester vos package.json pour tenter de réduire la taille de vos applications front-end ou Node.js pour plus de performance et pour améliorer leur empreinte carbone !</p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fbundlephobia-reduire-javascript" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/tweet?text=Analysez%20et%20reduisez%20l%27impact%20des%20librairies%20tierces%20avec%20Bundlephobia.%20Rendez%20vos%20appplications%20plus%20rapide%20et%20moins%20energivore.&amp;url=https%3A%2F%2Fblog.zatsit.fr%2Fbundlephobia-reduire-javascript" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>dev</category>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[Le Green IT, épisode 1 : Au fond du trou ?]]></title>
            <link>https://blog.zatsit.fr/green-exploitation-miniere</link>
            <guid>https://blog.zatsit.fr/green-exploitation-miniere</guid>
            <pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Le printemps 2024 est terminé (si vous l'avez vu passé) et nous voyons clairement que nous commençons à manquer de prénoms pour les tempêtes,]]></description>
            <content:encoded><![CDATA[<p>Le printemps 2024 est terminé (si vous l'avez vu passé) et nous voyons clairement que nous commençons à manquer de prénoms pour les tempêtes,
que les normales de saisons ne sont plus vraiment normales, que la sécheresse ou à l'inverse
les inondations sont importantes et plus seulement au bout du monde, mais au plus près de nous.</p>
<p>L'empreinte de l'industrialisation est avérée dans l'augmentation, des gaz à effet de serre, mais l'empreinte liée aux matières
premières nécessaires à cette industrialisation et à ses produits finis l'est moins.
Entre les deux, il y a bien sûr la consommation énergétique liée à l'extraction, la fabrication, la distribution et l'utilisation.</p>
<p>Je vous propose une série d'articles consacrée aux impacts du numérique sur notre environnement et nous commençons par une des sources : les matières premières, surtout les métaux.</p>
<p><img decoding="async" loading="lazy" alt="Image d&amp;#39;une foreuse dans une mine" src="https://blog.zatsit.fr/assets/images/greenIT-machine-digger-3622a0f7fe484dd4dd790572fc103f57.webp" width="1344" height="896" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mine-de-rien-ça-en-fait-des-cailloux-">Mine de rien, ça en fait des cailloux !<a href="https://blog.zatsit.fr/green-exploitation-miniere#mine-de-rien-%C3%A7a-en-fait-des-cailloux-" class="hash-link" aria-label="Lien direct vers Mine de rien, ça en fait des cailloux !" title="Lien direct vers Mine de rien, ça en fait des cailloux !" translate="no">​</a></h2>
<p>Nous pourrions prendre d'autres produits de la vie courante pour illustrer les propos, mais nous nous intéressons ici au numérique.
Ces dernières décennies, il y a eu énormément de progrès dans les domaines de l'informatique, de l'électronique, de l'optique et pas
mal d'autres choses en "ique". Ces innovations ont nécessité toujours plus de matériaux, différents, plus rares les uns que les autres et disons-le, personne n'a encore eu l'idée de faire massivement mieux avec moins.</p>
<p>Il y a quelque temps j'ai eu la chance d'assister à deux évènements pleins de pédagogie :</p>
<ul>
<li class="">La conférence d'<a href="https://fr.linkedin.com/in/aurore-stephant-42097853" target="_blank" rel="noopener noreferrer" class="">Aurore Stéphant</a> aux APIdays (même si j'avais déjà vu certaines de ces interventions sur Youtube et notamment ses deux passages chez Thinkerview).</li>
<li class="">Un Meetup <a href="https://www.tech.rocks/" target="_blank" rel="noopener noreferrer" class="">Techrocks</a> en début d'année sur le sujet qui nous occupe.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="lexploitation-minière-toujours-plus">L'exploitation minière, toujours plus<a href="https://blog.zatsit.fr/green-exploitation-miniere#lexploitation-mini%C3%A8re-toujours-plus" class="hash-link" aria-label="Lien direct vers L'exploitation minière, toujours plus" title="Lien direct vers L'exploitation minière, toujours plus" translate="no">​</a></h3>
<p>À travers les différentes époques, la demande en métaux n'a jamais cessé de croître : il y a pu avoir des ralentissements dûs à des évènements géopolitiques ou sanitaires (guerres, épidémies...), mais la demande est toujours croissante.</p>
<p><img decoding="async" loading="lazy" alt="graphique d&amp;#39;évolution production metaux sur les cinquantes dernières années" src="https://blog.zatsit.fr/assets/images/evolution-production-metaux-b901735e2ab7f5976d55f1bb79afc7bc.webp" width="2662" height="1072" class="img_ev3q">
<em>Source : <a href="https://www.systext.org/node/2058" target="_blank" rel="noopener noreferrer" class="">https://www.systext.org/node/2058</a></em></p>
<p>Plus nous avançons dans le temps et plus nous trouvons des propriétés intéressantes à des métaux et autres éléments et des applications à échelle industrielle. À tel point que nos smartphones en sont truffés, je vous invite à visiter cette <a href="https://www.systext.org/sites/all/animationreveal/mtxsmp/#/1" target="_blank" rel="noopener noreferrer" class="">démo en ligne de Systext de composition en métaux d'un smartphone</a> qui donne le résultat ci-dessous, avec pas moins de 60 éléments :</p>
<p><img decoding="async" loading="lazy" alt="illustration de la composition en métaux d&amp;#39;un smartphone" src="https://blog.zatsit.fr/assets/images/smartphone-composition-a5b7fd654b5d09a403a84dac4a7be2cc.webp" width="3218" height="1864" class="img_ev3q">
<em>Source : <a href="https://www.systext.org/sites/all/animationreveal/mtxsmp/#/1" target="_blank" rel="noopener noreferrer" class="">Systext</a></em></p>
<p>Et oui, avec des composants comme l'<a href="https://fr.m.wikipedia.org/wiki/Arsenic" target="_blank" rel="noopener noreferrer" class="">Arsenic</a> et l'<a href="https://fr.m.wikipedia.org/wiki/Antimoine" target="_blank" rel="noopener noreferrer" class="">Antimoine</a>, certes en quantité minime et stabilisé dans votre smartphone, mais qu'en est-il de leur exploitation ?</p>
<p>Le problème c'est que les métaux sont inégalement présents dans les sols et quand on trouve plus facilement du fer et de l'aluminium, il faudra dans le meilleur des cas extraire 1 tonne de minerai pour obtenir 1g d'or.</p>
<p>Il existe donc des mines qui sont spécialisées dans l'extraction d'un ou plusieurs éléments, mais là où on va trouver un métal plus abondamment par exemple, on va aussi en trouver plein d'autres.</p>
<p>Cette infographie nous explique que pour chaque élément trouvé (au centre), on a de fortes chances de trouver les autres.</p>
<ul>
<li class="">Plus les autres éléments sont proches du centre, plus ils ont de chance d'être récupérés comme <strong>co-produit</strong></li>
<li class="">Plus ils sont proches de l'extérieur et plus ils ont de risques d'être rejetés dans les <strong>déchets miniers</strong></li>
</ul>
<p><img decoding="async" loading="lazy" alt="Roue montrant la concentration de métaux principaux et autre dans un gisement" src="https://blog.zatsit.fr/assets/images/roue-metaux-c463eabfab369f3a548ae25981204531.webp" width="1050" height="1037" class="img_ev3q"></p>
<p>Pour extraire des métaux de la roche, il y a des procédés mécaniques, thermiques, chimiques pour par exemple partir de la roche et obtenir des cathodes de cuivre. Tout cela avec une consommation d'eau et d'énergie phénoménale. Dans les exemples de cet article, nous sommes loin de l'image du mineur avec sa pioche sur l'épaule ou du prospecteur américain qui filtre du sable au bord de la rivière. On parle plutôt de machines gigantesques, d'explosifs et d'échelle difficilement imaginable.</p>
<p><img decoding="async" loading="lazy" alt="Exemple extraction issu de https://www.systext.org/sites/default/files/RP_SystExt_Controverses-Mine_VOLET-1_Nov2021_maj.pdf" src="https://blog.zatsit.fr/assets/images/exemple-cuivre-fb76925b8ac9e101de48ab77fd6e807c.webp" width="1398" height="716" class="img_ev3q">
<em>Source : <a href="https://www.systext.org/sites/default/files/RP_SystExt_Controverses-Mine_VOLET-1_Nov2021_maj.pdf" target="_blank" rel="noopener noreferrer" class="">Systext</a></em></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="il-faut-creuser-un-gros-trou-">Il faut creuser un gros trou ?<a href="https://blog.zatsit.fr/green-exploitation-miniere#il-faut-creuser-un-gros-trou-" class="hash-link" aria-label="Lien direct vers Il faut creuser un gros trou ?" title="Lien direct vers Il faut creuser un gros trou ?" translate="no">​</a></h2>
<p>Vous avez peut-être déjà vu les <a href="https://www.dillonmarsh.com/for-what-its-worth" target="_blank" rel="noopener noreferrer" class="">photographies de Dillon Marsh</a> qui montre "à l'échelle" la taille des mines en elle-même, leur emprise sur les espaces autour, en regard de ce qui en est extrait comme produit fini.</p>
<p>Ci-dessous, on peut se rendre compte, avec la représentation de la tour Eiffel, de la taille d'un site (extraction + exploitation + emprise en surface des déchets) pour la <strong>mine de cuivre</strong> de Palabora
<img decoding="async" loading="lazy" alt="palabora-Afrique-Sud_Dillon-Marsh.jpg Illustration de la mine de Palabora avec taille du métal extrait au global versus taille de l&amp;#39;exploitation minière" src="https://blog.zatsit.fr/assets/images/palabora-Afrique-Sud_Dillon-Marsh-a44c9d4c980432fc4f46b9a21171846d.webp" width="7086" height="2972" class="img_ev3q"></p>
<p>Située en Afrique du Sud, cette mine a été exploitée pendant presque 40 ans. (<a href="https://planet-terre.ens-lyon.fr/ressource/Img784-2023-06-05.xml" target="_blank" rel="noopener noreferrer" class="">plus de détail sur cette mine avec ce lien</a>).</p>
<p>D'autres exemples de mines gigantesques existent (cette fois c'est du charbon, mais ça symbolise bien l'extraction minière), plus proches de nous, comme la <a href="https://fr.wikipedia.org/wiki/Mine_de_Hambach#" target="_blank" rel="noopener noreferrer" class="">Photo de la mine de Hambach en Allemagne</a>.</p>
<p><img decoding="async" loading="lazy" alt="Johannes Fasolt" src="https://blog.zatsit.fr/assets/images/surface_Mining_Hambach-ac9abe12586110aeb5d5abe86408f003.webp" width="2560" height="1920" class="img_ev3q">
<em>Source : Wikipedia / Johannes Fasolt</em></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="quelles-sont-les-conséquences-de-lexploitation-minière-">Quelles sont les conséquences de l'exploitation minière ?<a href="https://blog.zatsit.fr/green-exploitation-miniere#quelles-sont-les-cons%C3%A9quences-de-lexploitation-mini%C3%A8re-" class="hash-link" aria-label="Lien direct vers Quelles sont les conséquences de l'exploitation minière ?" title="Lien direct vers Quelles sont les conséquences de l'exploitation minière ?" translate="no">​</a></h2>
<p>La raison principale de cette exploitation est bien entendu d'approvisionner toutes nos industries : transports, énergie, armement, agriculture... enfin tout ce qui nécessite aujourd'hui des métaux, c'est à dire à peu près tout, dans sa composition, sa construction ou sa logistique.</p>
<p>Faites l'exercice : "Quel artefact utilisez-vous dans votre quotidien qui n’est pas dépendant de l’industrie minière dans sa fabrication, sa vente, son transport ?"</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conséquences-écologiques">Conséquences écologiques<a href="https://blog.zatsit.fr/green-exploitation-miniere#cons%C3%A9quences-%C3%A9cologiques" class="hash-link" aria-label="Lien direct vers Conséquences écologiques" title="Lien direct vers Conséquences écologiques" translate="no">​</a></h3>
<p>Elles sont nombreuses : la pollution de l'air, des sols et de l'eau autour des sites est importante en "fonctionnement" normal, mais en cas d'accident c'est encore pire. On peut lire par exemple :</p>
<ul>
<li class=""><a href="https://www.aria.developpement-durable.gouv.fr/accident/47369/" target="_blank" rel="noopener noreferrer" class="">Sur le site de l'ARIA</a> une catastrophe au Brésil en 2015, un village de 620 habitants est englouti suite à une rupture de barrage de déchets de minerai de fer. 19 personnes trouveront la mort, plusieurs rivières seront polluées, une pollution se propageant jusqu'à l'océan.</li>
<li class=""><a href="https://www.aria.developpement-durable.gouv.fr/fiche_detaillee/12831/" target="_blank" rel="noopener noreferrer" class="">Toujours sur l'ARIA</a> on trouve une catastrophe survenue en Espagne suite à la rupture d'une digue d'un bassin de stockage de déchets de pyrite. Des millions de tonnes d'eaux acides et de boues sont déversées dans la rivière Rio Agrio puis le Guadimar.</li>
<li class=""><a href="https://sg.finance.yahoo.com/news/russian-river-of-blood-leaves-locals-fearing-092205453.html" target="_blank" rel="noopener noreferrer" class="">un dernier exemple en Russie</a> où on peut voir une rivière "sanglante" résultat de fuites de minerai. L'article expose que 210 000 personnes travaillent dans les environs pour cette industrie qui représente un cinquième du nickel mondial...</li>
</ul>
<p>Des procès sont régulièrement intentés contre les exploitants, cependant ça ne permet pas de réparer les dommages occasionnés. Au-delà des accidents, la fin d'une exploitation d'un site minier ne signifie pas la fin de sa pollution, au contraire.</p>
<p>On ne dépollue pas un site minier, tout simplement parce que ce serait trop long, trop couteux, voire impossible. Chaque exploitation a donc un effet irréversible sur son environnement.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conséquences-politiques-et-sociales">Conséquences politiques et sociales<a href="https://blog.zatsit.fr/green-exploitation-miniere#cons%C3%A9quences-politiques-et-sociales" class="hash-link" aria-label="Lien direct vers Conséquences politiques et sociales" title="Lien direct vers Conséquences politiques et sociales" translate="no">​</a></h3>
<p>L'extraction minière est aussi source de conflits politiques et sociaux. Les ressources ne sont pas également réparties sur le globe et dans certains pays les conditions de travail des adultes et aussi des enfants sont assez "souples", dirons-nous, à l'égard de la filière.</p>
<p>Lors du <a href="https://youtu.be/pfSUGj5pmag" target="_blank" rel="noopener noreferrer" class="">meetup Techrocks du 8 février 2024</a>, j'ai pu apprendre les démarches entreprises, par exemple, par Fairphone qui tente sur le long terme d'améliorer les conditions sociales autour des sites où elle source ses matériaux.
<a href="https://www.fairphone.com/wp-content/uploads/2021/03/Fairphone_Fair-Material-Sourcing-Roadmap.pdf" target="_blank" rel="noopener noreferrer" class="">Description de la stratégie disponible en ligne</a>.</p>
<p>Fairphone s'est donc déjà confrontée à la réalité du travail des enfants qui sont employés sur certaines exploitations. Une stratégie de rémunération directe des "mineurs" permet d'éliminer des intermédiaires et d'améliorer les conditions sociales des familles. Un travail qui leur a, par exemple, pris 6 ans pour le cobalt.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="quelles-solutions-pour-diminuer-limpact-">Quelles solutions pour diminuer l'impact ?<a href="https://blog.zatsit.fr/green-exploitation-miniere#quelles-solutions-pour-diminuer-limpact-" class="hash-link" aria-label="Lien direct vers Quelles solutions pour diminuer l'impact ?" title="Lien direct vers Quelles solutions pour diminuer l'impact ?" translate="no">​</a></h2>
<p>Ne soyons pas pessimistes sur la capacité de l'Homme à trouver des solutions, mais nous passerons forcément à une diminution de l'usage des métaux et à l'augmentation de leur recyclage. D'abord, parce que la teneur en métaux baisse dans les exploitations et ensuite parce que ça coutera toujours plus d'énergie, qui est, elle aussi, non illimitée.</p>
<p>Alors à l'échelle du numérique, que pouvons-nous faire ?</p>
<p>Se poser les bonnes questions sur les usages toujours plus gourmands en ressources : concevoir mieux pour utiliser plus longtemps ! Cela passe par une meilleure analyse des besoins, de faire des compromis sur les données dont on a réellement besoin, de la richesse des fonctionnalités qui induit souvent plus de complexité et donc un besoin de performance.</p>
<p><a href="https://www.youtube.com/watch?v=LzBv5H24OxY" target="_blank" rel="noopener noreferrer" class="">Tristant Nitot</a>, lors du dernier DevFest Lille, nous expliquait clairement que l'amélioration de la puissance de calcul (illustrée par la loi de Moore) a sans cesse été partiellement annulée par la baisse de la performance et la complexité croissante des softwares.</p>
<p>Nous aurons chez <strong>zatsit</strong> l'occasion de vous reparler des thèmes, des outils et des méthodologies autour de l'éco-conception.</p>
<p>Bien choisir son matériel est aussi une réalité, à laquelle tente de répondre Backmarket par exemple. Acheter un article reconditionné permet de réduire l'impact de création d'un nouveau modèle, de son transport, de sa logistique... Il faut 6 à 7 ans d'utilisation d'un smartphone pour "absorber" son impact, alors en changer tous les 2 ans parait compliqué à justifier. Au-delà de l'obsolescence réelle, il y a l'obsolescence psychologique : le marketing qui nous martèle chaque jour qu'un stockage plus important, un énième objectif photo et des millions de pixels supplémentaires sont incontournables et nous changeront la vie.</p>
<p>Le site <a href="https://halteobsolescence.org/" target="_blank" rel="noopener noreferrer" class="">halteobsolescence.org</a> vous permet de comprendre les mécanismes de l'obsolescence programmée et d'agir.</p>
<p>Pour terminer, vous avez peut être entendu parler de <a href="https://en.wikipedia.org/wiki/European_Ecodesign_Directive" target="_blank" rel="noopener noreferrer" class="">"l'éco design"</a> directive signée en juin 2023, qui sera mise en oeuvre en mars 2025 et obligera les fabricants à fournir 5 ans de support après la fin de la mise sur le marché d'un produit. Donc, un téléphone ou ordinateur en vente une seule année en 2025 devra avoir un support jusqu’en 2030 !</p>
<p>En France aussi, la loi <a href="https://www.ecologie.gouv.fr/loi-anti-gaspillage-economie-circulaire" target="_blank" rel="noopener noreferrer" class="">AGEC</a> demande aux acteurs publics d'avoir un minimum de 20% d'achats de matériel reconditionné, ce qui pose quelques problèmes dans l'approvisionnement aujourd'hui, mais espérons que la situation s'améliore.</p>
<p>On associe souvent l'empreinte écologique du numérique à la consommation d'énergie, sur laquelle nous ferons un prochain focus, mais cet article souhaitait mettre l'accent sur l'envers du décor des équipements numérique et leurs conséquences.</p>
<p>Soyez curieux à votre tour, cherchez de l'information dans les sources citées (et d'autres) pour vous faire votre propre opinion et peut-être changer quelques habitudes.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ressources-">Ressources :<a href="https://blog.zatsit.fr/green-exploitation-miniere#ressources-" class="hash-link" aria-label="Lien direct vers Ressources :" title="Lien direct vers Ressources :" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://www.youtube.com/watch?v=i8RMX8ODWQs" target="_blank" rel="noopener noreferrer" class="">USI 2022 "Ruée minière au XXIè siècle : jusqu'où les limites seront-elles repoussées ?"</a></li>
<li class=""><a href="https://www.systext.org/sites/default/files/RP_SystExt_Thinkerview-2-Sources-Complements_Mai2023.pdf" target="_blank" rel="noopener noreferrer" class="">Compléments de sources d'entretien </a></li>
<li class=""><a href="https://www.systext.org/sites/default/files/RP_SystExt_Controverses-Mine_VOLET-2_Tome-2.pdf" target="_blank" rel="noopener noreferrer" class="">Rapport Tome 2 · Meilleures pratiques et mine « responsable »</a></li>
<li class=""><a href="https://www.mineralinfo.fr/fr/ressources-minerales-france-gestion/mines-france" target="_blank" rel="noopener noreferrer" class="">Ressources minières en France</a></li>
<li class=""><a href="https://www.science.org/doi/10.1126/sciadv.1400180" target="_blank" rel="noopener noreferrer" class="">By-product metals are technologically essential but have problematic supply</a></li>
</ul>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fgreen-exploitation-miniere%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/tweet?text=Quels%20sont%20les%20impacts%20de%20l%27exploitation%20mini%C3%A8re%20pour%20la%20production%20de%20nos%20appareils%20num%C3%A9riques%20et%20autres&amp;url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fgreen-exploitation-miniere%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage X" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>green</category>
            <category>tech</category>
        </item>
        <item>
            <title><![CDATA[Gemini déployé sur Vertex.ai]]></title>
            <link>https://blog.zatsit.fr/gemini-vertex-ai</link>
            <guid>https://blog.zatsit.fr/gemini-vertex-ai</guid>
            <pubDate>Thu, 21 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Google annonce la disponibilité publique de Gemini Pro sur Vertex AI, disponible en trois tailles : Ultra, Pro et Nano.]]></description>
            <content:encoded><![CDATA[<p>Google annonce la disponibilité publique de Gemini Pro sur Vertex AI, disponible en trois tailles : Ultra, Pro et Nano.</p>
<p><img decoding="async" loading="lazy" alt="logo de gemini" src="data:image/webp;base64,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" width="640" height="361" class="img_ev3q"></p>
<p>Il y a une semaine, Google a dévoilé Gemini, son modèle d'IA le plus puissant et flexible à ce jour, disponible en trois tailles : Ultra, Pro et Nano.</p>
<blockquote>
<p>Aujourd'hui, nous sommes ravis d'annoncer que Gemini Pro est désormais accessible publiquement sur Vertex AI, la plateforme d'IA de bout en bout de Google Cloud, comprenant des outils intuitifs, une infrastructure entièrement gérée et des fonctionnalités intégrées de confidentialité et de sécurité. Avec Gemini Pro, les développeurs peuvent désormais créer des "agents" capables de traiter et d'agir sur des informations.</p>
</blockquote>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="créez-des-agents-dia-de-qualité-professionnelle-à-grande-échelle-avec-gemini-pro-sur-vertex-ai">Créez des agents d'IA de qualité professionnelle à grande échelle avec Gemini Pro sur Vertex AI<a href="https://blog.zatsit.fr/gemini-vertex-ai#cr%C3%A9ez-des-agents-dia-de-qualit%C3%A9-professionnelle-%C3%A0-grande-%C3%A9chelle-avec-gemini-pro-sur-vertex-ai" class="hash-link" aria-label="Lien direct vers Créez des agents d'IA de qualité professionnelle à grande échelle avec Gemini Pro sur Vertex AI" title="Lien direct vers Créez des agents d'IA de qualité professionnelle à grande échelle avec Gemini Pro sur Vertex AI" translate="no">​</a></h2>
<p>Vertex AI permet de personnaliser et de déployer Gemini, donnant aux développeurs le pouvoir de créer de nouvelles applications différenciées capables de traiter des informations à travers le texte, le code, les images et la vidéo. Avec Vertex AI, les développeurs peuvent :</p>
<ul>
<li class="">
<p>Découvrir et utiliser Gemini Pro, ou choisir parmi une liste sélectionnée de plus de 130 modèles de Google, open source et de tiers, répondant aux normes strictes de sécurité et de qualité de l'entreprise. Les développeurs peuvent accéder aux modèles via des API faciles à utiliser pour les intégrer rapidement dans des applications.</p>
</li>
<li class="">
<p>Personnaliser le comportement du modèle avec une expertise spécifique au domaine ou à l'entreprise, en utilisant des outils de réglage pour enrichir les connaissances de formation et ajuster même les poids du modèle lorsque cela est nécessaire. Vertex AI propose une variété de techniques de réglage, notamment la conception de prompt, le réglage basé sur l'adaptateur tel que Low Rank Adaptation (LoRA), et la distillation. Nous offrons également la possibilité d'améliorer un modèle en capturant les commentaires des utilisateurs grâce à notre prise en charge de l'apprentissage par renforcement à partir des commentaires humains (RLHF).</p>
</li>
<li class="">
<p>Augmenter les modèles avec des outils pour aider à adapter Gemini Pro à des contextes ou des cas d'utilisation spécifiques. Les extensions et connecteurs Vertex AI permettent aux développeurs de lier Gemini Pro à des API externes pour des transactions et d'autres actions, de récupérer des données à partir de sources externes ou d'appeler des fonctions dans des bases de code. Vertex AI offre également aux organisations la possibilité d'ancrer les sorties du modèle de base dans leurs propres sources de données, contribuant ainsi à améliorer la précision et la pertinence des réponses du modèle.</p>
</li>
<li class="">
<p>Gérer et mettre à l'échelle les modèles en production avec des outils spécialement conçus pour garantir que, une fois les applications construites, elles peuvent être facilement déployées et entretenues. À cette fin, nous introduisons une nouvelle façon d'évaluer les modèles appelée Automatic Side by Side (Auto SxS), un outil automatisé à la demande pour comparer les modèles. Auto SxS est plus rapide et plus rentable que l'évaluation manuelle des modèles, ainsi que personnalisable pour différentes spécifications de tâches afin de traiter de nouveaux cas d'utilisation de l'IA générative.</p>
</li>
<li class="">
<p>Construire des agents de recherche et de conversation dans un environnement à faible code / sans code. Avec Vertex AI, les développeurs de tous niveaux de compétence en apprentissage automatique pourront utiliser Gemini Pro pour créer des agents d'IA engageants de qualité professionnelle en quelques heures et jours au lieu de semaines et mois. Prochainement, Gemini Pro sera une option pour alimenter les fonctionnalités de résumé de recherche et de génération de réponses dans Vertex AI, améliorant ainsi la qualité, la précision et les capacités d'ancrage des applications de recherche. Gemini Pro sera également disponible en version preview en tant que modèle de base pour les agents de conversation vocale et de chat, offrant des interactions dynamiques avec les utilisateurs et prenant en charge un raisonnement avancé.</p>
</li>
<li class="">
<p>Proposer de l'innovation de manière responsable en utilisant les filtres de sécurité de Vertex AI, les API de modération de contenu et d'autres outils d'IA responsables pour aider les développeurs à s'assurer que leurs modèles ne produisent pas de contenu inapproprié.</p>
</li>
<li class="">
<p>Aider à protéger les données avec les contrôles de gouvernance des données et de confidentialité intégrés de Google Cloud. Les clients restent maîtres de leurs données, et Google n'utilise jamais les données des clients pour former nos modèles. Vertex AI offre une variété de</p>
</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="indemnisation-sur-les-sorties-de-modèles-générées">Indemnisation sur les sorties de modèles générées<a href="https://blog.zatsit.fr/gemini-vertex-ai#indemnisation-sur-les-sorties-de-mod%C3%A8les-g%C3%A9n%C3%A9r%C3%A9es" class="hash-link" aria-label="Lien direct vers Indemnisation sur les sorties de modèles générées" title="Lien direct vers Indemnisation sur les sorties de modèles générées" translate="no">​</a></h2>
<p>L'approche complète de Google en matière d'IA est conçue pour aider à maintenir la sécurité et la protection de nos clients. Nous adoptons une approche d'indemnisation à deux volets, une première dans l'industrie, pour donner aux clients de Cloud la tranquillité d'esprit lors de l'utilisation de nos produits d'IA générative. Aujourd'hui, nous étendons notre indemnisation sur les sorties générées pour inclure également les sorties de modèles de PaLM 2 et Vertex AI Imagen, en plus d'une indemnisation sur les réclamations liées à notre utilisation des données d'entraînement. La couverture d'indemnisation est prévue pour l'API Gemini lorsqu'elle deviendra généralement disponible.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="bienvenue-dans-lère-gemini---commençons-à-construire">Bienvenue dans l'ère Gemini - commençons à construire<a href="https://blog.zatsit.fr/gemini-vertex-ai#bienvenue-dans-l%C3%A8re-gemini---commen%C3%A7ons-%C3%A0-construire" class="hash-link" aria-label="Lien direct vers Bienvenue dans l'ère Gemini - commençons à construire" title="Lien direct vers Bienvenue dans l'ère Gemini - commençons à construire" translate="no">​</a></h2>
<p>L'API Gemini est maintenant disponible. Gemini Pro est également disponible sur Google AI Studio, un outil basé sur le web qui aide à développer rapidement des invites. Nous rendrons Gemini Ultra disponible pour certains clients, développeurs, partenaires et experts en sécurité et responsabilité pour des expérimentations et des commentaires précoces avant de le déployer auprès des développeurs et des clients d'entreprise début de l'année prochaine.</p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fgemini-vertex-ai%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/tweet?text=Google%20annonce%20la%20disponibilit%C3%A9%20publique%20de%20Gemini%20Pro%20sur%20Vertex%20AI%2C%20disponible%20en%20trois%20tailles%20%3A%20Ultra%2C%20Pro%20et%20Nano&amp;url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fgemini-vertex-ai%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage X" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>ai</category>
            <category>cloud</category>
        </item>
        <item>
            <title><![CDATA[AsyncAPI 3.0.0 est prêt !]]></title>
            <link>https://blog.zatsit.fr/asyncapi-3-is-out</link>
            <guid>https://blog.zatsit.fr/asyncapi-3-is-out</guid>
            <pubDate>Thu, 21 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Aprés deux années de travail de la communauté, la version 3.0.0 de la spécification a été publiée, avec le support des outils proposés par l'initiative.]]></description>
            <content:encoded><![CDATA[<p>Aprés deux années de travail de la communauté, la version 3.0.0 de la spécification a été publiée, avec le support des outils proposés par l'initiative.</p>
<p>Cette version 3.0.0 apporte son lot de nouveautés, mais aussi des améliorations / refonte de certaines de ces fonctionnalités.</p>
<p><img decoding="async" loading="lazy" alt="AsyncAPI logo" src="data:image/webp;base64,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" width="800" height="418" class="img_ev3q"></p>
<p>Pour y découvrir les principaux changements,</p>
<p>👉 Vous pouvez consulter le <a href="https://www.asyncapi.com/blog/release-notes-3.0.0" target="_blank" rel="noopener noreferrer" class="">changelog</a> de cette version.</p>
<p>👉 Si vous utilisiez déjà la version 2, vous allez devoir migrer vos specifications en V3 et
AsyncAPI a pensé à vous en vous proposant un <a href="https://www.asyncapi.com/docs/migration/migrating-to-v3" target="_blank" rel="noopener noreferrer" class="">guide de migration</a>.</p>
<p>👉 J'ai moi-même contribué à l'effort en prenant part à une migration <a href="https://www.asyncapi.com/casestudies/adeogroup" target="_blank" rel="noopener noreferrer" class="">du use-case Adeo</a> durant un live avec <a href="https://twitter.com/lbroudoux" target="_blank" rel="noopener noreferrer" class="">@lbroudoux</a> de chez <a href="https://microcks.io/" target="_blank" rel="noopener noreferrer" class="">Microcks.io</a> :</p>
<p><a href="https://www.youtube.com/watch?v=WCK9_ZDv6K4" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Regarder la video sur Youtube" src="https://blog.zatsit.fr/assets/images/v3livemigration-4cee71d9063704fcdb21248747463f06.jpeg" title="Go to v3 migration live" width="1280" height="720" class="img_ev3q"></a></p>
<p>Pour plus d'informations, vous pouvez consulter le <a href="https://www.asyncapi.com/" target="_blank" rel="noopener noreferrer" class="">site officiel</a> de l'initiative.</p>
<p>Ambassadeur de l'initiative depuis 2021, je serai ravi de venir vous la présenter lors d'un meetup, d'un BBL ou d'une conférence.</p>
<p>D'ici là, spécifiez bien vos APIs ! 🚀</p>]]></content:encoded>
            <category>architecture</category>
            <category>data</category>
        </item>
        <item>
            <title><![CDATA[Premier cours de RedPanda]]></title>
            <link>https://blog.zatsit.fr/redpanda-introduction</link>
            <guid>https://blog.zatsit.fr/redpanda-introduction</guid>
            <pubDate>Sun, 10 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Présentation de RedPanda, au travers du premier cours dédié aux développeurs de la "RedPanda University" que j'ai suivi,]]></description>
            <content:encoded><![CDATA[<p>Présentation de RedPanda, au travers du premier cours dédié aux développeurs de la "RedPanda University" que j'ai suivi,
je vous présente les grands principes et les premiers pas dans cet écosystème.</p>
<p><img decoding="async" loading="lazy" alt="Redpanda logo at a desk typing on his laptop" src="https://blog.zatsit.fr/assets/images/desk-panda-alt-9fce79ce8a6cbf71799670004612b2f8.svg" width="838" height="452" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="oh-il-est-trop-mignon">Oh il est trop mignon<a href="https://blog.zatsit.fr/redpanda-introduction#oh-il-est-trop-mignon" class="hash-link" aria-label="Lien direct vers Oh il est trop mignon" title="Lien direct vers Oh il est trop mignon" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://images.ctfassets.net/paqvtpyf8rwu/GeLUVavqqxhFZolzU9jM3/3b8dddc74a632e63f17e0a5e40b971bb/super-panda-update.svg" alt="the redpanda flying like Superman" title="the redpanda flying like Superman" class="img_ev3q"></p>
<p>RedPanda n’est pas qu’une jolie mascotte, c’est aussi un sacré challenger dans le monde du streaming et surtout un challenger d’Apache Kafka.
C’est en tout cas son angle d’attaque clairement exposé quand vous lisez le README du projet :</p>
<blockquote>
<p>Redpanda is a streaming data platform for developers. Kafka® API-compatible. ZooKeeper® free. JVM free. We built it from the ground up to eliminate complexity common to Apache Kafka, improve performance by up to 10x, and make the storage architecture safer, more resilient. The simpler devex lets you can focus on your code (instead of fighting Kafka) and develop new use cases that were never before possible. The business benefits from a significantly lower total cost and faster time to market. A new platform that scales with you from the smallest projects to petabytes of data distributed across the globe!</p>
</blockquote>
<p>Github nous indique que le repo a été créé fin 2020 (<a href="https://api.github.com/repos/redpanda-data/redpanda" target="_blank" rel="noopener noreferrer" class="">https://api.github.com/repos/redpanda-data/redpanda</a>) avec une Stack essentiellement basée sur C++.
Depuis, la communauté de contributeurs a grandit et l’offre Cloud et Enterprise est disponible, une sacré roadmap en 3 ans.</p>
<p>Avant de commencer à l’utiliser sérieusement et pour se faire une bonne opinion, il est important de comprendre comment il fonctionne et quels sont les cas d’usages.
Pour cela, RedPanda a créé la <a href="https://university.redpanda.com/" target="_blank" rel="noopener noreferrer" class="">RedPanda University</a> à l’instar de ce que j’ai déjà pu suivre Chez MongoDB, Redis, Confluent, Neo4j (et que je vous recommande vivement).</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="ouvrez-votre-livre-au-chapitre-1--streaming-basics">Ouvrez votre livre au chapitre 1 : Streaming Basics<a href="https://blog.zatsit.fr/redpanda-introduction#ouvrez-votre-livre-au-chapitre-1--streaming-basics" class="hash-link" aria-label="Lien direct vers Ouvrez votre livre au chapitre 1 : Streaming Basics" title="Lien direct vers Ouvrez votre livre au chapitre 1 : Streaming Basics" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="redpanda chevauchant un missile" src="https://blog.zatsit.fr/assets/images/redpanda-missile-016cf2e1d1f236a15faf73f169b17374.png" width="1094" height="572" class="img_ev3q"></p>
<p>La première partie du cours vous fournira un récapitulatif de ce qu’est un évènement dans les <a href="https://en.wikipedia.org/wiki/Event-driven_architecture" target="_blank" rel="noopener noreferrer" class="">EDA</a>,
dans quels cas d’usage nous les utilisons...</p>
<p>Si vous êtes familier des architectures event-driven, ce sera juste un petit récapitulatif.
Puis, vous enchainerez avec des patterns de communication : le point-to-point, la dualité event et command, pub/sub, queues…
avec un exemple illustré dans le cas de la société Etsy.
Le cours propose un "landscape" des plateformes de streaming de données,
avec "pros" et "cons" qu’il vous reste à challenger avec votre expérience. Vous pourrez aussi en trouver un ici <a href="https://landscape.cncf.io/card-mode?category=streaming-messaging&amp;grouping=category" target="_blank" rel="noopener noreferrer" class="">CNCF Streaming landscape</a>.</p>
<p>La deuxième partie permet d’entrer un peu dans le coeur de la solution. Pour la vision globale, rien de nouveau,
des brokers en cluster, des topics, des partitions, du stockage de données brutes agnostiques de tout format.
Encore une fois, si vous êtes coutumier d'Apache Kafka passez votre chemin sur les deux premières parties,
par contre la 3ème partie vous présentera les composants, la stack et leurs particularités.
Une partie de la vidéo est dédiée à la performance, car Redpanda revendique une amélioration x10 en terme de latences et des transactions 6x plus rapides !</p>
<p>Nous tâcherons de tester et de comparer dans des conditions “identiques” plus tard.</p>
<p>D’autres gains de performance sont avancés dans la transformation de données au sein du cluster, puisqu’elle peut être directement réalisée dans la plateforme,
là où vous seriez amenés à créer des KStreams ou d’utiliser du Ksqldb.
L’autre découverte est le “<a href="https://docs.redpanda.com/current/reference/rpk/rpk-redpanda/rpk-redpanda-tune/" target="_blank" rel="noopener noreferrer" class="">hardware auto tuner</a>” qui en fonction de votre matériel va permettre de tirer partie au mieux des capacités de la solution.</p>
<p>Côté fiabilité, on trouve la possibilité d’archiver sur le long terme les données avec des connecteurs intégrés vers des solutions Cloud,
ce qui évite encore de devoir les gérer soi même.</p>
<p>Si on parle de scalabilité et resilience, elle est comme d’autres, obtenue par le partitionnement et le fait que chaque broker
ne soit leader que sur certaines partitions de certains topics, permettant la répartition naturelle de la charge et la tolérance aux pannes (par la replication).</p>
<h1>Hands on</h1>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="command-line-interface">Command Line Interface<a href="https://blog.zatsit.fr/redpanda-introduction#command-line-interface" class="hash-link" aria-label="Lien direct vers Command Line Interface" title="Lien direct vers Command Line Interface" translate="no">​</a></h2>
<p>Le second cours que je vous conseille permet de mettre vraiment les mains dans la console et de commencer à manipuler un cluster.
Je vous passe l’installation, vous pourrez retrouver les détails dans <a href="https://docs.redpanda.com/current/get-started/rpk-install/" target="_blank" rel="noopener noreferrer" class="">cette documentation</a> et on démarre via la cli "rpk" :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk container start -n 3 --verbose</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Checking for a local image...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Downloading latest version of redpanda</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Pulling image: vectorized/redpanda:v23.2.7</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">...</span><br></span></code></pre></div></div>
<p>et après téléchargement des images nous obtenons très rapidement :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Creating network redpanda</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Starting cluster...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Waiting for the cluster to be ready...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Cluster started!</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NODE-ID  STATUS   KAFKA-ADDRESS    ADMIN-ADDRESS    PROXY-ADDRESS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">0        running  127.0.0.1:64033  127.0.0.1:64027  127.0.0.1:64035</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1        running  127.0.0.1:64037  127.0.0.1:64036  127.0.0.1:64024</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2        running  127.0.0.1:64038  127.0.0.1:64025  127.0.0.1:64028</span><br></span></code></pre></div></div>
<p>L’export en variable de la liste des brokers permet de continuer d’utiliser la CLI et d’interragir avec le cluster :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export RPK_BROKERS="127.0.0.1:64033,127.0.0.1:64037,127.0.0.1:64038"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rpk cluster health</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CLUSTER HEALTH OVERVIEW</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=======================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Healthy:                     true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Unhealthy reasons:           []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Controller ID:               0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">All nodes:                   [0 1 2]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Nodes down:                  []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Leaderless partitions:       []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Under-replicated partitions: []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rpk cluster info</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CLUSTER</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=======</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">redpanda.90da6c13-0fb6-4a8e-9357-35ba81e893dc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BROKERS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=======</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ID    HOST       PORT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">0*    127.0.0.1  64033</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1     127.0.0.1  64037</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2     127.0.0.1  64038</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">version: '3.7'</span><br></span></code></pre></div></div>
<p>La suite du cours permet de manipuler des topics facilement avec les notions de partition et de réplication que vous connaissez déjà, ou que vous aurez découvert avec le premiers cours.</p>
<p>Ici nous créons deux topics <strong>song_plays</strong> et <strong>song_likes</strong> à 6 partitions avec un facteur replication à 1 par exemple.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic create song_plays song_likes --partitions 6 --replicas 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TOPIC       STATUS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">song_plays  OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">song_likes  OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic list --detailed</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">song_likes, 6 partitions, 1 replicas</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      PARTITION  LEADER  EPOCH  REPLICAS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      0          1       1      [1]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      1          0       1      [0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      2          2       1      [2]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      3          0       1      [0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      4          2       1      [2]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      5          1       1      [1]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">song_plays, 6 partitions, 1 replicas</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      PARTITION  LEADER  EPOCH  REPLICAS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      0          1       1      [1]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      1          2       1      [2]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      2          0       1      [0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      3          0       1      [0]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      4          1       1      [1]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      5          2       1      [2]</span><br></span></code></pre></div></div>
<p>Ce que je trouve sympa et simple est la consommation et la production de données avec cette CLI, ici on pousse :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic produce song_likes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{"song_id": 1234, "event": "like"}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{"song_id": 5678, "event": "like"}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Produced to partition 0 at offset 0 with timestamp 1693340516398.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Produced to partition 0 at offset 1 with timestamp 1693340516398.</span><br></span></code></pre></div></div>
<p>Ou en passant un format de clé-valeur dans une chaîne :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic produce song_likes --format "%k|%v\n"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">key1|{"song_id": 1234, "event": "like"}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">key2|{"song_id": 5678, "event": "like"}</span><br></span></code></pre></div></div>
<p>Et le résultat de la consommation montre la différence entre les deux précédentes productions (la clé) :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic consume song_likes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "topic": "song_likes",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "value": "{\"song_id\": 1234, \"event\": \"like\"}",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "timestamp": 1693340516398,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "partition": 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "offset": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "topic": "song_likes",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "value": "{\"song_id\": 5678, \"event\": \"like\"}",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "timestamp": 1693340516398,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "partition": 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "offset": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "topic": "song_likes",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "key": "key1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "value": "{\"song_id\": 1234, \"event\": \"like\"}",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "timestamp": 1693340628321,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "partition": 2,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "offset": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "topic": "song_likes",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "key": "key2",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "value": "{\"song_id\": 5678, \"event\": \"like\"}",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "timestamp": 1693340628321,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "partition": 5,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "offset": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>La consommation est donc aussi assez simple, vous pouvez choisir la partition que vous souhaitez consommer (ou toutes),
l’offset, formater la sortie (comme pour la production)…</p>
<p>Idem pour la manipulation de <a href="https://docs.redpanda.com/current/reference/rpk/rpk-group/rpk-group/" target="_blank" rel="noopener noreferrer" class="">consumer group</a>, en les spécifiant, en spécifiant leur offset, en effectuant un reset… et en récupérant toutes leurs informations.</p>
<p>Toutes ces commandes, vous me direz que c’est bien sympa, mais au quotidien vous allez probablement préférer une UI
et ne pas taper toutes ces commandes. Certes, mais connaître la base c’est aussi sympa et ça peut dépanner quand on ne peut pas brancher d’UI justement,
pour la console ce sera sur cette <a href="https://github.com/redpanda-data/console" target="_blank" rel="noopener noreferrer" class="">page</a>.</p>
<p><img decoding="async" loading="lazy" alt="screenshot de la console redpanda montrant une overview du cluster" src="https://blog.zatsit.fr/assets/images/redpanda-console-4ea8d49fc3371f0b429b2e53cb67308a.png" width="1516" height="1080" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="un-peu-de-code-java">Un peu de code Java<a href="https://blog.zatsit.fr/redpanda-introduction#un-peu-de-code-java" class="hash-link" aria-label="Lien direct vers Un peu de code Java" title="Lien direct vers Un peu de code Java" translate="no">​</a></h2>
<p>Cette fois, on sort un peu du terminal et on construit un archétype de projet, je l'ai fait en Java,
utilisez Maven ou Gradle pour construire votre projet et ajouter en dépendance le client apache Kafka.</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">org.apache.kafka</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">kafka-clients</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">latest</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Un petit Producer issu du <a href="https://github.com/redpanda-data-university/rp-101-redpanda-getting-started" target="_blank" rel="noopener noreferrer" class="">repository Github</a>
de la Redpanda University et on produit un main Java qui va pousser un message, aussitôt lu via la CLI :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"topic": "greetings",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"key": "key1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"value": "Hello, World!",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"timestamp": 1693856776889,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"partition": 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"offset": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Pas de grand suspens, si je vous dis quand la foulée nous créons un consumer, qui lira ce dernier message.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Consumed record. key=key1, value=Hello, World!</span><br></span></code></pre></div></div>
<p>Ce qui peut paraître surprenant, c’est que tout a été fait en utilisant les producers et consumer de la librairie Kafka client.
Etant compatible, Redpanda n'a pas réécrit de librairie Java pour lire et écrire dans son cluster.</p>
<p>Passons donc vite à des choses plus sérieuses !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="lets-start-streaming">Let’s Start Streaming<a href="https://blog.zatsit.fr/redpanda-introduction#lets-start-streaming" class="hash-link" aria-label="Lien direct vers Let’s Start Streaming" title="Lien direct vers Let’s Start Streaming" translate="no">​</a></h2>
<p>Si vous suivez le 3ème cours (il y en a d’autres), vous allez streamer !</p>
<p>Le panda roux est sujet à inspirer certaines métaphores, on découvre donc qu’à l’instar d’un panda qui surveille les fruits tombés
de l’arbre qui coule le long de la rivière, il les dévore dès qu’il peut les attrapper !</p>
<blockquote>
<p>La donnée c’est pareil, on doit la consommer fraiche et rapidement.</p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="redpanda on a tree watching fruit in a river" src="https://blog.zatsit.fr/assets/images/redpanda-river-watching-fruit-3ca24feb833b03beba25b8967a1dd91c.png" width="1516" height="1114" class="img_ev3q"></p>
<p>Avant de parler des transformations plus spécifiques à Redpanda, on découvre ou redécouvre les streams stateless ou stateful dans ce cours,
le premier n’a pas besoin de retenir ce qu’il voit et est donc moins gourmand en mémoire tandis que le second aura besoin
de retenir des informations pour garder la cohérence (application State, comme avec KStream et sa base <a href="https://rocksdb.org/" target="_blank" rel="noopener noreferrer" class="">RocksDB</a> embedded).</p>
<p><img decoding="async" loading="lazy" alt="redpanda sitting on a planet with other planets around him" src="https://blog.zatsit.fr/assets/images/redpanda-on-planet-9bb1158520d99382733024b458b0b7d5.png" width="1182" height="596" class="img_ev3q"></p>
<p>La promesse des <strong>Redpanda Data Transform</strong> : co-localiser les transformations stateless directement dans le broker.
Comment ? En écrivant un peu de NodeJS et en utilisant la CLI pour déployer ces transformations
(plus de détails sur le moteur d’exécution et les concepts dans <a href="https://redpanda.com/blog/wasm-architecture" target="_blank" rel="noopener noreferrer" class="">cette page</a>).</p>
<p>Let’s stream avec <a href="https://github.com/redpanda-data-university/rp-102-stream-processing" target="_blank" rel="noopener noreferrer" class="">ce projet support</a>
grâce auquel nous allons apprendre à faire une petite transformation de données :
masquer un numéro de carte de crédit dans un payload depuis un topic source et le propager vers un autre topic.</p>
<p>Bon, malheureusement pour moi c’est du NodeJS qu'il faut écrire, et ce n’est pas ma tasse de thé,
mais c’est purement subjectif à ce niveau du projet (ma version de Node à ce moment était supérieure à celle recommandée par le cours,
une issue et un coup de npm plus tard on peut donc déployer notre première transformation).</p>
<p>Les commentaires vous expliquent bien chaque étape et on se rend vite compte que c'est assez simple et parfait pour des transformations de format.</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token maybe-class-name">SimpleTransform</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token known-class-name class-name">PolicyError</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token maybe-class-name">PolicyInjection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"@vectorizedio/wasm-api"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// instantiate a class for registering the transform</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> transform </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">SimpleTransform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// subscribe to the source topic, and read from the Earliest offset</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> transform</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">subscribe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"purchases"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token maybe-class-name">PolicyInjection</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">Earliest</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Set the error handling strategy. In this case, we will skip an event</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// if the transform fails</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> transform</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">errorHandler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">PolicyError</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access maybe-class-name">SkipOnFailure</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Create a stateless transform function that masks credit card numbers</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">maskCreditCardNumbers</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// The record value comes in as a byte string, so deserialize</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// this to a JSON object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">record</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// If the record has a card number, mask the card number</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// i.e. 1111222233334444 will become ************4444</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">hasOwnProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'card_number'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    value</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'card_number'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'card_number'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\d</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(?=</span><span class="token regex regex-source language-regex char-set class-name" style="color:#36acaa">\d</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">{4}</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-flags" style="color:#36acaa">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// In order to write back to Redpanda, we need to serialize the new</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// record back into a byte array</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  buf </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token maybe-class-name">Buffer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">from</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">JSON</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">stringify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> newRecord </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">record</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> buf</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> newRecord</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Register the processRecord handler, which will invoke our card masking</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// function on a batch of records</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> transform</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">processRecord</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">recordBatch</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> transformedRecord </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> recordBatch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter punctuation" style="color:#393A34">{</span><span class="token parameter"> header</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> records </span><span class="token parameter punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      header</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">records</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> records</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">maskCreditCardNumbers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Write the result to a new output topic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"masked"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> transformedRecord</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// processRecord function returns a Promise</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token known-class-name class-name">Promise</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">resolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> exports</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"default"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> transform</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span></code></pre></div></div>
<p>Le déploiement via la CLI :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk wasm deploy --name mask-card mask-card/dist/main.js</span><br></span></code></pre></div></div>
<p>Notre transformation est donc déployée au sein de notre cluster, puisque nous avions déjà cette configuration de faite :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk cluster config set enable_coproc true</span><br></span></code></pre></div></div>
<p>Là vous vous dites, "j'ai bien lu wasm dans la commande et pourquoi enable coproc ?". Et oui, Redpanda utilise <a href="https://webassembly.org/" target="_blank" rel="noopener noreferrer" class="">WebAssembly</a>
pour la gestion des ces fonctions de transformations et je vous renvoie vers la <a href="https://docs.redpanda.com/current/develop/data-transforms/how-transforms-work/" target="_blank" rel="noopener noreferrer" class="">documentation de Redpanda à ce sujet</a>
qui vous expliquera comment une VM tourne sur le leader d'une partition pour traiter ses données à tranformer.</p>
<blockquote>
<p>Vous remarquerez (valable en tout casen Janvier 2023), un disclamer indique que ce n'est pas "Production Ready", en tout cas pas conseillé ;-)</p>
</blockquote>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic consume coprocessor_internal_topic --offset start -n 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">➜  mask-card git:(main) ✗ rpk topic list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                        PARTITIONS  REPLICAS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">coprocessor_internal_topic  1           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">purchases                   4           1</span><br></span></code></pre></div></div>
<p>Maintenant petit instant magique, on produit de la donnée dans le topic et elle apparait masquée dans le topic de sortie :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">➜  mask-card git:(main) ✗ rpk topic produce purchases</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{"user_id": 123, "card_number": "1111222233334444"}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Produced to partition 3 at offset 0 with timestamp 1694462899860.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">➜  mask-card git:(main) ✗ rpk topic list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                        PARTITIONS  REPLICAS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">coprocessor_internal_topic  1           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">purchases                   4           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">purchases._masked_          4           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic urchases._masked_</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "user_id": 123,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "card_number": "************4444"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span></code></pre></div></div>
<p>Pour supprimer notre transformation rien de plus simple, c’est un remove.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk wasm remove mask-card</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="un-peu-de-connect">Un peu de Connect<a href="https://blog.zatsit.fr/redpanda-introduction#un-peu-de-connect" class="hash-link" aria-label="Lien direct vers Un peu de Connect" title="Lien direct vers Un peu de Connect" translate="no">​</a></h3>
<p>Pour le moment, nous nous sommes concentrés sur le coeur de Redpanda et avons eu des interactions de consommation et de production/transformation avec ses brokers.
Vous le savez, dans les systèmes d’information, la donnée transite. Elle a une source, elle subit des enrichissements,
elle peut croiser des affluents et se déverser à plein d’endroit.
Sur son chemin, elle va traverser des couches technologiques différentes, alors comment facilement interconnecter cette hétérogénéité ?
C’est là qu’intervient <a href="https://kafka.apache.org/documentation.html#connect" target="_blank" rel="noopener noreferrer" class="">Kafka Connect</a> et les <a href="https://docs.confluent.io/platform/current/connect/transforms/overview.html" target="_blank" rel="noopener noreferrer" class="">transformations possibles</a>.</p>
<p>Rien de différent non plus par rapport à Apache Kafka ici, je vous laisse découvrir Connect avec le précédent lien.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="et-de-kstreams">Et de KStreams<a href="https://blog.zatsit.fr/redpanda-introduction#et-de-kstreams" class="hash-link" aria-label="Lien direct vers Et de KStreams" title="Lien direct vers Et de KStreams" translate="no">​</a></h3>
<p>Puisque les transformations natives au cluster que nous avons vues ou les connectors ne suffisent pas à couvrir tous
les usescases possibles avec les données d’un cluster, Kafka Streams permet de construire des applications plus riches
qui pourront croiser, joindre des données internes au cluster et réaliser des opérations plus complexes.</p>
<p>Pour plus d’informations, référez vous à la <a href="https://kafka.apache.org/documentation/streams/" target="_blank" rel="noopener noreferrer" class="">documentation officielle</a>.</p>
<p>Le hands-on de RedPanda dédié au Streams va vous permettre de réaliser une opération assez simple :
compter le nombre de commandes par utilisateur qui transitent sur un topic.
Un simple groupBy associé à un Count, qui donnera une opération dites “statefull” dans le jargon Kafka.
Ce qui va nécessiter de créer un <a href="https://docs.confluent.io/platform/current/streams/architecture.html#streams-architecture-state" target="_blank" rel="noopener noreferrer" class="">state store</a>
pour conserver l’état des données qu’on agrège et compte. Je vous conseille de lire et relire la documentation associée pour bien comprendre le concept (lié à la compaction) et les mécanisme de chargement en mémoire (RocksDB), de haute disponibilité et de tolérance associé.</p>
<p><img decoding="async" loading="lazy" alt="Untitled" src="https://blog.zatsit.fr/assets/images/Untitled%204-05de5c48f8af73db64ec541d96c41994.png" width="966" height="736" class="img_ev3q"></p>
<p>Ainsi dans notre exemple, la production de ces évènements :</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">➜ alias rpk="docker exec -ti redpanda-1 rpk"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic produce purchases --format "%k,%v\n"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">user1,purchase_event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">user1,purchase_event</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">user2,purchase_event</span><br></span></code></pre></div></div>
<p>va donner ce résultat dans l’application de test</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Starting Kafka Streams application</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[purchases]: user2, 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[purchases]: user1, 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[purchases]: user1, 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[purchases]: user1, 3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public static Topology build() {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StreamsBuilder builder = new StreamsBuilder();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    builder.stream("purchases", Consumed.with(Serdes.String(), Serdes.String()))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        // group by the key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .groupByKey(Grouped.with(Serdes.String(), Serdes.String()))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        // count per key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .count()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        // convert the table to a stream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .toStream()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        // print the output</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .print(Printed.&lt;String, Long&gt;toSysOut().withLabel("purchases"));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return builder.build();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span></code></pre></div></div>
<p>Cette simple topologie nous a permis d’avoir ce résultat.
Si vous connaissez Kafka et les Streams, vous voyez donc que c’est scrupuleusement la même chose et vous retrouverez
votre State store créé sous forme de topic compact au sein du cluster.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                          PARTITIONS  REPLICAS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">local-dev-KSTREAM-AGGREGATE-STATE-STORE-0000000001-changelog  4           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">purchases                                                     4           1</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="un-use-case-plus-complet">Un use case plus complet<a href="https://blog.zatsit.fr/redpanda-introduction#un-use-case-plus-complet" class="hash-link" aria-label="Lien direct vers Un use case plus complet" title="Lien direct vers Un use case plus complet" translate="no">​</a></h2>
<p>Pour terminer ce survol de toutes les possibilités/compatibilités de Redpanda, on termine par le cours dédié à un cas d’usage de détection de fraude.
Un cas d’usage déjà couvert avec Apache Kafka depuis longtemps et dans de nombreux contextes métier : <a href="https://www.confluent.io/fr-fr/use-case/fraud-detection/" target="_blank" rel="noopener noreferrer" class="">https://www.confluent.io/fr-fr/use-case/fraud-detection/</a></p>
<p>Cet exercice est l’occasion de découvrir que Redpanda possède un schéma registry interne au cluster,
ce qui diffère de l’écosystème Confluent autour de Kafka : <a href="https://docs.confluent.io/platform/current/schema-registry/index.html" target="_blank" rel="noopener noreferrer" class="">https://docs.confluent.io/platform/current/schema-registry/index.html</a></p>
<p>Nous configurons donc ensuite les topics nécessaires, créons le connector source à une base Postgres et spécifiquement à la table des “achats”.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker exec -ti kafka-connect \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    curl -XPUT localhost:8083/connectors/purchases-source/config \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -H "Content-Type: application/json" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    -d '</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "connection.url": "jdbc:postgresql://postgres:5432/root?user=root&amp;password=secret",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "mode": "incrementing",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "incrementing.column.name": "id",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "topic.prefix": "",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "table.whitelist": "purchases",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "value.converter": "io.confluent.connect.avro.AvroConverter",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "value.converter.schema.registry.url": "http://redpanda:8081",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms": "SetValueSchema,ValueToKey,ExtractKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms.SetValueSchema.type": "org.apache.kafka.connect.transforms.SetSchemaMetadata$Value",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms.SetValueSchema.schema.name": "com.example.model.Purchase",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms.ValueToKey.type": "org.apache.kafka.connect.transforms.ValueToKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms.ValueToKey.fields": "credit_card",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms.ExtractKey.type": "org.apache.kafka.connect.transforms.ExtractField$Key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     "transforms.ExtractKey.field": "credit_card"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }'</span><br></span></code></pre></div></div>
<p>Le projet Java contient déjà la “topology” et les déclarations de streams qui vont filtrer,
compter les opérations sur une fenêtre de temps pour tenter de détecter d’éventuelles fraudes.</p>
<p>Notre Connector source nous a permis de créer un schéma qui est déjà stocké dans le registre.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker exec -ti redpanda-1 curl localhost:8081/subjects/purchases-value/versions/1 | jq -r '.schema' | jq '.' &gt; src/main/avro/purchase.avsc</span><br></span></code></pre></div></div>
<p>On en récupère le contenu en vue d’une compilation avec la génération d’une classe Purchase et de ce qu’il faut pour la sérialiser/déserialiser.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">   private int id;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   private java.lang.CharSequence category;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   private java.lang.Double amount;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   private java.lang.CharSequence credit_card;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   private java.lang.Double distance_from_billing_zip;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   private java.time.Instant timestamp;</span><br></span></code></pre></div></div>
<p>On créé ensuite en base de données les conditions nécessaires à la levée d’une alerte (à savoir au moins 3 commandes en moins de 60 secondes avec la même carte bancaire).
Une alerte est levée et la création d’un nouveau schéma correspondant.</p>
<p>On peut aussi visualiser le topic de travail du state store de notre KStream :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NAME                                                            PARTITIONS  REPLICAS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">_connect-configs                                                1           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">_connect-offsets                                                25          1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">_connect-status                                                 5           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">_schemas                                                        1           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">alerts-avro                                                     4           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">alerts-json                                                     4           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">local-dev-0-KSTREAM-AGGREGATE-STATE-STORE-0000000001-changelog  4           1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">purchases                                                       4           1</span><br></span></code></pre></div></div>
<p>et visualiser notre alerte :</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">rpk topic consume -n 1 alerts-avro</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "topic": "alerts-avro",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "key": "1111-2222-3333-4444",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "value": "\u0000\u0000\u0000\u0000\u0002\u0002\u0026high_purchase_count\u0002\u00261111-2222-3333-4444\u0002\ufffd\ufffd\ufffd\ufffd\ufffdb",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "timestamp": 1695068363227,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "partition": 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "offset": 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Voilà pour un premier tour de Redpanda si vous n'aviez pas encore creusé cette solution, n'hésitez plus !</p>
<p><a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fredpanda-introduction%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage Linkedin" src="data:image/webp;base64,UklGRnoFAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMtAIAAC8hQAgQFkmOJKu24615A54zno5+xjFu/tPVOV/yvHXM/swsQWzbSJIc7/3XdNXu3cVwkCJJciQdf1J95bFaSwz3OwxwAAAsI11w97ZtY7v+xMm2/yf7f7Vt27ZtbLZt21Dktm3DtD3t+Yi2W4HAM2jE8FCgER6rxU9eaMchzofiDm1pPKgFR/gfjDOmKWIcFxvwi09846/Xj/0NO6c4UcvYxiN+hpyiQ7kpTdKXMrE14uYMrvrLUY/vXygbKmpPBuADs1CrqnfnhBGFr51+p2pF6TzvFpTHHr59bliRgp+BAn+4UwnRlO+fP/jqdWCGHcaGqtxgDZUIR+IxbsY6wjvucYVbPON77vz6g6c/eL2Zv3CG/f0fv5b9xDx6k56kDxM4mfjAQjKU9Cb9mMYpLjHD5EYmEtEowhTO8LnkD3yEbCKbKJIWWiauKZCIRCZRJsMkj4mLQTBikRGIjCCJpQ0VQZhbciGM1juKbsVQPHFOlm32jPX8bwdMfInqyig//D+AqqpPt38AKcThGL8LhGlVdIujWymUzh2yju5Yyy5oF/3HJ8qn84QvPif08rWnVFUVdNF52qfMgBBdNJFoKpFUQ9JRTFWVIYNovHYKoRCBZKxhI6ouSi83UGUWp443njuBggCszYlbFfTmG92bb+De+SG9+ix65YynTi2LDvn4mHMix+CxYD1wRYHVRad4LUZUz3UoaSXZCq9NIWTS6ds5grfPWFC7AWVNMk24iow7fTsn8O6xYUXdgpDJNohk8v0RRlUV3YqieO6QRZsDQ9XH25YBNZs6apKoqkgGC/CKGOjfwYhcMDhxRwlkDX0YZFhjYgOGA7efd6S3dB/wd35xcYFnfM0dvF1cXOBpd8Pun4sLPJzvbDEUG4LmbfhRAs/xXymNe9uNADzRiOGhoAZyX238" width="34" height="34" class="img_ev3q"></a>
<a href="https://twitter.com/intent/tweet?text=Pr%C3%A9sentation%20de%20RedPanda%2C%20au%20travers%20du%20premier%20cours%20d%C3%A9di%C3%A9%20aux%20d%C3%A9veloppeurs%20de%20la%20%22RedPanda%20University%22%20que%20j%27ai%20suivi%2C%0Aje%20vous%20pr%C3%A9sente%20les%20grands%20principes%20et%20les%20premiers%20pas%20dans%20cet%20%C3%A9cosyst%C3%A8me&amp;url=https%3A%2F%2Fblog.zatsit.fr%2Fblog%2Fredpanda-introduction%2F" target="_blank" rel="noopener noreferrer" class=""><img decoding="async" loading="lazy" alt="Partage X" src="data:image/webp;base64,UklGRnIEAABXRUJQVlA4WAoAAAAwAAAAIQAAIQAASUNDUKACAAAAAAKgbGNtcwRAAABtbnRyUkdCIFhZWiAH6AACAAEADAAgACphY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1kZXNjAAABIAAAAEBjcHJ0AAABYAAAADZ3dHB0AAABmAAAABRjaGFkAAABrAAAACxyWFlaAAAB2AAAABRiWFlaAAAB7AAAABRnWFlaAAACAAAAABRyVFJDAAACFAAAACBnVFJDAAACFAAAACBiVFJDAAACFAAAACBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACQAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABzAFIARwBCbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA9tYAAQAAAADTLXNmMzIAAAAAAAEMQgAABd7///MlAAAHkwAA/ZD///uh///9ogAAA9wAAMBuWFlaIAAAAAAAAG+gAAA49QAAA5BYWVogAAAAAAAAJJ8AAA+EAAC2xFhZWiAAAAAAAABilwAAt4cAABjZcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltjaHJtAAAAAAADAAAAAKPXAABUfAAATM0AAJmaAAAmZwAAD1xtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAEcASQBNAFBtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJWUDhMqwEAAC8hQAgQlUChtu38883o/3+cbdtWXLKNZNuKtpfUzGbbTn/O2+834/un9Z33nP3OUgQDSZLS/P99cXc0HhxyTACKP3OVdXff5r+/Wzxq/AJ9Xz1q+2/BwnJnJ64ptjqT2lF9IuY49wlF+nvouzlrOxSlPFNs9Ch8QIPjkXto3oAx67jXujuY94SvQe8E/qGSEJ4vYB0oGILu+GLf8uxtTwAEVSPponfASzM3T0NOCYVDtj9QUMBJn9kA7qD70fpT0COE78cxB2n7EmHAhqC75AhxARUz4W7lziAOgF/y5x5TEwIUVvH9iTyKvDTjjyZ15otS940aHileQE93q2Wuv5TlyboTnnRXz3EdIU+NT9efUuBB9vbs6mtCVy4gJtjfSEZhC7tI01JB50Z6UwS+jHCxFy63917NpyIA1MpwxIQD1ZjdKRmJR0JcvgwkEQBA/3uWg4gPaI4hZkosyF6gSyGn4H3RRnjLFnT3O1PGcSwPt9Jihw8RTA8cKe+hsn14JY7v9XXPJgGj+KmJfnxW5yk2Re/MNvqWElmx+Ri+6IEXzZL9/192ttt3fswA" width="34" height="34" class="img_ev3q"></a></p>]]></content:encoded>
            <category>architecture</category>
            <category>data</category>
        </item>
        <item>
            <title><![CDATA[Bienvenue]]></title>
            <link>https://blog.zatsit.fr/bienvenue</link>
            <guid>https://blog.zatsit.fr/bienvenue</guid>
            <pubDate>Tue, 24 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Bienvenue sur le blog, on se présente !]]></description>
            <content:encoded><![CDATA[<p>Bienvenue sur le blog, on se présente !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="bienvenue-sur-le-blog-de-zatsit-">Bienvenue sur le blog de <strong>zatsit</strong> !<a href="https://blog.zatsit.fr/bienvenue#bienvenue-sur-le-blog-de-zatsit-" class="hash-link" aria-label="Lien direct vers bienvenue-sur-le-blog-de-zatsit-" title="Lien direct vers bienvenue-sur-le-blog-de-zatsit-" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Zatsit banner" src="https://blog.zatsit.fr/assets/images/objectives-b017a09ce299e929e0e255ddb5e6612f.png" width="1662" height="1616" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="là-où-compétences-techniques-et-engagement-écologique-et-sociétal-se-rencontrent">Là où compétences techniques et engagement écologique et sociétal se rencontrent<a href="https://blog.zatsit.fr/bienvenue#l%C3%A0-o%C3%B9-comp%C3%A9tences-techniques-et-engagement-%C3%A9cologique-et-soci%C3%A9tal-se-rencontrent" class="hash-link" aria-label="Lien direct vers Là où compétences techniques et engagement écologique et sociétal se rencontrent" title="Lien direct vers Là où compétences techniques et engagement écologique et sociétal se rencontrent" translate="no">​</a></h2>
<p>Bienvenue sur le blog <strong>zatsit</strong>, votre espace dédié à la découverte de sujets techniques, mais pas que, rédigés par les collaborateurs. Chez nous, la croissance professionnelle et technologique s'harmonise parfaitement avec un engagement fort envers l'environnement et le bien-être de notre communauté. Nous vous en parlerons au fil des semaines, des mois, des années !</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="découvrez-des-articles">Découvrez des articles<a href="https://blog.zatsit.fr/bienvenue#d%C3%A9couvrez-des-articles" class="hash-link" aria-label="Lien direct vers Découvrez des articles" title="Lien direct vers Découvrez des articles" translate="no">​</a></h2>
<p>Au fil de la veille de chacun, des articles viendront fleurir ici. Que ce soit pour une nouvelle solution technique, un retour d'expérience sur un projet ou une passion, les collaborateurs zatsit prendront la plume pour vous chatouiller les neurones !</p>
<p>Les catégories s'étofferont donc pour parler :</p>
<ul>
<li class="">écoconception</li>
<li class="">développement mobile, web</li>
<li class="">architecture technique</li>
<li class="">intelligence artificielle (et moins énergivore on l'espère)</li>
<li class="">observabilité et mesure d'empreinte</li>
<li class="">... et bien d'autres encore</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="laissez-vous-inspirer-par-notre-collectif">Laissez-vous Inspirer par Notre Collectif<a href="https://blog.zatsit.fr/bienvenue#laissez-vous-inspirer-par-notre-collectif" class="hash-link" aria-label="Lien direct vers Laissez-vous Inspirer par Notre Collectif" title="Lien direct vers Laissez-vous Inspirer par Notre Collectif" translate="no">​</a></h2>
<p>Parcourez nos articles de blog pour entendre les voix de nos collaborateurs, découvrir leurs passions, leurs projets personnels et la manière dont ils contribuent à notre mission commune. Chez <strong>zatsit</strong>, nous croyons que chaque talent contribue à la prospérité de l'entreprise et de notre écosystème, c'est pourquoi chaque voix compte.</p>
<p>Bonne lecture !</p>]]></content:encoded>
            <category>general</category>
        </item>
    </channel>
</rss>