<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
      <title>Dralagen</title>
      <link>https://dralagen.fr</link>
      <description>Les dernières 20 notes on Dralagen</description>
      <generator>Quartz -- quartz.jzhao.xyz</generator>
      <item>
    <title>ADR - Architecture Decision Record</title>
    <link>https://dralagen.fr/ADR---Architecture-Decision-Record</link>
    <guid>https://dralagen.fr/ADR---Architecture-Decision-Record</guid>
    <description><![CDATA[ &lt;p&gt;L’Architecture Decision Record (ADR) est un journal de décisions prises par l’équipe.
L’objectif est de tracer les décisions validées ou rejetées, le contexte de la décision et les options écartées.&lt;/p&gt;
&lt;h1 id=&quot;lobjectif&quot;&gt;L’objectif&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#lobjectif&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Contexte&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;s’assure que tout le monde comprend le problème de la même façon&lt;/li&gt;
&lt;li&gt;Se souvenir des conditions de prise de décision
&lt;strong&gt;Options, Avantages et Inconvénients&lt;/strong&gt; :&lt;/li&gt;
&lt;li&gt;Tracer toutes les idées pour ne pas en oublier&lt;/li&gt;
&lt;li&gt;Eviter les mêmes conversations en boucle&lt;/li&gt;
&lt;li&gt;Dans le futur, voir les pistes envisagées et pouvoir proposer d’autres solutions non évoquées.
&lt;strong&gt;La décision et les critères&lt;/strong&gt; :&lt;/li&gt;
&lt;li&gt;une vision similaire pour tout le monde sur la décision&lt;/li&gt;
&lt;li&gt;Permet d’avoir les critères déterminant de la décision&lt;/li&gt;
&lt;li&gt;Trace le pourquoi
&lt;strong&gt;Les conseils&lt;/strong&gt; :&lt;/li&gt;
&lt;li&gt;Trace les conditions qui n’ont pas d’importance aujourd’hui mais qui peuvent avoir un impact.&lt;/li&gt;
&lt;li&gt;Envisager les limitations futures sur la solution choisie
&lt;strong&gt;Les conséquences&lt;/strong&gt; :&lt;/li&gt;
&lt;li&gt;Quels sont les actions à prendre&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;exemple-de-template&quot;&gt;Exemple de template&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#exemple-de-template&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;markdown&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;markdown&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#81A1C1;--shiki-dark-font-weight:inherit&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; ADR TEMPLATE&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; 📅 Date : &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; 👷 Décision prise par :&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; 🏁 Statut :&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#81A1C1;--shiki-dark-font-weight:inherit&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; Contexte&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;&amp;#x3C;--Quel est le contexte de votre décision. Exemple : ADR précédent, problème auquel l&#039;équipe veut s&#039;attaquer, ...--&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#81A1C1;--shiki-dark-font-weight:inherit&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; Options envisagées 💡&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; Option 1 : &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt; **&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#D8DEE9FF;--shiki-dark-font-weight:bold&quot;&gt;Plus de détails :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; ✅ &lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#D8DEE9FF;--shiki-dark-font-weight:bold&quot;&gt;Avantages :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; 🚫 &lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#D8DEE9FF;--shiki-dark-font-weight:bold&quot;&gt;Inconvénients :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; Option 2 : &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt; **&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#D8DEE9FF;--shiki-dark-font-weight:bold&quot;&gt;Plus de détails :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; ✅ &lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#D8DEE9FF;--shiki-dark-font-weight:bold&quot;&gt;Avantages :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; 🚫 &lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#D8DEE9FF;--shiki-dark-font-weight:bold&quot;&gt;Inconvénients :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#ECEFF4;--shiki-dark-font-weight:bold&quot;&gt;**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#81A1C1;--shiki-dark-font-weight:inherit&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; Conseils&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;&amp;#x3C;--Tous les conseils que l&#039;on vous a donnés --&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#81A1C1;--shiki-dark-font-weight:inherit&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; Décision 🏆&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;&amp;#x3C;--Quelles décisions ont été prises et quels étaient les critères--&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-weight:bold;--shiki-dark:#81A1C1;--shiki-dark-font-weight:inherit&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; Conséquences&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-weight:bold;--shiki-dark:#88C0D0;--shiki-dark-font-weight:inherit&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;&amp;#x3C;--Conséquences de votre décision--&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;♻️ Mise à jour : &amp;#x3C;date&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;sources :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.octo.com/architecture-decision-record&quot; class=&quot;external&quot;&gt;https://blog.octo.com/architecture-decision-record&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://martinfowler.com/articles/scaling-architecture-conversationally.html&quot; class=&quot;external&quot;&gt;https://martinfowler.com/articles/scaling-architecture-conversationally.html&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Comment émettre une notification du Back vers un Front ?</title>
    <link>https://dralagen.fr/Communication-du-Back-vers-le-Front-par-notification</link>
    <guid>https://dralagen.fr/Communication-du-Back-vers-le-Front-par-notification</guid>
    <description><![CDATA[ &lt;p&gt;La programmation asynchrone est de plus en plus souvent présente dans nos développements.
Les microservices multiplient le nombre de composants présents dans notre infrastructure et la communication synchrone pour réaliser un traitement n’est plus une solution viable.
Trop d’adhérence entre les services ; en microservices, on part du principe qu’il y a forcément un élément qui est down.&lt;/p&gt;
&lt;p&gt;La communication back-end utilise de plus en plus des modèles asynchrones (Kafka, AMQP, JMS, etc…). Nos services “s’isolent” pour mieux fonctionner ensemble par des notifications.&lt;/p&gt;
&lt;p&gt;Comment nos services peuvent notifier la fin d’un traitement ou l’avancement du traitement vers le front pour qu’il puisse réagir. Comment un serveur peut informer l’utilisateur d’un changement d’état, d’une mise à jour.&lt;/p&gt;
&lt;h1 id=&quot;les-méthodes&quot;&gt;Les Méthodes&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#les-méthodes&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;client-pulling&quot;&gt;Client pulling&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#client-pulling&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Méthode simple côté front, une requête tous les 5 secondes pour dire “Dans quel état est mon traitement ?” et le service doit répondre à chaque fois.
Pour que le service puisse réponde correctement, il doit connaître l’ensemble du traitement pour interroger la base de données ou le bon service afin de collecter les bonnes informations, alors que le front peut déjà avoir en sa possession.
Du traitement pas toujours simple dans un système fortement distribué, où plusieurs tâches peuvent être réalisées en concurrence.&lt;/p&gt;
&lt;h2 id=&quot;web-socket&quot;&gt;Web Socket&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#web-socket&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Le protocole Web Socket existe, elle permet de faire une communication entre le front et le back en temps réel dans les deux directions.
Ça implique d’implémenter un autre protocole, qui n’est pas toujours supporté par les proxy et pare-feu.
L’ouverture de flux bi-directionnel peut être un frein ou un refus lié à la sécurité.&lt;/p&gt;
&lt;h2 id=&quot;server-sent-events&quot;&gt;Server-Sent Events&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#server-sent-events&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La technique Server-Sent Events (SSE) pour établir une connexion du back vers le front.
Le front s’abonne au back, et le back émet des données dans la connexion.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simple et efficient&lt;/strong&gt;, basé sur une communication unidirectionnelle, l’architecture se simplifie par rapport au Web Socket.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basé sur HTTP&lt;/strong&gt;, le protocole HTTP est très bien supporté sur l’ensemble des navigateurs et s’intègre mieux avec l’infrastructure existante telle que HTTP/2, les proxys et les pare-feu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reconnection automatique&lt;/strong&gt;, SSE est en capacité de se reconnecter automatiquement si la connexion est interrompue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Événements typés&lt;/strong&gt;, il est possible de typer les événements pour mieux les identifier dans une application gérant plusieurs événements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Limitation de SSE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bien que SSE est bien supporté par tous les navigateurs modernes.
L’API EventSource est normalisée dans le cadre de HTML5 sortie en 2014, mis en draft en 2011, cette API peut encore être considérée comme jeune.&lt;/li&gt;
&lt;li&gt;SSE est optimisé pour du texte ; ce n’est pas possible d’envoyer du binaire.&lt;/li&gt;
&lt;li&gt;Si on utilise HTTP/1, il y a une limite technique : le nombre de connexions ouvertes par navigateur à 6 pour un même domaine.
Ce qui implique qu’on peut bloquer l’ensemble d’une page web, si on a plusieurs onglets d’ouvert.
Pour contourner cela, on cherchera à mettre en place un “shared worker”.&lt;/li&gt;
&lt;li&gt;Si l’application a beaucoup d’utilisateurs simultanés, le serveur doit être en capacité de maintenir un nombre important de connexions HTTP.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#conclusion&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;L’utilisation du Server-Sent Events (SSE) permet d’avoir un approche au temps réel plus simple que l’utilisation d’un simple client pulling aura du mal à répondre sans créer une surcharge importante sur l’infrastructure.
Ça mise en place peut-être élégante, il faudra bien prendre en compte toutes les contraintes lors de la reconnexion du client ou lorsqu’ notre environnement contient plusieurs serveurs.
SSE offre une mise en place plus simple et moins coûteuse que d’utiliser le protocole Web Socket.&lt;/p&gt;
&lt;h1 id=&quot;aller-plus-loin&quot;&gt;Aller plus loin&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#aller-plus-loin&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Pour mieux comprendre, vous pouvez trouver un POC sur la &lt;a href=&quot;./Mise-en-place-de-Server-Sent-Events&quot; class=&quot;internal alias&quot; data-slug=&quot;Mise-en-place-de-Server-Sent-Events&quot;&gt;Mise en place de Server-Sent Events&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://medium.com/deliveryherotechhub/what-is-server-sent-events-sse-and-how-to-implement-it-904938bffd73&quot; class=&quot;external&quot;&gt;http://medium.com/deliveryherotechhub/what-is-server-sent-events-sse-and-how-to-implement-it-904938bffd73&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@AlexanderObregon/how-to-implement-server-sent-events-sse-in-spring-boot-620024272ccb&quot; class=&quot;external&quot;&gt;https://medium.com/@AlexanderObregon/how-to-implement-server-sent-events-sse-in-spring-boot-620024272ccb&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Reset des clé PGP provenant d&#039;une clé physique</title>
    <link>https://dralagen.fr/GPG/Reset-des-cl%C3%A9-PGP-provenant-d'une-cl%C3%A9-physique</link>
    <guid>https://dralagen.fr/GPG/Reset-des-cl%C3%A9-PGP-provenant-d'une-cl%C3%A9-physique</guid>
    <description><![CDATA[ &lt;p&gt;Lors de l’insertion d’une clé physique, la signature est sauvegardée localement avec le numéro de série de la carte.&lt;/p&gt;
&lt;p&gt;Pour simplifier l’utilisation pour signer les commits Git, j’utilise la même clé PGP sur 2 clés physiques différentes.
Si je change de clé physique, il faut réinitialiser le cache des clés.&lt;/p&gt;
&lt;p&gt;Une fonction bash permet de forcer le changement :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; switchyubi&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;  rm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; ~/.gnupg/private-keys-v1.d/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#81A1C1;--shiki-dark-font-style:inherit&quot;&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;  gpgconf&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --kill&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; gpg-agent&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;  gpg&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --card-status&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Git - Ajout d&#039;un gitignore global</title>
    <link>https://dralagen.fr/Git/Git---Ajout-d'un-gitignore-global</link>
    <guid>https://dralagen.fr/Git/Git---Ajout-d'un-gitignore-global</guid>
    <description><![CDATA[ &lt;p&gt;Par défaut Git lit les fichiers &lt;code&gt;.gitignore&lt;/code&gt; présents dans le dépôt, mais aussi un fichier présent dans les méta &lt;code&gt;$GIT_DIR/info/exclude&lt;/code&gt;.
Git propose la propriété &lt;code&gt;core.excludesFile&lt;/code&gt; dans sa configuration pour ajouter un fichier global spécifique.
La propriété prend l’emplacement d’un fichier qui sera appliqué dans tous les projets.&lt;/p&gt;
&lt;p&gt;Pourquoi définir un fichier &lt;code&gt;gitignore&lt;/code&gt; en global ?
L’utilité est de pouvoir exclure des fichiers générés par son système d’exploitation sans charger le fichier &lt;code&gt;.gitignore&lt;/code&gt; de chaque projet.&lt;/p&gt;
&lt;p&gt;L’exemple que j’ai rencontré, on est peu de développeurs sous macOS, et j’en avais marre d’exclure sur chaque projet les fichiers spécifique à macOS.
J’ai donc ajouté un fichier &lt;code&gt;.gitignore&lt;/code&gt; à partir d’un &lt;a href=&quot;https://github.com/github/gitignore/blob/main/Global/macOS.gitignore&quot; class=&quot;external&quot;&gt;exemple&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; extrait du repo &lt;a href=&quot;https://github.com/github/gitignore&quot; class=&quot;external&quot;&gt;github/gitignore&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; dans mon “home”.
Puis j’ai ajouté dans la configuration ce fichier comme &lt;code&gt;excludesFiles&lt;/code&gt; avec la commande suivante :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --global&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; core.excludesFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; ~/.gitignore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Installation Claude Code</title>
    <link>https://dralagen.fr/IA/Installation-Claude-Code</link>
    <guid>https://dralagen.fr/IA/Installation-Claude-Code</guid>
    <description><![CDATA[ &lt;p&gt;Mon environnement d’installation, un Ubuntu 24.04 et NodeJS 22 installés avec ASDF.&lt;/p&gt;
&lt;p&gt;Dans la documentation, l’installation demande d’exécuter cette commande :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; @anthropic-ai/claude-code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;L’installation est réalisée dans le répertoire d’installation de Node dans le dossier ASDF.&lt;/p&gt;
&lt;p&gt;Pour éviter d’ajouter un PATH pour chaque version de Node, il est possible d’utiliser un répertoire spécifique pour les installations globales :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; ~/.npm-global&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; set&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; prefix&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;~/.npm-global&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; PATH&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;=~&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;/.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;npm-global&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;bin&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$PATH&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; @anthropic-ai/claude-code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;L’export du PATH sera ajouté dans la configuration pour le conserver dans les nouveaux shells.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;source :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/getting-started&quot; class=&quot;external&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/getting-started&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code/troubleshooting#common-installation-issues&quot; class=&quot;external&quot;&gt;https://docs.anthropic.com/en/docs/claude-code/troubleshooting#common-installation-issues&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>MCP - Atlassian</title>
    <link>https://dralagen.fr/IA/MCP---Atlassian</link>
    <guid>https://dralagen.fr/IA/MCP---Atlassian</guid>
    <description><![CDATA[ &lt;p&gt;Le protocole MCP est utilisé pour permettre à une IA (intelligence artificielle) de se connecter à un outil.
Jira et Confluence sont souvent utilisés dans les environnements professionnels.&lt;/p&gt;
&lt;p&gt;Permettre d’avoir un lien MCP entre l’IA et Confluence/Jira permet plusieurs cas d’utilisation.
Côté Confluence, cela permet de lire les conventions de développement de l’entreprise ou de lire un guide de migration qu’on souhaite appliquer.&lt;/p&gt;
&lt;p&gt;Le serveur MCP est aussi capable de compléter la documentation du projet pour une fonctionnalité, ou de faire avancer le ticket Jira avec un commentaire.&lt;/p&gt;
&lt;p&gt;Plusieurs exemples de configuration sont disponibles sur le &lt;a href=&quot;https://github.com/sooperset/mcp-atlassian&quot; class=&quot;external&quot;&gt;repo&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour un serveur self-hosted, j’ai dû supprimer la vérification SSL parce que le Docker n’a pas les certificats de l’entreprise.
Exemple de configuration pour un serveur :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;servers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;   &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;mcp-atlassian&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;            &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;command&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;            &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;--rm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-i&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;CONFLUENCE_URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;CONFLUENCE_USERNAME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;CONFLUENCE_PERSONAL_TOKEN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;CONFLUENCE_SSL_VERIFY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;JIRA_URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;JIRA_USERNAME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;JIRA_PERSONAL_TOKEN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;-e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;JIRA_SSL_VERIFY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;ghcr.io/sooperset/mcp-atlassian:latest&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;            ],&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;            &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;env&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;CONFLUENCE_URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;https://confluence.entreprise.com/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;CONFLUENCE_USERNAME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;myUsername&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;CONFLUENCE_PERSONAL_TOKEN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;myPATconfluence&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;CONFLUENCE_SSL_VERIFY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;JIRA_URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;https://jira.entreprise.com&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;JIRA_USERNAME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;myUsername&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;JIRA_PERSONAL_TOKEN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;myPATjira&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;JIRA_SSL_VERIFY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;            }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sooperset/mcp-atlassian&quot; class=&quot;external&quot;&gt;https://github.com/sooperset/mcp-atlassian&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>opencode - agent IA dans le terminal</title>
    <link>https://dralagen.fr/IA/opencode---agent-IA-dans-le-terminal</link>
    <guid>https://dralagen.fr/IA/opencode---agent-IA-dans-le-terminal</guid>
    <description><![CDATA[ &lt;p&gt;&lt;a href=&quot;https://opencode.ai/&quot; class=&quot;external&quot;&gt;Opencode&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; est un outil de codage agentique conçu dans le terminal.
Il se concentre sur l’utilisation d’outils, serveur MCP. La possibilité de lancer plusieurs agents en parallèle.
Son gros avantage est-être &lt;a href=&quot;https://models.dev/&quot; class=&quot;external&quot;&gt;multi-model&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; avec plusieurs &lt;a href=&quot;https://opencode.ai/docs/providers/&quot; class=&quot;external&quot;&gt;providers&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L’outil est open source et est très proche en fonctionnalité à &lt;a href=&quot;../IA/Installation-Claude-Code&quot; class=&quot;internal alias&quot; data-slug=&quot;IA/Installation-Claude-Code&quot;&gt;Claude Code&lt;/a&gt; ou Gemini Cli.&lt;/p&gt;
&lt;h1 id=&quot;les-concepts&quot;&gt;Les concepts&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#les-concepts&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;règles&quot;&gt;Règles&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#règles&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ajoute des informations à l’agent, le projet utilise le fichier &lt;a href=&quot;https://agents.md/&quot; class=&quot;external&quot;&gt;AGENTS.md&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; compatible avec d’autres outils comme GitHub Copilot, Cursor, Kilo Code, Gemini CLI, etc…&lt;/p&gt;
&lt;h2 id=&quot;agents&quot;&gt;Agents&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#agents&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Permet d’ajouter des profiles d’assistant, comme un expert développeur en code/Debug qui respect les bonnes pratiques, ou un profile reviewer qui sera capable de relire le code modifié et vérifier qu’il correspond à ce qui été attendu.
On peut aussi imaginer un assistant documentation qui pourra avoir accès en écriture sur le wiki pour compléter ou ajouter de la documentation pour un composant interne par exemple.&lt;/p&gt;
&lt;h2 id=&quot;commandes&quot;&gt;Commandes&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#commandes&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un sort de shortcut ou template pour des prompts pré-rédigés, comme l’ajout d’un test sur une méthode ou classe ou la création d’une nouvelle API.&lt;/p&gt;
&lt;p&gt;On peut aussi imaginer des commandes plus complexes qui peuvent lire une specification, analyser le projet pour créer un plan, le faire valider et réaliser l’implémentation, exécuter les tests et finir par mettre à jour la documentation.&lt;/p&gt;
&lt;h2 id=&quot;mcp&quot;&gt;MCP&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#mcp&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Permet d’ajouter des outils externes afin d’agrandir les possibilités de notre agent IA.
Que se soit pour récupérer de la documentation ou des tâches avec le &lt;a href=&quot;../IA/MCP---Atlassian&quot; class=&quot;internal alias&quot; data-slug=&quot;IA/MCP---Atlassian&quot;&gt;MCP - Atlassian&lt;/a&gt; ou pouvoir interragir avec un navigateur avec MCP Playwright.&lt;/p&gt;
&lt;h2 id=&quot;plugins&quot;&gt;Plugins&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#plugins&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Il est possible d’intégrer des plugins, que se soit dans le projet ou global pour ajouter des points d’extension pour sécuriser la lecture de fichier comme des &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&quot;les-avantages&quot;&gt;Les avantages&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#les-avantages&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;multi-fournisseurs&quot;&gt;Multi fournisseurs&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#multi-fournisseurs&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;J’aime beaucoup cet outil parce qu’on ne dépend pas d’une solution fermée.
Ce qui, dans un contexte où un changement de client peut engendrer un changement de provider, permet de garder un outil qu’on maîtrise.&lt;/p&gt;
&lt;p&gt;En provider disponible, j’ai réussi à me connecter avec un compte GitHub Copilot, ou encore du local avec Ollama (attention aux performances). Mais il est possible d’utiliser une clé d’API Anthropic ou un abonnement, mais aussi d’utiliser OpenRouter pour faire du benchmark.
Ça semble un bon outil pour ne pas se fermer avec un fournisseur où une solution, comme Claude Code ou Gemini CLI.&lt;/p&gt;
&lt;h2 id=&quot;multi-tâches&quot;&gt;Multi tâches&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#multi-tâches&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;J’ai réussi avec les différents Agents à avoir un chef d’orchestre pour lancer des tâches dédiées.
Ce découpage en plusieurs tâches m’a permis de diminuer le contexte du chef d’orchestre et a permis de terminer la tâche avec une bonne qualité.
Les sous-tâches n’étant pas polluées par le contexte de l’évolution précédente.&lt;/p&gt;
&lt;p&gt;Bon, ça demande de reconstruire plusieurs fois un contexte mais souvent plus petit, plus précis.&lt;/p&gt;
&lt;h1 id=&quot;limitations-observées&quot;&gt;Limitations observées&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#limitations-observées&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Après avoir testé l’outil en septembre 2025, soit la version 0.10.3, j’ai eu quelques éléments gênants lors de l’utilisation.&lt;/p&gt;
&lt;p&gt;Lors de l’exécution d’une commande bash, l’outil a une taille limite de retour d’une commande.
Si la limite est atteinte, il stoppe la commande et considère que le résultat est correct.
Sauf que lors d’exécuter des tests avec Maven un peu trop verbeux, finalement le résultat final n’est pas correct.
J’ai réussi à contourner le problème en ajoutant ou en diminuant les logs ou en utilisant un fichier de sortie pour limiter la sortie commande..&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Pour aller plus loin :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;a href=&quot;https://opencode.ai/&quot; class=&quot;external&quot;&gt;site officiel&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; d’opencode&lt;/li&gt;
&lt;li&gt;un article sur &lt;a href=&quot;https://www.sfeir.dev/ia/opencode/&quot; class=&quot;external&quot;&gt;Sfeir.dev&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Configuration des secrets dans Kubernetes avec sealed secrets</title>
    <link>https://dralagen.fr/K8s/Configuration-des-secrets-dans-Kubernetes-avec-sealed-secrets</link>
    <guid>https://dralagen.fr/K8s/Configuration-des-secrets-dans-Kubernetes-avec-sealed-secrets</guid>
    <description><![CDATA[ &lt;p&gt;Utilisation de l’outil &lt;a href=&quot;https://github.com/bitnami-labs/sealed-secrets&quot; class=&quot;external&quot;&gt;sealed-secrets&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; de Bitnami. L’objectif est de pouvoir commit un secret sans le compromettre.&lt;/p&gt;
&lt;p&gt;Exemple de secret :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;yaml&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; v1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; Secret&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; mysecret&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  namespace&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; mynamespace&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  foo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; YmFy&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-style:italic;--shiki-dark:#616E88;--shiki-dark-font-style:inherit&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-light-font-style:italic;--shiki-dark:#616E88;--shiki-dark-font-style:inherit&quot;&gt; &amp;#x3C;- base64 encoded &quot;bar&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Après conversion :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;yaml&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;apiVersion&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; bitnami.com/v1alpha1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; SealedSecret&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; mysecret&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  namespace&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; mynamespace&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;spec&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  encryptedData&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;    foo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq.....&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h1 id=&quot;pré-requis&quot;&gt;pré-requis&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#pré-requis&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Avoir d’installer &lt;code&gt;kubeseal&lt;/code&gt; et d’avoir un accès au cluster cible qui a sealed secrets d’installé.&lt;/p&gt;
&lt;h1 id=&quot;usage&quot;&gt;Usage&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#usage&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Transforme un secret en secret sealed :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;kubeseal&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; my-secret.yaml&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -w&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; my-secret-sealed.yaml&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Mise en place de Server-Sent Events</title>
    <link>https://dralagen.fr/Mise-en-place-de-Server-Sent-Events</link>
    <guid>https://dralagen.fr/Mise-en-place-de-Server-Sent-Events</guid>
    <description><![CDATA[ &lt;p&gt;Après s’être posé la question de &lt;a href=&quot;./Communication-du-Back-vers-le-Front-par-notification&quot; class=&quot;internal alias&quot; data-slug=&quot;Communication-du-Back-vers-le-Front-par-notification&quot;&gt;comment notifier le front de la fin d’un traitement back&lt;/a&gt;, j’ai décidé de réaliser un proof of concept (POC) pour mieux comprendre le fonctionnement et les difficulté à mettre en oeuvre une communication Server-Sent Events (SSE).&lt;/p&gt;
&lt;h1 id=&quot;scénario&quot;&gt;Scénario&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#scénario&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Pour que le POC soit “crédible”, il nous faut deux prérequis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simuler un traitement asynchrone dans le backend&lt;/li&gt;
&lt;li&gt;Le front doit réagir à la fin du traitement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour avoir un scénario réaliste, je pars d’un front basique qui souhaite diffuser un message.
Il se trouve que, par hasard, la publication prend du temps, et que pour absorber le flux, Nous avons choisi de mettre en place une file de publication pour réaliser cette tâche en asynchrone.
À chaque publication d’un message, nous souhaitons notifier les utilisateurs.&lt;/p&gt;
&lt;pre&gt;&lt;button class=&quot;expand-button&quot; aria-label=&quot;Expand mermaid diagram&quot; data-view-component&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 16 16&quot; fill=&quot;currentColor&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M3.72 3.72a.75.75 0 011.06 1.06L2.56 7h10.88l-2.22-2.22a.75.75 0 011.06-1.06l3.5 3.5a.75.75 0 010 1.06l-3.5 3.5a.75.75 0 11-1.06-1.06l2.22-2.22H2.56l2.22 2.22a.75.75 0 11-1.06 1.06l-3.5-3.5a.75.75 0 010-1.06l3.5-3.5z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/button&gt;&lt;code class=&quot;mermaid&quot; data-clipboard=&quot;&amp;#x22;sequenceDiagram\n    participant Frontend\n    participant API \n    participant Service as PublicationService\n\n    Frontend-&gt;&gt;API: S&amp;#x27;abonne aux notifications\n    Frontend-&gt;&gt;API: Publie un message\n    API-)Service: Lance le traitement\n    API--&gt;&gt;Frontend: Accusé de réception\n    Note over Frontend: Clear du formulaire\n    Note over Service: Traitement long\n    Service-)API: Traitement terminé\n    API-)Frontend: Notification SSE de traitement réussi\n    Note over Frontend: Réception et affichage du message&amp;#x22;&quot;&gt;sequenceDiagram
    participant Frontend
    participant API 
    participant Service as PublicationService

    Frontend-&gt;&gt;API: S&#039;abonne aux notifications
    Frontend-&gt;&gt;API: Publie un message
    API-)Service: Lance le traitement
    API--&gt;&gt;Frontend: Accusé de réception
    Note over Frontend: Clear du formulaire
    Note over Service: Traitement long
    Service-)API: Traitement terminé
    API-)Frontend: Notification SSE de traitement réussi
    Note over Frontend: Réception et affichage du message
&lt;/code&gt;&lt;div id=&quot;mermaid-container&quot; role=&quot;dialog&quot;&gt;&lt;div id=&quot;mermaid-space&quot;&gt;&lt;div class=&quot;mermaid-content&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h1 id=&quot;étapes-de-réalisation&quot;&gt;Étapes de réalisation&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#étapes-de-réalisation&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;backend&quot;&gt;Backend&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#backend&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;initialisation&quot;&gt;Initialisation&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#initialisation&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;En tant que développeur backend, je suis naturellement parti vers le composant back.
L’initialisation à partir de &lt;a href=&quot;https://start.spring.io/&quot; class=&quot;external&quot;&gt;Spring Initalizr&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;, et c’est parti pour la génération, Spring boot 3.4, Java 21 (dernière LTS), Maven (déjà configuré).
Nous ajoutons quelques modules pour se simplifier la vie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spring Web&lt;/strong&gt;, pour exposer les services&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Modulith&lt;/strong&gt;, pour tester l’architecture Hexagonal et le ApplicationEvent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Data JDBC&lt;/strong&gt;, pour gérer les notifications transactionnelles générées par Spring Modulith&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H2 Database&lt;/strong&gt;, pour avoir une base embarqué rapide à initialiser&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Boot DevTools&lt;/strong&gt;, permet d’avoir du LiveReload&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lombok&lt;/strong&gt;, injection de logger, finalement utilisation des records limite son usage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Configuration Processor&lt;/strong&gt;, pour améliorer la compatibilité de la configuration YAML&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;callout warning&quot; data-callout=&quot;warning&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
                  &lt;div class=&quot;callout-icon&quot;&gt;&lt;/div&gt;
                  &lt;div class=&quot;callout-title-inner&quot;&gt;&lt;p&gt;disclaimer &lt;/p&gt;&lt;/div&gt;
                  
                &lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;
&lt;p&gt;Je fais l’impasse sur la sécurité pour simplifier la configuration, car l’objectif n’est pas de déployer l’application.
Certaines dépendances sont discutables, la gestion “transactionnelle” des notifications interne avec une reprise en cas de redémarre n’a pas vraiment de sens avec une base de données in-memory.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;définition-de-lapi&quot;&gt;Définition de l’API&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#définition-de-lapi&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;J’ai besoin de deux endpoints : un premier pour envoyer un message, rien de compliqué avec Spring MVC, une classe Controller, l’annotation &lt;code&gt;@RestController&lt;/code&gt; et une méthode recevant du POST avec l’annotation &lt;code&gt;@PostMapping&lt;/code&gt;&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;RestController&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt; MessageController&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;PostMapping&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;/message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;ResponseStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;HttpStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;CREATED&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;	public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; sendMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;RequestBody&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; MessageDto&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;		return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;UUID&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;randomUUID&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;channel&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; LocalDateTime&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Le deuxième endpoint pour la souscription aux événements de message.
SSE se base sur le protocole HTTP, Spring nous fournit une classe &lt;a href=&quot;https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.html&quot; class=&quot;external&quot;&gt;&lt;code&gt;SseEmitter&lt;/code&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; qui spécialise ResponseBodyEmitter pour faire du SSE.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;GetMapping&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;/message/event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; subscribeMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; throws IOException &lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;    SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-style:italic;--shiki-dark:#616E88;--shiki-dark-font-style:inherit&quot;&gt;	//&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-light-font-style:italic;--shiki-dark:#616E88;--shiki-dark-font-style:inherit&quot;&gt; code pour émettre une notification&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;lancer-le-traitement-du-message&quot;&gt;Lancer le traitement du message&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#lancer-le-traitement-du-message&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Lors de la réception d’un message, le contrôleur va créer un événement pour lancer le traitement.
Puis répond au client que son message qu’il a reçu son message et qu’il va être traité.&lt;/p&gt;
&lt;p&gt;Pour émettre un événement dans Spring, il suffit de publier dans &lt;code&gt;ApplicationEventPublisher&lt;/code&gt;:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; ApplicationEventPublisher&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; events&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;PostMapping&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;ResponseStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;HttpStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;CREATED&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;Transactional&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; sendMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;RequestBody&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; MessageDto&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;    CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;UUID&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;randomUUID&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;channel&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(),&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; LocalDateTime&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    events&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;publishEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Nous remarquerons la présence de &lt;code&gt;@Transctional&lt;/code&gt; pour gérer la publication du message dans le cadre d’une notification “transactional” proposée par &lt;a href=&quot;https://docs.spring.io/spring-modulith/reference/events.html&quot; class=&quot;external&quot;&gt;Spring Modulith&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour la réception de l’événement de “création de message”, j’ai choisi d’utiliser le listener fourni par Spring Modulith &lt;code&gt;@ApplicationModuleListener&lt;/code&gt;.
Cette annotation est un raccourci de plusieurs annotations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Async&lt;/code&gt;, qui permet d’ajouter de l’asynchrone dans notre traitement&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Transactional(propagation = Propagation.REQUIRES_NEW)&lt;/code&gt;, ouvre une nouvelle transaction pour ne pas perturber la transaction d’origine&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@TransactionalEventListener&lt;/code&gt;, qui surcharge &lt;code&gt;@EventListener&lt;/code&gt; qui crée le endpoint de l’événement
Et voilà notre méthode pour recevoir un événement de type &lt;code&gt;CreatedMessageEvent&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;ApplicationModuleListener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; publishMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; messageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-light-font-style:italic;--shiki-dark:#616E88;--shiki-dark-font-style:inherit&quot;&gt;	//&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-light-font-style:italic;--shiki-dark:#616E88;--shiki-dark-font-style:inherit&quot;&gt; Traitement de l&#039;event&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Nous avons besoin d’une base de données pour stocker les événements générés par l’application. J’ai choisi une base H2 pour simplifier la configuration et le lancement de l’application.
Et maintenant, nous pouvons spécifier dans le fichier &lt;code&gt;application.yml&lt;/code&gt; notre configuration :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;yaml&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;spring&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  datasource&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;    url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; jdbc:h2:mem:messasync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;    driverClassName&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; org.h2.Driver&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;  modulith.events.jdbc.schema-initialization.enabled&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#81A1C1&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;notifier-le-front&quot;&gt;Notifier le front&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#notifier-le-front&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Le front s’abonne au notification via le endpoint défini, et lorsque nous avons traité notre message, nous publions un événement à tous les fronts qui le souhaite.
Nous pouvons voir l’utilisation d’un pattern Observer sera adapté.
Pour le créer, nous ajoutons une liste d’observateurs dans notre service de publication.
Nous utilisons une liste concurrente pour ne pas avoir de conflit :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; final&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; CopyOnWriteArrayList&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&amp;#x3C;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Une méthode pour souscrire au événement, cette méthode sera appelée après la création du &lt;code&gt;SseEmitter&lt;/code&gt;:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; subscribe&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;onCompletion&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; -&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;        observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;        log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;Removed completed sseEmitter {}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    })&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;onTimeout&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; -&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;        observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;        log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;Removed timeout sseEmitter {}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    })&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;onError&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt; -&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;        observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;        log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;remove error sseEmitter {}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    })&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Lors de la souscription, nous ajoutons les méthodes de nettoyage lorsque la requête http est fermée.&lt;/p&gt;
&lt;p&gt;Et dans la méthode de publication de message, nous allons notifier tous nos observers du nouveau message :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;ApplicationModuleListener&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; publishMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;CreatedMessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt; messageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;    MessageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; messageProcessingService&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;processMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;convertEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;messageEvent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter &lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;        try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;            sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;valueOf&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;createdMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;                .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;message&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; MediaType&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;APPLICATION_JSON&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;Exception&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;            sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;completeWithError&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    })&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;frontend&quot;&gt;Frontend&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#frontend&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Côté Frontend, je vais rester succinct : pour lire les événements envoyés par le backend, nous pouvons utiliser l’interface &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/EventSource&quot; class=&quot;external&quot;&gt;EventSource&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; malgré ses limites sur le nombre de connexions simultanées en HTTP/1.1, cette interface est déjà très puissante.&lt;/p&gt;
&lt;p&gt;Pour fonctionner avec une application Angular, nous encapsulons cette &lt;code&gt;EventSource&lt;/code&gt; dans un &lt;code&gt;Observable&lt;/code&gt;.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;typescript&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt; MessageService&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;	listenMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt; Observable&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;MessageResponse&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;	  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; Observable&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt;MessageResponse&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;observer&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;	      const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; eventSource&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; EventSource&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;http://localhost:8080/message/event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;	      eventSource&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;createdMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;	        let&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; createdMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; JSON&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;parse&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#8FBCBB&quot;&gt; MessageResponse&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;	  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;	        observer&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;createdMessage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	      }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;	  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;	      eventSource&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;onerror&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;	        console&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;Received error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	      }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;	      return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; ()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;	        eventSource&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	      }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	    }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;	  )  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Lorsque le composant doit écouter des événements, il appelle le service &lt;code&gt;listenMessage&lt;/code&gt;, qui retourne un &lt;code&gt;Observable&lt;/code&gt;.
Si nous ne souhaitons plus écouter les événements ou si le composant est détruit, nous marquons l’&lt;code&gt;Observable&lt;/code&gt; comme complété, ce qui déclenche la fermeture de l’&lt;code&gt;EventSource&lt;/code&gt; et clôt ainsi la connexion entre le frontend et le backend.&lt;/p&gt;
&lt;p&gt;Dans notre cas, nous ne faisons rien en cas d’erreur pour ne pas arrêter l’&lt;code&gt;Observable&lt;/code&gt;.
Il serait intéressant d’émettre un message d’erreur pour informer l’utilisateur du problème.&lt;/p&gt;
&lt;p&gt;En cas d’interruption, comme une coupure réseau, un redémarrage de l’application ou un timeout, &lt;code&gt;EventSource&lt;/code&gt; se charge de rouvrir la connexion.&lt;/p&gt;
&lt;h2 id=&quot;problèmes-rencontrés&quot;&gt;Problèmes rencontrés&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#problèmes-rencontrés&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;erreur-503&quot;&gt;Erreur 503&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#erreur-503&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pas défaut, &lt;code&gt;SseEmitter&lt;/code&gt; configure son timeout à 30 secondes, et quand je n’envoie pas de message, je reçois aucune données.
Et l’interprétation HTTP quand aucune données n’a été envoyée est une réponse 503:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;Json&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;Json&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  &quot;timestamp&quot;: &quot;2025-04-18T13:22:02.325+00:00&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  &quot;status&quot;: 503,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  &quot;error&quot;: &quot;Service Unavailable&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  &quot;message&quot;: &quot;No message available&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  &quot;path&quot;: &quot;/message/event&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Et cette réponse 503 interrompt la re-connexion de l’&lt;code&gt;EventSource&lt;/code&gt; et finalement, quand nous décidons d’envoyer un message, nous ne recevrons pas la réponse.&lt;/p&gt;
&lt;p&gt;La première astuce est d’envoyer un premier événement pour signifier que le backend est en vie.
Pour ça, j’emmet un message de type &lt;code&gt;heartbeat&lt;/code&gt; pour mieux identifier les messages de “ping” des messages qui contient de la vraie donnée.
J’ai donc ajouté cette ligne dans la méthode &lt;code&gt;subscribeMessageEvent&lt;/code&gt; de mon controller&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;heartbeat&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Nous aurions pu imaginer aussi envoyer les précédents messages pour servir de “rattrapage”. Mais l’architecture actuelle mémorise aucun message.&lt;/p&gt;
&lt;h3 id=&quot;vérification-des-observers&quot;&gt;Vérification des observers&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#vérification-des-observers&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pour éviter de ré-ouvrir la connexion tous les 30 secondes, &lt;code&gt;SseEmitter&lt;/code&gt; accepte de personnaliser le timeout lors de la phase d’initialisation.
Dans la méthode &lt;code&gt;subscribeMessageEvent&lt;/code&gt; de mon controller, j’ai ajouté un timeout de 10 minutes.
Seulement en 10 minutes, nous pouvons cumuler beaucoup de connexion qui ne sont plus en vie.
Et tant que nous n’envions pas de message, il n’y a pas de ménage réalisé.&lt;/p&gt;
&lt;p&gt;Donc il faudrait faire du ménage de temps en temps pour enlever les connexions fantômes, et limiter le nombre d’erreur lors de la publication d’un message.
Pour faire ça, j’ai ajouté une tâche planifier toutes les 30 secondes qui envoie un “ping” à chaque observer.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;java&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D08770&quot;&gt;Scheduled&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D8DEE9&quot;&gt;fixedDelay&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#D8DEE9&quot;&gt; timeUnit&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; TimeUnit&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;SECONDS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; heartbeat&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;    observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter &lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;-&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;        try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;            sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;SseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;heartbeat&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;IOException&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;            sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;completeWithError&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#8FBCBB&quot;&gt;IllegalStateException&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;            log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;emitter already closed&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;            observers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;sseEmitter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;    })&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Cette option est discutable, ça ajoute du bruit sur le réseau et du traitement à intervalle régulier qui n’est pas nécessaire.
Cette ajout permettrait de supprimer le 1er ping à l’ouverture de la connexion.&lt;/p&gt;
&lt;h1 id=&quot;évolution&quot;&gt;Évolution&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#évolution&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ajouter un filtre dans la souscription pour recevoir que les messages que d’un canal spécifique parmi un liste définie.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Sources :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dralagen/MessAsync&quot; class=&quot;external&quot;&gt;dépôt GitHub&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Script d&#039;ajout des certificats racines dans le keystore de java</title>
    <link>https://dralagen.fr/Programmation/Script-d'ajout-des-certificats-racines-dans-le-keystore-de-java</link>
    <guid>https://dralagen.fr/Programmation/Script-d'ajout-des-certificats-racines-dans-le-keystore-de-java</guid>
    <description><![CDATA[ &lt;p&gt;Pour réaliser des appels à des partenaires ou valider une authentification, une application Java réalise des appels HTTP.
Ces appels doivent être sécurisés en utilisant le HTTPS et l’application vérifie que le certificat est valide.
Pour valider le certificat, nous avons besoin d’ajouter les certificats racines dans le keystore.&lt;/p&gt;
&lt;p&gt;La première étape est d’extraire les certificats racine et intermédiaires à partir d’une URL. On télécharge la chaîne de certificats à partir de &lt;code&gt;openssl&lt;/code&gt; puis on l’extrait pour le mettre dans un fichier spécifique.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#B4637A;--shiki-light-font-style:italic;--shiki-dark:#88C0D0;--shiki-dark-font-style:inherit&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt; openssl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; s_client&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -showcerts&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -connect&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt; ${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;HOSTNAME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#EBCB8B&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;   awk&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/{print $0; if (/END CERTIFICATE/) print &quot;&quot;}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$CHAIN_FILE&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;csplit&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; cert-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$CHAIN_FILE&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;/END CERTIFICATE/+1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Récupération du nom du certificat pour l’injecter dans le keystore.
Pour ce faire, on récupère le CN présent dans le certificat.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;openssl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; x509&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -in&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$cert_file&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -noout&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -subject -nameopt&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; RFC2253&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; 2&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;/dev/null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#EBCB8B&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;         sed&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;s/.*CN=\([^,]*\).*/\1/p&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Une fois les informations récupérées, on injecte dans le keystore de Java avec &lt;a href=&quot;../tools/Keytool&quot; class=&quot;internal&quot; data-slug=&quot;tools/Keytool&quot;&gt;Keytool&lt;/a&gt;:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;keytool&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -importcert&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -trustcacerts&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -cacerts&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -storepass&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$keystore_password&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -alias&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$alias_name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -file&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;$cert_file&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -noprompt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;blockquote class=&quot;callout warning&quot; data-callout=&quot;warning&quot;&gt;
&lt;div class=&quot;callout-title&quot;&gt;
                  &lt;div class=&quot;callout-icon&quot;&gt;&lt;/div&gt;
                  &lt;div class=&quot;callout-title-inner&quot;&gt;&lt;p&gt;Compatible Java 9+ &lt;/p&gt;&lt;/div&gt;
                  
                &lt;/div&gt;
&lt;div class=&quot;callout-content&quot;&gt;
&lt;p&gt;On utilise l’option &lt;code&gt;-cacerts&lt;/code&gt; pour définir l’emplacement du cacerts de Java, qui a été introduite en version 9.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le script complet est présent sur &lt;a href=&quot;https://github.com/dralagen/config-linux/blob/master/scripts/intall-certificat-into-java&quot; class=&quot;external&quot;&gt;GitHub&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Tomcat - Ajout de configuration dans les properties</title>
    <link>https://dralagen.fr/Programmation/Tomcat---Ajout-de-configuration-dans-les-properties</link>
    <guid>https://dralagen.fr/Programmation/Tomcat---Ajout-de-configuration-dans-les-properties</guid>
    <description><![CDATA[ &lt;p&gt;Pour ajouter un répertoire de configuration dans le classpath de tomcat. On peut ajouter cette argument dans le options JVM :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-Xbootclasspath/a:/my/conf/directory
&lt;/code&gt;&lt;/pre&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Bookmarklet coloration Ansi</title>
    <link>https://dralagen.fr/tools/Bookmarklet-coloration-Ansi</link>
    <guid>https://dralagen.fr/tools/Bookmarklet-coloration-Ansi</guid>
    <description><![CDATA[ &lt;p&gt;Il arrive d’avoir dans notre navigateur des sorties console brut, ceux-ci peuvent utiliser des codes couleurs ANSI &lt;code&gt;\u001b[XXm&lt;/code&gt;, où &lt;code&gt;XX&lt;/code&gt; correspond a une effet sur le texte.
Le style est plutôt bien gérer dans un terminal mais pas gérer dans un navigateur.&lt;/p&gt;
&lt;p&gt;Avec un peut code Javascript, on peut remplacer les codes par des balises HTML.&lt;/p&gt;
&lt;p&gt;Pour l’utiliser, il suffit de l’ajouter en marque-pages, et de cliquer dessus pour faire apparaître les couleurs.&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;javascript&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#D8DEE9FF&quot;&gt;javascript&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; ()&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;  var&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    0&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;/span&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    30&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #000&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    31&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #A00&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    32&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #0A0&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    33&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #A50&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    34&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #00A&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    35&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #A0A&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    36&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #0AA&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    37&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;span style=&#039;color: #AAA&#039;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt;    39&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;&amp;#x3C;/span&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&#039;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;  document&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; document&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#EBCB8B&quot;&gt;\u001b\[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#EBCB8B&quot;&gt;0-9;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#EBCB8B&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; k&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; map&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;k&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &#039;&#039;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;  document&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;backgroundColor&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;#000&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;  document&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;style&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#ECEFF4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#81A1C1&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;#AAA&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#ECEFF4&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;())&lt;/span&gt;&lt;span style=&quot;--shiki-light:#797593;--shiki-dark:#81A1C1&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Client HTTP REST</title>
    <link>https://dralagen.fr/tools/Client-HTTP-REST</link>
    <guid>https://dralagen.fr/tools/Client-HTTP-REST</guid>
    <description><![CDATA[ &lt;p&gt;Pour remplacer Postman, certaines extensions VS Code ont développé une alternative vers un format texte proche de la spécification HTTP (RFC 2616) pour décrire les requêtes.&lt;/p&gt;
&lt;p&gt;JetBrains a lui aussi le support des fichiers &lt;code&gt;.http&lt;/code&gt; pour ajouter un client REST dans son IDE.&lt;/p&gt;
&lt;h1 id=&quot;points-fort&quot;&gt;Points fort&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#points-fort&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;le fichier est lisible.&lt;/li&gt;
&lt;li&gt;c’est du texte, donc il peut être versionné sous git par exemple.&lt;/li&gt;
&lt;li&gt;plusieurs extensions utilisent les fichiers .env pour injecter des variables, comme une authentification ou de définir un ensemble d’URL de service.&lt;/li&gt;
&lt;li&gt;peut-être utilisé pour de la documentation.&lt;/li&gt;
&lt;li&gt;peut servir pour générer des scénarios de tests.&lt;/li&gt;
&lt;li&gt;gère du gRPC, GraphQL, SSE, Web Socket, MQTT et AMQP.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;points-négatif&quot;&gt;Points négatif&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#points-négatif&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;un fichier texte proche des spécifications HTTP est moins user-friendly pour des non-techs.&lt;/li&gt;
&lt;li&gt;le support des scripts est dépendant de l’extension, par exemple httpyac support la syntaxe de JetBrains mais pas l’inverse.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;la-mise-en-place&quot;&gt;La mise en place&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#la-mise-en-place&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Pour des requêtes simples, JetBrains suffit.
Si on veut aller plus loin dans la création de scénarios, l’ajout d’authentification, j’aime bien le plugin &lt;a href=&quot;https://httpyac.github.io/&quot; class=&quot;external&quot;&gt;httpyac&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt; qui peut même être utilisé dans une CI.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Sources :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://httpyac.github.io/&quot; class=&quot;external&quot;&gt;https://httpyac.github.io/&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html&quot; class=&quot;external&quot;&gt;https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loud-technology.com/blog/fichiers-http-tester-apis-editeur/&quot; class=&quot;external&quot;&gt;https://loud-technology.com/blog/fichiers-http-tester-apis-editeur/&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>mkcert - SSL pour du local</title>
    <link>https://dralagen.fr/tools/mkcert---SSL-pour-du-local</link>
    <guid>https://dralagen.fr/tools/mkcert---SSL-pour-du-local</guid>
    <description><![CDATA[ &lt;p&gt;L’outil &lt;code&gt;mkcert&lt;/code&gt; permet de générer des certificats SSL pour un environnement local en seulement quelques lignes de commande.&lt;/p&gt;
&lt;p&gt;Je passe l’installation de l’outil en lui même dépendant du système comme Linux ou macOS.&lt;/p&gt;
&lt;p&gt;La première étape, installer le certificat racine dans les truststores système et navigateur pour valider le certificat en local :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;mkcert&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Puis on peut générer un certificat pour du local :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;mkcert&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;local.mygroup.fr&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; localhost&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#B48EAD&quot;&gt; 127.0.0.1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; ::1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Il est possible d’utiliser l’option &lt;code&gt;-pkcs12&lt;/code&gt; pour créer un keystore utilisable par Java.
Si on l’a oublié, il est possible de construire ce keystore avec la commande :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;openssl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; pkcs12&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -inkey&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; localhost-key.pem&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -in&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; localhost.pem&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -out&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; localhost.pfx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Il est possible d’ajouter un connecteur Tomcat pour exécuter Tomcat en HTTPS sans erreur de certificat :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;xml&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;xml&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#81A1C1&quot;&gt;Connector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#8FBCBB;--shiki-dark-font-style:inherit&quot;&gt; port&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;8443&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#8FBCBB;--shiki-dark-font-style:inherit&quot;&gt; protocol&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;org.apache.coyote.http11.Http11NioProtocol&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#8FBCBB;--shiki-dark-font-style:inherit&quot;&gt;               maxThreads&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#8FBCBB;--shiki-dark-font-style:inherit&quot;&gt; SSLEnabled&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;        &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#81A1C1&quot;&gt;SSLHostConfig&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#81A1C1&quot;&gt;Certificate&lt;/span&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#8FBCBB;--shiki-dark-font-style:inherit&quot;&gt; certificateKeystoreFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;conf/local.mygroup.fr+3.p12&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#907AA9;--shiki-light-font-style:italic;--shiki-dark:#8FBCBB;--shiki-dark-font-style:inherit&quot;&gt;                         type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-dark:#D8DEE9FF&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt;RSA&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#ECEFF4&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt; /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;        &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#81A1C1&quot;&gt;SSLHostConfig&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;    &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#56949F;--shiki-dark:#81A1C1&quot;&gt;Connector&lt;/span&gt;&lt;span style=&quot;--shiki-light:#9893A5;--shiki-dark:#81A1C1&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;Sources :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/FiloSottile/mkcert&quot; class=&quot;external&quot;&gt;https://github.com/FiloSottile/mkcert&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stephane-robert.info/post/homelab-certificats-https-ssl-mkcert/&quot; class=&quot;external&quot;&gt;https://blog.stephane-robert.info/post/homelab-certificats-https-ssl-mkcert/&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Wed, 07 Jan 2026 10:26:06 GMT</pubDate>
  </item><item>
    <title>Docker privilege escalation</title>
    <link>https://dralagen.fr/Docker/Docker-privilege-escalation</link>
    <guid>https://dralagen.fr/Docker/Docker-privilege-escalation</guid>
    <description><![CDATA[ &lt;h1 id=&quot;les-dangers-du-groupe-docker&quot;&gt;Les dangers du groupe docker&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#les-dangers-du-groupe-docker&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Si un utilisateur a le groupe docker alors il a tous les droits sur la machine.
il peut utiliser un container du genre alpine ou ubuntu pour remonter le système en mode root&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --rm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -it&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; root&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --privileged&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -v&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; /:/mnt&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -v&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; /var:/mnt/var&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; -v&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; /home/:/mnt/home&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; ubuntu:22.04&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; chroot&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; /mnt&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; /bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.creekorful.org/2020/08/docker-privilege-escalation/&quot; class=&quot;external&quot;&gt;https://blog.creekorful.org/2020/08/docker-privilege-escalation/&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Tue, 29 Apr 2025 21:42:23 GMT</pubDate>
  </item><item>
    <title>Génération d&#039;une nouvelle clé GPG</title>
    <link>https://dralagen.fr/GPG/G%C3%A9n%C3%A9ration-d'une-nouvelle-cl%C3%A9-GPG</link>
    <guid>https://dralagen.fr/GPG/G%C3%A9n%C3%A9ration-d'une-nouvelle-cl%C3%A9-GPG</guid>
    <description><![CDATA[ &lt;p&gt;Si vous utilisez la version 2.1.17 ou une version ultérieure&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;gpg&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --full-generate-key&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Possible de customiser l’algo :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;gpg&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --default-new-key-algo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; rsa4096&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --gen-key&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;Lié:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;../GPG/Vérification-des-clés-GPG-existantes&quot; class=&quot;internal alias&quot; data-slug=&quot;GPG/Vérification-des-clés-GPG-existantes&quot;&gt;Vérification des clés GPG existantes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/fr/authentication/managing-commit-signature-verification/generating-a-new-gpg-key&quot; class=&quot;external&quot;&gt;https://docs.github.com/fr/authentication/managing-commit-signature-verification/generating-a-new-gpg-key&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Tue, 29 Apr 2025 21:42:23 GMT</pubDate>
  </item><item>
    <title>Récupération de la clé publique</title>
    <link>https://dralagen.fr/GPG/R%C3%A9cup%C3%A9ration-de-la-cl%C3%A9-publique</link>
    <guid>https://dralagen.fr/GPG/R%C3%A9cup%C3%A9ration-de-la-cl%C3%A9-publique</guid>
    <description><![CDATA[ &lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;gpg&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --armor&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; ID&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/fr/authentication/managing-commit-signature-verification/checking-for-existing-gpg-keys&quot; class=&quot;external&quot;&gt;https://docs.github.com/fr/authentication/managing-commit-signature-verification/checking-for-existing-gpg-keys&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Tue, 29 Apr 2025 21:42:23 GMT</pubDate>
  </item><item>
    <title>Vérification des clés GPG existantes</title>
    <link>https://dralagen.fr/GPG/V%C3%A9rification-des-cl%C3%A9s-GPG-existantes</link>
    <guid>https://dralagen.fr/GPG/V%C3%A9rification-des-cl%C3%A9s-GPG-existantes</guid>
    <description><![CDATA[ &lt;h1 id=&quot;liste-les-clés-existantes&quot;&gt;Liste les clés existantes&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#liste-les-clés-existantes&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;gpg&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --list-secret-keys&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --keyid-format=long&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Possible de faire de la récupération de clé publique : &lt;a href=&quot;../GPG/Récupération-de-la-clé-publique&quot; class=&quot;internal alias&quot; data-slug=&quot;GPG/Récupération-de-la-clé-publique&quot;&gt;Récupération de la clé publique&lt;/a&gt;
ou de régénérer une nouvelle clé &lt;a href=&quot;../GPG/Génération-d&amp;#x27;une-nouvelle-clé-GPG&quot; class=&quot;internal alias&quot; data-slug=&quot;GPG/Génération-d&amp;#x27;une-nouvelle-clé-GPG&quot;&gt;Génération d’une nouvelle clé GPG&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/fr/v2/Utilitaires-Git-Signer-votre-travail&quot; class=&quot;external&quot;&gt;https://git-scm.com/book/fr/v2/Utilitaires-Git-Signer-votre-travail&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/fr/authentication/managing-commit-signature-verification/checking-for-existing-gpg-keys&quot; class=&quot;external&quot;&gt;https://docs.github.com/fr/authentication/managing-commit-signature-verification/checking-for-existing-gpg-keys&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Tue, 29 Apr 2025 21:42:23 GMT</pubDate>
  </item><item>
    <title>Git - delete branch</title>
    <link>https://dralagen.fr/Git/Git---delete-branch</link>
    <guid>https://dralagen.fr/Git/Git---delete-branch</guid>
    <description><![CDATA[ &lt;p&gt;Suppression des branches en local :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;Shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;Shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;git branch -d maBranche&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Suppression des branches en remote :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;Shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;Shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;git push origin --delete maBranche&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Accepte d’avoir plusieurs branches en une seule commande&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/en/v2/Git-Branching-Branch-Management&quot; class=&quot;external&quot;&gt;https://git-scm.com/book/en/v2/Git-Branching-Branch-Management&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-branch&quot; class=&quot;external&quot;&gt;https://git-scm.com/docs/git-branch&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Tue, 29 Apr 2025 21:42:23 GMT</pubDate>
  </item><item>
    <title>Git - rebase branche to change base branch</title>
    <link>https://dralagen.fr/Git/Git---rebase-branche-to-change-base-branch</link>
    <guid>https://dralagen.fr/Git/Git---rebase-branche-to-change-base-branch</guid>
    <description><![CDATA[ &lt;p&gt;Git permet de réécrire l’historique avec un rebase de déplacer une branche vers une autre. Ce cas d’usage peut être utile pour déplacer une feature d’une branche de support vers une autre version à cause d’un changement de périmètre.&lt;/p&gt;
&lt;p&gt;Ce changement peut se réaliser en une simple ligne de command :&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;rose-pine-dawn nord&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D7827E;--shiki-dark:#88C0D0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA9D34;--shiki-dark:#A3BE8C&quot;&gt; rebase&lt;/span&gt;&lt;span style=&quot;--shiki-light:#286983;--shiki-dark:#A3BE8C&quot;&gt; --onto&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; $targetBranch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; $fromBranch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#575279;--shiki-light-font-style:italic;--shiki-dark:#D8DEE9;--shiki-dark-font-style:inherit&quot;&gt; $featureBranch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$targetBranch&lt;/code&gt; : la branche de destination sur lequel les commits seront rejoués&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$fromBranch&lt;/code&gt; : la branche de base des commits à rejouer, les commits de cette branche seront exclus&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$featureBranch&lt;/code&gt; : la branche contenant les commits qui vont être rejoués&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/fr/v2/Les-branches-avec-Git-Rebaser-Rebasing&quot; class=&quot;external&quot;&gt;https://git-scm.com/book/fr/v2/Les-branches-avec-Git-Rebaser-Rebasing&lt;svg aria-hidden=&quot;true&quot; class=&quot;external-icon&quot; style=&quot;max-width:0.8em;max-height:0.8em&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M320 0H288V64h32 82.7L201.4 265.4 178.7 288 224 333.3l22.6-22.6L448 109.3V192v32h64V192 32 0H480 320zM32 32H0V64 480v32H32 456h32V480 352 320H424v32 96H64V96h96 32V32H160 32z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; ]]></description>
    <pubDate>Tue, 29 Apr 2025 21:42:23 GMT</pubDate>
  </item>
    </channel>
  </rss>