<rss version="2.0">
  <channel>
    <title>Coding on rMdes - a place to write and think freely</title>
    <link>https://blog.rmendes.net/categories/coding/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Fri, 16 Jan 2026 17:44:00 +0100</lastBuildDate>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2026/01/16/revamped-my-domain-name-site.html</link>
      <pubDate>Fri, 16 Jan 2026 17:44:00 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2026/01/16/revamped-my-domain-name-site.html</guid>
      <description>&lt;p&gt;Revamped my domain name site &lt;a href=&#34;https://rmendes.net&#34;&gt;rmendes.net&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;plan to use it like a live CV showcasing work related stuff&lt;/li&gt;
&lt;li&gt;couldn&amp;rsquo;t resist to play with the code and implement #indieweb using #go existing libraries&lt;/li&gt;
&lt;li&gt;also has webmentions support, feel free to test :)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2025/12/29/so-i-have-been-busy.html</link>
      <pubDate>Mon, 29 Dec 2025 20:21:08 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/12/29/so-i-have-been-busy.html</guid>
      <description>&lt;p&gt;So &amp;hellip; I have been busy contributing to &lt;a href=&#34;http://v2.osintukraine.com&#34;&gt;this&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;tldr: real-time #telegram archive of the Russian War against Ukraine.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s 100% built with Claude Code in a bit more than 2 months&lt;/p&gt;
&lt;p&gt;it&amp;rsquo;s near 200.000 lines of #python code, without counting with &lt;a href=&#34;https://v2.osintukraine.com/platform-docs&#34;&gt;documentation&lt;/a&gt; of course.&lt;/p&gt;
&lt;p&gt;check it out !&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2025/09/18/ever-needed-to-duplicate-a.html</link>
      <pubDate>Thu, 18 Sep 2025 10:46:09 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/09/18/ever-needed-to-duplicate-a.html</guid>
      <description>&lt;p&gt;Ever needed to duplicate a #keycloak realm.json, change a few values and re-import into the same keycloak ?
this is a &lt;a href=&#34;https://github.com/rmdes/realm-duplicator-keycloak&#34;&gt;Keycloak&lt;/a&gt; realm rekeying utility, safe UUID regeneration and alias normalization to avoid duplicate constraints during import&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to use SDKMAN with MobaXterm on Win11</title>
      <link>https://blog.rmendes.net/2025/07/11/how-to-use-sdkman-with.html</link>
      <pubDate>Fri, 11 Jul 2025 15:17:18 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/07/11/how-to-use-sdkman-with.html</guid>
      <description>&lt;h1 id=&#34;prerequisites--mobas-built-in-cygwin-has-apt-cyg-otherwise-use-the-gui-package-manager&#34;&gt;prerequisites – Moba’s built-in Cygwin has apt-cyg; otherwise use the GUI package manager&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;apt-cyg install curl zip unzip sed
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;install-sdkman&#34;&gt;install SDKMAN!&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;curl -s &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://get.sdkman.io&amp;#34;&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;adapt-your-bashrc&#34;&gt;Adapt your .Bashrc&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# --- SDKMAN &amp;amp; MobaXterm/Cygwin compatibility shim -----------------&lt;/span&gt;

&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
  PLATFORM_FILE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman/var/platform&amp;#34;&lt;/span&gt;
  TARGET&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;windowsx64&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#75715e&#34;&gt;# refresh every shell start in case sdk selfupdate reset it&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; ! -f &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PLATFORM_FILE&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;cat &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PLATFORM_FILE&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; !&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$TARGET&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
      printf &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$TARGET&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PLATFORM_FILE&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# ------------------------------------------------------------------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;script-à-copier-dans-votre-homemobaxterm&#34;&gt;Script à copier dans votre /home/mobaxterm&lt;/h1&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ---------------------------------------------------------------------------&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# Installe Maven + les JDK majeurs (7 / 8 / 11 / 17 / 21) via SDKMAN!&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# Préférence Zulu, menu alternatif si absent.&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# À la fin, propose de choisir la version Java par défaut.&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# ---------------------------------------------------------------------------&lt;/span&gt;
set -eo pipefail               &lt;span style=&#34;color:#75715e&#34;&gt;# -u volontairement omis pour la compatibilité SDKMAN!&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 0. Prérequis ---------------------------------------------------------------&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; cmd in curl awk grep tr; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
  command -v &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$cmd&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$cmd&lt;span style=&#34;color:#e6db74&#34;&gt; is required&amp;#34;&lt;/span&gt; ; exit &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 1. SDKMAN! -----------------------------------------------------------------&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; ! -s &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman/bin/sdkman-init.sh&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Installing SDKMAN!…&amp;#34;&lt;/span&gt;
  curl -s https://get.sdkman.io | bash
&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;span style=&#34;color:#75715e&#34;&gt;# shellcheck source=/dev/null&lt;/span&gt;
source &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman/bin/sdkman-init.sh&amp;#34;&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 2. Patch platform pour MobaXterm/Cygwin ------------------------------------&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;uname -s&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; CYGWIN* &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo windowsx64 &amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman/var/platform&amp;#34;&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 3. Fonctions utilitaires ----------------------------------------------------&lt;/span&gt;
preferred_vendors&lt;span style=&#34;color:#f92672&#34;&gt;=(&lt;/span&gt;zulu tem kona librca graalce ms oracle&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;

have&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman/candidates/java/&lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

get_available_ids&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;           &lt;span style=&#34;color:#75715e&#34;&gt;# $1=major&lt;/span&gt;
  local major&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$1 vendor
  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; vendor in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;preferred_vendors[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
    sdk list java | awk -F&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;|&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;      -v maj&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;major&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;\\.&amp;#34;&lt;/span&gt; -v vend&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$vendor&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; -v dir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      {
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        for(i=1;i&amp;lt;=NF;i++) gsub(/^[ \t]+|[ \t]+$/, &amp;#34;&amp;#34;, $i)
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        version=$3; dist=$4; status=$5; id=$6
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        if(dist==vend &amp;amp;&amp;amp; version ~ &amp;#34;^&amp;#34;maj &amp;amp;&amp;amp; status!=&amp;#34;installed&amp;#34;){
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          cmd=&amp;#34;test -d \&amp;#34;&amp;#34;dir&amp;#34;/candidates/java/&amp;#34;id&amp;#34;\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;          if(system(cmd)!=0) print id
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        }
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      }&amp;#39;&lt;/span&gt; 
  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt; | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;!seen[$0]++&amp;#39;&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

install_build&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;               &lt;span style=&#34;color:#75715e&#34;&gt;# $1=identifier&lt;/span&gt;
  yes | sdk install java &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$1&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

choose_id&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;                   &lt;span style=&#34;color:#75715e&#34;&gt;# $1=major, reste=ids&lt;/span&gt;
  local major&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$1; shift; local ids&lt;span style=&#34;color:#f92672&#34;&gt;=(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$@&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; choice
  echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n--- Java &lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt; : pas de build Zulu trouvé ---&amp;#34;&lt;/span&gt;
  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sélectionnez une distribution (0 = ignorer) :&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; choice in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;ids[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $REPLY &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;~ ^&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0-9&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;+$ &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Entrez un nombre.&amp;#34;&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt; ; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $REPLY &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -n $choice &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$choice&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 4. Boucle d’installation ----------------------------------------------------&lt;/span&gt;
declare -a installed_ids        &lt;span style=&#34;color:#75715e&#34;&gt;# pour proposer le choix final&lt;/span&gt;
majors&lt;span style=&#34;color:#f92672&#34;&gt;=(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;17&lt;/span&gt; 21&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;

&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; major in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;majors[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
  &lt;span style=&#34;color:#75715e&#34;&gt;# 4a. déjà présent ?&lt;/span&gt;
  installed&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;sdk list java | awk -F&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;|&amp;#39;&lt;/span&gt; -v maj&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;major&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;\\.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    $0 ~ /^[[:space:]]/ {
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      for(i=1;i&amp;lt;=NF;i++) gsub(/^[ \t]+|[ \t]+$/, &amp;#34;&amp;#34;, $i)
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      if($3 ~ &amp;#34;^&amp;#34;maj &amp;amp;&amp;amp; $5==&amp;#34;installed&amp;#34;){ print $6 ; exit }
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    }&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -n $installed &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; have &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*-&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;major&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;✓  Java &lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt; déjà installé (&lt;/span&gt;$installed&lt;span style=&#34;color:#e6db74&#34;&gt;) – ignoré.&amp;#34;&lt;/span&gt;
    installed_ids&lt;span style=&#34;color:#f92672&#34;&gt;+=(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$installed&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;

  &lt;span style=&#34;color:#75715e&#34;&gt;# 4b. builds disponibles&lt;/span&gt;
  mapfile -t ids &amp;lt; &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;get_available_ids &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;${#&lt;/span&gt;ids[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; -eq &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⚠  Aucun build disponible pour Java &lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt;.&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;

  &lt;span style=&#34;color:#75715e&#34;&gt;# 4c. priorité Zulu, sinon menu&lt;/span&gt;
  zulu&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; id in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;ids[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $id &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; *&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-zulu&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; zulu&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$id; break; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -n $zulu &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;➡  Installation du dernier Zulu Java &lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt; (&lt;/span&gt;$zulu&lt;span style=&#34;color:#e6db74&#34;&gt;)…&amp;#34;&lt;/span&gt;
    install_build &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$zulu&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
    installed_ids&lt;span style=&#34;color:#f92672&#34;&gt;+=(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$zulu&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
    selected&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;choose_id &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;ids[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -n $selected &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
      echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;➡  Installation de &lt;/span&gt;$selected&lt;span style=&#34;color:#e6db74&#34;&gt;…&amp;#34;&lt;/span&gt;
      install_build &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$selected&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
      installed_ids&lt;span style=&#34;color:#f92672&#34;&gt;+=(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$selected&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
      echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⏭  Java &lt;/span&gt;$major&lt;span style=&#34;color:#e6db74&#34;&gt; ignoré.&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 5. Maven --------------------------------------------------------------------&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ! sdk current maven &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
  echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n➡  Installation de Maven…&amp;#34;&lt;/span&gt;
  yes | sdk install maven
&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
  echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n✓  Maven déjà installé.&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 6. Choix de la version Java par défaut -------------------------------------&lt;/span&gt;
echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n--- Sélection de la version Java par défaut ------------------------&amp;#34;&lt;/span&gt;
PS3&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Numéro (0 = ne rien changer) : &amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; def in &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;installed_ids[@]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $REPLY &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;~ ^&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0-9&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;+$ &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Entrez un nombre.&amp;#34;&lt;/span&gt; ; &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt; ; &lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; $REPLY &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;⏭  Aucun changement de version courante.&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[[&lt;/span&gt; -n $def &lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
    sdk default java &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$def&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; true   &lt;span style=&#34;color:#75715e&#34;&gt;# code 1 inoffensif&lt;/span&gt;
    echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;✓  &lt;/span&gt;$def&lt;span style=&#34;color:#e6db74&#34;&gt; est maintenant la version par défaut.&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
  break
&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;# Exporte JAVA_HOME pour la session actuelle&lt;/span&gt;
export JAVA_HOME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.sdkman/candidates/java/current&amp;#34;&lt;/span&gt;
export PATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$JAVA_HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/bin:&lt;/span&gt;$PATH&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 7. Persistance JAVA_HOME ----------------------------------------------------&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ! grep -q &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;export JAVA_HOME=.*\.sdkman&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.bashrc&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
cat &amp;gt;&amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.bashrc&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# --- SDKMAN! Java/Maven (auto-ajout) ------------------------------------------
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;export JAVA_HOME=&amp;#34;$HOME/.sdkman/candidates/java/current&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;export PATH=&amp;#34;\$JAVA_HOME/bin:\$PATH&amp;#34;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;# -----------------------------------------------------------------------------#
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;EOF&lt;/span&gt;
  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ℹ  JAVA_HOME ajouté à ~/.bashrc&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;

&lt;span style=&#34;color:#75715e&#34;&gt;### 8. Résumé ------------------------------------------------------------------&lt;/span&gt;
echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\nÉtat actuel :&amp;#34;&lt;/span&gt;
sdk current
echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n✅  Installation terminée.&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#e6db74&#34;&gt;``````&lt;/span&gt;shvi install_java_stack.sh
chmod +x install_java_stack.sh
&lt;span style=&#34;color:#e6db74&#34;&gt;```&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Installer les Java versions&lt;/span&gt;
&lt;span style=&#34;color:#e6db74&#34;&gt;```&lt;/span&gt;sh
./install_java_stack.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;  11/07/2025   16:09.24   /home/mobaxterm  ./install_java_stack.sh
✓  Java &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt; déjà installé &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;7.0.352-zulu&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; – ignoré.
✓  Java &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; déjà installé &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;8.0.452.fx-zulu&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; – ignoré.
✓  Java &lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt; déjà installé &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;11.0.27.fx-zulu&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; – ignoré.
✓  Java &lt;span style=&#34;color:#ae81ff&#34;&gt;17&lt;/span&gt; déjà installé &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;17.0.15.fx-zulu&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; – ignoré.
✓  Java &lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt; déjà installé &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;21.0.7.fx-zulu&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; – ignoré.

✓  Maven déjà installé.

--- Sélection de la version Java par défaut ------------------------
1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 7.0.352-zulu     3&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 11.0.27.fx-zulu  5&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 21.0.7.fx-zulu
2&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 8.0.452.fx-zulu  4&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; 17.0.15.fx-zulu
Numéro &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;0 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ne rien changer&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; : &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
⏭  Aucun changement de version courante.

État actuel :

Using:

java: 17.0.15.fx-zulu
maven: 3.9.10

✅  Installation terminée.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2025/05/29/tldr-you-cant-automate-trust.html</link>
      <pubDate>Thu, 29 May 2025 11:14:31 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/05/29/tldr-you-cant-automate-trust.html</guid>
      <description>&lt;p&gt;Tldr: You can&amp;rsquo;t automate trust.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/@vardhanharsh8428/we-used-chatgpt-to-write-tests-the-qa-team-revolted-ae7706310c85&#34;&gt;Read “We Used ChatGPT to Write Tests. The QA Team Revolted.“ by Codepinion on Medium&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2025/03/30/transform-your-code-into-aioptimized.html</link>
      <pubDate>Sun, 30 Mar 2025 22:09:13 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/03/30/transform-your-code-into-aioptimized.html</guid>
      <description>&lt;p&gt;👀 Transform Your Code into AI-Optimized Prompts in Seconds&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://code2prompt.dev/&#34;&gt;code2prompt.dev&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2025/03/19/about-vibe-coding-llm-ai.html</link>
      <pubDate>Wed, 19 Mar 2025 22:07:25 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/03/19/about-vibe-coding-llm-ai.html</guid>
      <description>&lt;p&gt;About &amp;ldquo;&lt;a href=&#34;https://simonwillison.net/2025/Mar/19/vibe-coding/&#34;&gt;vibe coding&lt;/a&gt;&amp;rdquo; #LLM #AI #coding&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Un compteur pour déterminer quand Trump va être dégagé (ou pas)</title>
      <link>https://blog.rmendes.net/2025/01/26/un-compteur-pour-dterminer-quand.html</link>
      <pubDate>Sun, 26 Jan 2025 15:38:06 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/01/26/un-compteur-pour-dterminer-quand.html</guid>
      <description>&lt;h1 id=&#34;documentation-du-script-n8n&#34;&gt;Documentation du Script N8N&lt;/h1&gt;
&lt;h2 id=&#34;description&#34;&gt;Description&lt;/h2&gt;
&lt;p&gt;Ce script JavaScript est conçu pour N8N afin de calculer et de publier quotidiennement des décomptes avant des événements politiques majeurs aux États-Unis, à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les &lt;strong&gt;Midterms&lt;/strong&gt; (élections de mi-mandat).&lt;/li&gt;
&lt;li&gt;L&#39;&lt;strong&gt;élection présidentielle&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;jour de l&amp;rsquo;investiture&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il génère également une barre de progression graphique pour chaque événement sous forme de texte.&lt;/p&gt;
&lt;h2 id=&#34;fonctionnalités&#34;&gt;Fonctionnalités&lt;/h2&gt;
&lt;h3 id=&#34;1-définition-des-dates-clés&#34;&gt;1. Définition des dates clés&lt;/h3&gt;
&lt;p&gt;Le script définit les dates des événements cibles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Midterms&lt;/strong&gt; : 3 novembre 2026.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Élection présidentielle&lt;/strong&gt; : 7 novembre 2028.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jour de l&amp;rsquo;investiture&lt;/strong&gt; : 20 janvier 2029.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-calcul-des-jours-restants&#34;&gt;2. Calcul des jours restants&lt;/h3&gt;
&lt;p&gt;Le script calcule :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le nombre total de jours entre aujourd&amp;rsquo;hui et chaque événement.&lt;/li&gt;
&lt;li&gt;Le pourcentage de progression en fonction des jours écoulés.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-génération-de-barres-de-progression&#34;&gt;3. Génération de barres de progression&lt;/h3&gt;
&lt;p&gt;Une fonction génère une barre de progression graphique, composée de blocs pleins (&lt;code&gt;█&lt;/code&gt;) et de blocs vides (&lt;code&gt;▒&lt;/code&gt;), représentant visuellement l&amp;rsquo;avancée jusqu&amp;rsquo;à l&amp;rsquo;événement.&lt;/p&gt;
&lt;h3 id=&#34;4-génération-et-publication-du-message&#34;&gt;4. Génération et publication du message&lt;/h3&gt;
&lt;p&gt;Le script produit un message comprenant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le décompte des jours restants pour chaque événement.&lt;/li&gt;
&lt;li&gt;Les barres de progression associées.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;exemple-de-résultat&#34;&gt;Exemple de Résultat&lt;/h2&gt;
&lt;p&gt;Voici un exemple du message généré :&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;There are 646 days until the Midterms, 1381 days until the next Presidential Election, and 1490 days until the next Inauguration Day.
Midterms Progress: █▒▒▒▒▒▒▒▒▒ 9%
Presidential Election Progress: █▒▒▒▒▒▒▒▒▒ 4% 
Until Inauguration: ▒▒▒▒▒▒▒▒▒▒ 0%
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;code&#34;&gt;Code&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;// JavaScript code for N8N to calculate and post daily countdowns with a graphical loading bar

// Define the reference start date (Trump&#39;s 2025 inauguration)
const startOfMandate = new Date(&#39;2025-01-20T00:00:00Z&#39;);

// Define the target dates
const midtermsDate = new Date(&#39;2026-11-03T00:00:00Z&#39;); // Next USA Midterms
const presidentialElectionDate = new Date(&#39;2028-11-07T00:00:00Z&#39;); // Next Presidential Election
const inaugurationDate = new Date(&#39;2029-01-20T00:00:00Z&#39;); // Next Inauguration Day

// Get the current date
const currentDate = new Date();

// Function to calculate correct progress
function calculateProgress(targetDate) {
  const totalDays = Math.ceil((targetDate - startOfMandate) / (1000 * 60 * 60 * 24));
  const elapsedDays = Math.ceil((currentDate - startOfMandate) / (1000 * 60 * 60 * 24));
  return Math.min(100, Math.max(0, Math.floor((elapsedDays / totalDays) * 100)));
}

// Calculate days remaining
const daysUntilMidterms = Math.ceil((midtermsDate - currentDate) / (1000 * 60 * 60 * 24));
const daysUntilPresidentialElection = Math.ceil((presidentialElectionDate - currentDate) / (1000 * 60 * 60 * 24));
const daysUntilInauguration = Math.ceil((inaugurationDate - currentDate) / (1000 * 60 * 60 * 24));

// Calculate accurate progress percentages
const midtermsProgress = calculateProgress(midtermsDate);
const presidentialProgress = calculateProgress(presidentialElectionDate);
const inaugurationProgress = calculateProgress(inaugurationDate);

// Create a graphical loading bar function
function createLoadingBar(percentage) {
  const totalBars = 10; // Length of the loading bar
  const filledBars = Math.floor((percentage / 100) * totalBars);
  const emptyBars = totalBars - filledBars;
  return `${&#39;█&#39;.repeat(filledBars)}${&#39;▒&#39;.repeat(emptyBars)} ${percentage}%`;
}

// Generate the loading bars
const midtermsLoadingBar = createLoadingBar(midtermsProgress);
const presidentialLoadingBar = createLoadingBar(presidentialProgress);
const inaugurationLoadingBar = createLoadingBar(inaugurationProgress);

// Generate the message
const message = `There are ${daysUntilMidterms} days until the Midterms, ${daysUntilPresidentialElection} days until the next Presidential Election, and ${daysUntilInauguration} days until the next Inauguration Day.\n\n` +
  `Midterms Progress: \n${midtermsLoadingBar}\n\n` +
  `Presidential Election Progress: \n${presidentialLoadingBar}\n\n` +
  `Inauguration Progress: \n${inaugurationLoadingBar}`;

// Output the message
return [{
  json: {
    message,
  },
}];

&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;où-il-publie&#34;&gt;Où il publie&lt;/h2&gt;
&lt;p&gt;Le script retourne le message sous forme d&amp;rsquo;un objet JSON, prêt à être utilisé dans un flux N8N pour une publication quotidienne via un nœud horaire configuré.&lt;/p&gt;
&lt;h2 id=&#34;configuration-recommandée&#34;&gt;Configuration Recommandée&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fuseau horaire du serveur&lt;/strong&gt; : CET (heure allemande).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heure de publication&lt;/strong&gt; : 14h00 CET, correspondant à 8h00 ET (heure de la côte Est des États-Unis).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;utilisation&#34;&gt;Utilisation&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Intégrez le script dans un nœud de fonction JavaScript dans N8N.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajoutez un nœud horaire configuré pour exécuter le flux quotidiennement.3. Reliez le nœud de fonction à un nœud de sortie ou à un service tiers pour publier le message (par exemple Bluesky.).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;résultat&#34;&gt;Résultat&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/trumpwatch.skyfleet.blue/post/3lkqzr6bg5n27&#34;&gt;Trumpwatch&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2025/01/03/bluesky-wont-save-uslike-radiation.html</link>
      <pubDate>Fri, 03 Jan 2025 21:40:30 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2025/01/03/bluesky-wont-save-uslike-radiation.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.liberalcurrents.com/bluesky-wont-save-us/&#34;&gt;Bluesky Won&amp;rsquo;t Save Us&lt;/a&gt;
Like radiation, social media is invisible scientific effluence that leaves us both more knowledgeable and more ignorant of the causes of our own afflictions than ever&lt;/p&gt;
&lt;p&gt;#bluesky #moderation #mastodon&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2024/12/16/nice-map-of.html</link>
      <pubDate>Mon, 16 Dec 2024 01:17:09 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2024/12/16/nice-map-of.html</guid>
      <description>&lt;p&gt;Nice Map of GitHub&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://anvaka.github.io/map-of-github&#34;&gt;anvaka.github.io/map-of-gi&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;#dataviz #github #coding&lt;/p&gt;
&lt;img src=&#34;https://blog.rmendes.net/uploads/2024/14b1e86acc.jpg&#34; width=&#34;358&#34; height=&#34;600&#34; alt=&#34;The link leads to a #dataviz of the github coding landscape&amp;10;Shades of blue differentiate different coding languages and by zooming in, one can explore different github repositories. &#34;&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2024/06/06/a-fait-plusieurs.html</link>
      <pubDate>Thu, 06 Jun 2024 18:00:59 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2024/06/06/a-fait-plusieurs.html</guid>
      <description>&lt;p&gt;Ça fait plusieurs semaines qu&amp;rsquo;au boulot je nage entre des Keycloak, des Tyk, des frontend #AngularJS et mine de rien ça avance, on va pouvoir décommissioner tout un bazar de serveurs qui a plusieurs années, hors support, non maintenu, bref une cata ambulante 🖖🏽&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2024/03/21/interesting-for-local.html</link>
      <pubDate>Thu, 21 Mar 2024 09:23:09 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2024/03/21/interesting-for-local.html</guid>
      <description>&lt;p&gt;interesting for local development &lt;a href=&#34;https://anchor.dev/blog/introducing-lcl-host&#34;&gt;anchor.dev/blog/intr&amp;hellip;&lt;/a&gt; #lclhost&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2023/12/06/happy-to-be.html</link>
      <pubDate>Wed, 06 Dec 2023 20:04:27 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/12/06/happy-to-be.html</guid>
      <description>&lt;p&gt;Happy to be using many of these &lt;a href=&#34;https://github.com/mhoye/moderntools/&#34;&gt;tools&lt;/a&gt;, both at home and work :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2023/11/04/yay-github-multi.html</link>
      <pubDate>Sat, 04 Nov 2023 07:52:31 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/11/04/yay-github-multi.html</guid>
      <description>&lt;p&gt;Yay Github &lt;a href=&#34;https://github.blog/changelog/2023-11-03-multi-account-support-on-github-com/&#34;&gt;Multi&lt;/a&gt; Account Support 😎&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2023/09/09/geeks-gonna-geek.html</link>
      <pubDate>Fri, 08 Sep 2023 23:43:00 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/09/09/geeks-gonna-geek.html</guid>
      <description>&lt;p&gt;geeks gonna geek&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github-guessr.vercel.app/game&#34;&gt;github-guessr.vercel.app/game&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Mon extension Chrome/Vivaldi/Edge pour poster sur Bluesky marche en mode basique !</title>
      <link>https://blog.rmendes.net/2023/09/05/mon-extension-chromevivaldiedge.html</link>
      <pubDate>Tue, 05 Sep 2023 19:06:44 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/09/05/mon-extension-chromevivaldiedge.html</guid>
      <description>&lt;p&gt;Mon extension Chrome/Vivaldi/Edge pour poster sur Bluesky depuis n&amp;rsquo;importe quel tab sur lequel on est dans le navigateur fonctionne, en mode décoffrage brut : le titre et le lien sont postés, mais pas de carte intégrée et le lien n&amp;rsquo;est pas clickable, mais pour 2 ou 3h de dev ça me va, next corriger les bugs!!&lt;/p&gt;
&lt;p&gt;c&amp;rsquo;est aussi la première fois de ma vie que je crée une extension pour chrome et c&amp;rsquo;est une chouette learning curve !&lt;/p&gt;
&lt;h2 id=&#34;ce-qui-marche&#34;&gt;ce qui marche&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;login&lt;/li&gt;
&lt;li&gt;click to share&lt;/li&gt;
&lt;li&gt;text posts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ce-qui-ne-marche-pas&#34;&gt;ce qui ne marche pas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;URL avec carte intégrée&lt;/li&gt;
&lt;li&gt;se déconnecter via l&amp;rsquo;extension&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>JSON to RSS feed with N8N and optional HTML manipulation</title>
      <link>https://blog.rmendes.net/2023/08/23/json-to-rss.html</link>
      <pubDate>Wed, 23 Aug 2023 22:15:11 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/08/23/json-to-rss.html</guid>
      <description>&lt;p&gt;I&amp;rsquo;m so thrilled to finally having done it right !&lt;/p&gt;
&lt;p&gt;This workflow that you can copy and use on N8N does a few things&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP request a JSON feed to get last published items at the source (belgian AFSCA)&lt;/li&gt;
&lt;li&gt;Using regex to pick image file from the description field&lt;/li&gt;
&lt;li&gt;Clean up of the Description field from any html tags&lt;/li&gt;
&lt;li&gt;Serve a new RSS feed (Afsca does not have one)&lt;/li&gt;
&lt;li&gt;Use the RSS feed to Publish anywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;testing-your-feed&#34;&gt;Testing your feed&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Disable the workflow&lt;/li&gt;
&lt;li&gt;Disable the Feed node (left webhook)&lt;/li&gt;
&lt;li&gt;Enable Manual Execution&lt;/li&gt;
&lt;li&gt;Run the Workflow to inspect it and pin data if you need to test it&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;to-enable-the-servicing-of-the-rss-feed&#34;&gt;To enable the servicing of the RSS feed&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Disable the Manual Execution node&lt;/li&gt;
&lt;li&gt;Enable the Feed node (left webhook)&lt;/li&gt;
&lt;li&gt;Enable the workflow&lt;/li&gt;
&lt;li&gt;Visit your production RSS URL provided by the Feed node&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use view-source:https://URL of your RSS feed to easily inspect the content of your rss feed.
You can use Feedbro to test your RSS feed locally&lt;/p&gt;
&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-23-23-08.png&#34; width=&#34;600&#34; height=&#34;198&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;copy-into-n8n&#34;&gt;Copy into N8N&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Select the entire content of this block code below and paste it inside N8N&lt;/li&gt;
&lt;li&gt;you will get the node and everything like in the image above.&lt;/li&gt;
&lt;li&gt;the Function node showcased below does not need copying, it&amp;rsquo;s already included in the workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;instanceId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;58fd5c3ff393ef21f618201de491e9a03a72661d4848a2ad337fc80dc260a4d9&amp;#34;&lt;/span&gt;
  },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;nodes&amp;#34;&lt;/span&gt;: [
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {},
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;c7da8a26-baa3-47e5-a3c5-9f886d67dce4&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;When clicking \&amp;#34;Execute Workflow\&amp;#34;&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.manualTrigger&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;460&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;760&lt;/span&gt;
      ],
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;disabled&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
    },
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;fieldToSplitOut&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;items&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: {}
      },
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;042e6e0d-11ff-46e9-b49e-f440f44d6fa2&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Split out lists&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.itemLists&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;1120&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;
      ],
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
    },
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;afsca.rss&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;responseMode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;responseNode&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: {}
      },
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bb82d17d-e134-40be-8f85-898600577ff5&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Feed&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.webhook&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;460&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;460&lt;/span&gt;
      ],
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;webhookId&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;63f12265-8387-4bb7-bef0-d7eb93e49e11&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
    },
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;respondWith&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;responseBody&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json[\&amp;#34;data\&amp;#34;] }}&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: {
          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;responseCode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;,
          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;responseHeaders&amp;#34;&lt;/span&gt;: {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;entries&amp;#34;&lt;/span&gt;: [
              {
                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;,
                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;application/rss+xml&amp;#34;&lt;/span&gt;
              }
            ]
          }
        }
      },
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;e6857661-3b79-4c8b-a73d-c67ef4aebd9d&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Serve feed&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.respondToWebhook&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;2040&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;
      ],
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
    },
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://www.inoreader.com/stream/user/1005072895/tag/Afsca/view/json&amp;#34;&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;sendHeaders&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;headerParameters&amp;#34;&lt;/span&gt;: {
          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: [
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;accept&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;
            }
          ]
        },
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: {}
      },
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;4361bdc9-2795-4ac5-99eb-efc4db72a64c&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTTP Request&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.httpRequest&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;4.1&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;820&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;
      ]
    },
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;functionCode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;const escapeHTML = str =&amp;gt; {\n    if (!str) return \&amp;#34;\&amp;#34;;\n    return str.replace(/[&amp;amp;&amp;lt;&amp;gt;&amp;#39;\&amp;#34;]/g, \n        tag =&amp;gt; ({\n            &amp;#39;&amp;amp;&amp;#39;: &amp;#39;&amp;amp;&amp;#39;,\n            &amp;#39;&amp;lt;&amp;#39;: &amp;#39;&amp;lt;&amp;#39;,\n            &amp;#39;&amp;gt;&amp;#39;: &amp;#39;&amp;gt;&amp;#39;,\n            \&amp;#34;&amp;#39;\&amp;#34;: &amp;#39;&amp;#39;&amp;#39;,\n            &amp;#39;\&amp;#34;&amp;#39;: &amp;#39;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;\n&lt;/span&gt;        }[&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;tag&lt;/span&gt;]&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;)\n&lt;/span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;);\n&lt;/span&gt;}&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;;\n\nconst&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;unescapeHTML&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;str&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\n&lt;/span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;(!str)&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;\&amp;#34;;\n    return str.replace(/(&amp;lt;|&amp;gt;|&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;|&amp;#39;|&amp;amp;)/g&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\n&lt;/span&gt;        &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;tag&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;({\n&lt;/span&gt;            &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&amp;lt;&amp;#39;:&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&amp;lt;&amp;#39;,\n&lt;/span&gt;            &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&amp;gt;&amp;#39;:&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&amp;gt;&amp;#39;,\n&lt;/span&gt;            &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;&amp;#39;: &amp;#39;\&amp;#34;&amp;#39;,\n            &amp;#39;&amp;#39;&amp;#39;: \&amp;#34;&amp;#39;\&amp;#34;,\n            &amp;#39;&amp;amp;&amp;#39;: &amp;#39;&amp;amp;&amp;#39;\n        }[tag])\n    );\n};\n\nlet feedItems = [];\nfor (item of items) {\n    feedItems.push(`&amp;lt;item&amp;gt;\n        &amp;lt;title&amp;gt;&amp;lt;![CDATA[${unescapeHTML(item.json.Title)}]]&amp;gt;&amp;lt;/title&amp;gt;\n        &amp;lt;guid isPermaLink=\&amp;#34;false\&amp;#34;&amp;gt;${item.json.guid}&amp;lt;/guid&amp;gt;\n        &amp;lt;media:content url=\&amp;#34;${item.json.Image}\&amp;#34; type=\&amp;#34;image/jpeg\&amp;#34; /&amp;gt;\n        &amp;lt;link&amp;gt;${item.json.Link}&amp;lt;/link&amp;gt;\n        &amp;lt;pubDate&amp;gt;${DateTime.fromISO(item.json.Date).toRFC2822()}&amp;lt;/pubDate&amp;gt;\n        &amp;lt;description&amp;gt;&amp;lt;![CDATA[${unescapeHTML(item.json.Description || \&amp;#34;\&amp;#34;)}]]&amp;gt;&amp;lt;/description&amp;gt;\n    &amp;lt;/item&amp;gt;`);\n}\n\nconst feedTitle = \&amp;#34;RappelConso\&amp;#34;;  // Set this to your desired feed title\nconst feedDescription = \&amp;#34;Rappel Conso monitoring.\&amp;#34;;  // Set this to your desired feed description\nconst feedLink = \&amp;#34;https://rmendes.net\&amp;#34;;  // Set this to your main RSS page or main website URL\n\nreturn [{\n    data: `&amp;lt;?xml version=\&amp;#34;1.0\&amp;#34; encoding=\&amp;#34;UTF-8\&amp;#34;?&amp;gt;\n&amp;lt;rss xmlns:dc=\&amp;#34;http://purl.org/dc/elements/1.1/\&amp;#34; xmlns:media=\&amp;#34;http://search.yahoo.com/mrss/\&amp;#34; version=\&amp;#34;2.0\&amp;#34;&amp;gt;\n    &amp;lt;channel&amp;gt;\n        &amp;lt;title&amp;gt;&amp;lt;![CDATA[${feedTitle}]]&amp;gt;&amp;lt;/title&amp;gt;\n        &amp;lt;link&amp;gt;${feedLink}&amp;lt;/link&amp;gt;\n        &amp;lt;description&amp;gt;&amp;lt;![CDATA[${feedDescription}]]&amp;gt;&amp;lt;/description&amp;gt;\n        &amp;lt;pubDate&amp;gt;${DateTime.fromISO(item.json.Date).toRFC2822()}&amp;lt;/pubDate&amp;gt;\n        ${feedItems.join(&amp;#39;\\n&amp;#39;)}\n    &amp;lt;/channel&amp;gt;\n&amp;lt;/rss&amp;gt;`\n}];\n\n&amp;#34;&lt;/span&gt;
      },
      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;986ea46f-4206-431e-92a9-199072492648&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Define feed items1&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.function&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;1840&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;
      ],
      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;}&lt;/span&gt;,
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: {
          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: [
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ImageURL&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{$json[\&amp;#34;content_html\&amp;#34;].match(/src=\&amp;#34;([^\&amp;#34;]+)\&amp;#34;/) ? $json[\&amp;#34;content_html\&amp;#34;].match(/src=\&amp;#34;([^\&amp;#34;]+)\&amp;#34;/)[1] : \&amp;#34;\&amp;#34;}}\n&amp;#34;&lt;/span&gt;
            },
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CleanDesc&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{$json[\&amp;#34;content_html\&amp;#34;].replace(/&amp;lt;\\/?[^&amp;gt;]+(&amp;gt;|$)/g, \&amp;#34; \&amp;#34;).trim().replace(/\\s\\s+/g, &amp;#39; &amp;#39;).substring(0,200)}}\n&amp;#34;&lt;/span&gt;
            }
          ]
        },
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: {}
      },
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;b1f7e9b0-3270-4a44-bfdf-5fa7519e9d6b&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fetch IMG + CleanDesc&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.set&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;1360&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;
      ]
    },
    {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;: {
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;keepOnlySet&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;values&amp;#34;&lt;/span&gt;: {
          &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: [
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Title&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json.title }}&amp;#34;&lt;/span&gt;
            },
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Link&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json.url }}&amp;#34;&lt;/span&gt;
            },
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Date&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json.date_published }}&amp;#34;&lt;/span&gt;
            },
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;guid&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json.id }}&amp;#34;&lt;/span&gt;
            },
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Description&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json.CleanDesc }}&amp;#34;&lt;/span&gt;
            },
            {
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Image&amp;#34;&lt;/span&gt;,
              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;={{ $json.ImageURL }}&amp;#34;&lt;/span&gt;
            }
          ]
        },
        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;: {}
      },
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;5cdbd79f-6f5b-42ee-8f3d-b8d1de320949&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Set Everything&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n8n-nodes-base.set&amp;#34;&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;typeVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;: [
        &lt;span style=&#34;color:#ae81ff&#34;&gt;1620&lt;/span&gt;,
        &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt;
      ]
    }
  ],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;connections&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;When clicking \&amp;#34;Execute Workflow\&amp;#34;&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTTP Request&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Split out lists&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fetch IMG + CleanDesc&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Feed&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTTP Request&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;HTTP Request&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Split out lists&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Define feed items1&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Serve feed&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Fetch IMG + CleanDesc&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Set Everything&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Set Everything&amp;#34;&lt;/span&gt;: {
      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;: [
        [
          {
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Define feed items1&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;index&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
          }
        ]
      ]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;javascript-function-node-used-in-this-workflow&#34;&gt;Javascript function node used in this workflow&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I have escapeHTML and unEscapeHTML for each use case, this is completely optional
and pretty much there for me to have both use cases at hand when I work with feeds.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;252
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;253
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;254
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;255
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;256
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;257
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;258
&lt;/span&gt;&lt;span style=&#34;display:block;width:100%;background-color:#3c3d38&#34;&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;259
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;260
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;261
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;262
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;263
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;264
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;265
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;266
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;267
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;268
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;269
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;270
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;271
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;272
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;273
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;274
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;275
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;276
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;277
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;278
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;279
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;280
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;281
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;282
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;283
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;284
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;285
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;286
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;287
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;288
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;289
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;290
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;291
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;292
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;293
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;294
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;295
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;296
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;297
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;298
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;299
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;300
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;301
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;302
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;303
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;304
&lt;/span&gt;&lt;span style=&#34;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;305
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;escapeHTML&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt; =&amp;gt; {
    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;replace&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;/[&amp;amp;&amp;lt;&amp;gt;&amp;#39;&amp;#34;]/g&lt;/span&gt;, 
        &lt;span style=&#34;color:#a6e22e&#34;&gt;tag&lt;/span&gt; =&amp;gt; ({
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;amp;&amp;#39;&lt;/span&gt;,
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;lt;&amp;#39;&lt;/span&gt;,
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;gt;&amp;#39;&lt;/span&gt;,
&lt;span style=&#34;display:block;width:100%;background-color:#3c3d38&#34;&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;#39;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;quot;&amp;#39;&lt;/span&gt;
        }[&lt;span style=&#34;color:#a6e22e&#34;&gt;tag&lt;/span&gt;])
    );
};

&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;unescapeHTML&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt; =&amp;gt; {
    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;replace&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;/(&amp;amp;lt;|&amp;amp;gt;|&amp;amp;quot;|&amp;amp;#39;|&amp;amp;amp;)/g&lt;/span&gt;, 
        &lt;span style=&#34;color:#a6e22e&#34;&gt;tag&lt;/span&gt; =&amp;gt; ({
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;lt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt;,
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;,
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;quot;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;,
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;,
            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;amp;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;
        }[&lt;span style=&#34;color:#a6e22e&#34;&gt;tag&lt;/span&gt;])
    );
};

&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;feedItems&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;items&lt;/span&gt;) {
    &lt;span style=&#34;color:#a6e22e&#34;&gt;feedItems&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;`&amp;lt;item&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;title&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;unescapeHTML&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;]]&amp;gt;&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;guid isPermaLink=&amp;#34;false&amp;#34;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;guid&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/guid&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;media:content url=&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Image&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; type=&amp;#34;image/jpeg&amp;#34; /&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;link&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Link&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/link&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;pubDate&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;DateTime&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fromISO&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.Date).&lt;span style=&#34;color:#a6e22e&#34;&gt;toRFC2822&lt;/span&gt;()&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/pubDate&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;description&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;unescapeHTML&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;]]&amp;gt;&amp;lt;/description&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;/item&amp;gt;`&lt;/span&gt;);
}

&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;feedTitle&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RappelConso&amp;#34;&lt;/span&gt;;  &lt;span style=&#34;color:#75715e&#34;&gt;// Set this to your desired feed title
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;feedDescription&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Rappel Conso monitoring.&amp;#34;&lt;/span&gt;;  &lt;span style=&#34;color:#75715e&#34;&gt;// Set this to your desired feed description
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;feedLink&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://rmendes.net&amp;#34;&lt;/span&gt;;  &lt;span style=&#34;color:#75715e&#34;&gt;// Set this to your main RSS page or main website URL
&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [{
    &lt;span style=&#34;color:#a6e22e&#34;&gt;data&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;`&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;rss xmlns:dc=&amp;#34;http://purl.org/dc/elements/1.1/&amp;#34; xmlns:media=&amp;#34;http://search.yahoo.com/mrss/&amp;#34; version=&amp;#34;2.0&amp;#34;&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;channel&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;title&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;feedTitle&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;]]&amp;gt;&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;link&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;feedLink&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/link&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;description&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;feedDescription&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;]]&amp;gt;&amp;lt;/description&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;lt;pubDate&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;DateTime&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fromISO&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;json&lt;/span&gt;.Date).&lt;span style=&#34;color:#a6e22e&#34;&gt;toRFC2822&lt;/span&gt;()&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/pubDate&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;feedItems&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    &amp;lt;/channel&amp;gt;
&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;/rss&amp;gt;`&lt;/span&gt;
}];&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Bluesky, comment utiliser un newsbot pour générer des Customs Feeds thématiques ?</title>
      <link>https://blog.rmendes.net/2023/08/18/bluesky-comment-utiliser.html</link>
      <pubDate>Fri, 18 Aug 2023 11:43:57 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/08/18/bluesky-comment-utiliser.html</guid>
      <description>&lt;p&gt;L&amp;rsquo;idée avec ce tuto, c&amp;rsquo;est de démontrer une mise en place d&amp;rsquo;utilisation des customs feeds sur Bluesky basé sur un News Bot qui va générer le contenu, ce qui va nous permettre de segmenter l&amp;rsquo;activité du newsbot en différents customs feeds auxquels les utilisateurs vont pouvoir s&amp;rsquo;abonner.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D&amp;rsquo;abord, j&amp;rsquo;ai été récupérer les &lt;a href=&#34;https://www.lemonde.fr/actualite-medias/article/2019/08/12/les-flux-rss-du-monde-fr_5498778_3236.html&#34;&gt;Flux RSS&lt;/a&gt; de chez LeMonde.fr&lt;/li&gt;
&lt;li&gt;Ensuite, j&amp;rsquo;ai mis en place un agrégateur de flux afin de rassembler les différents flux d&amp;rsquo;info par dossier (actu, culture, planète etc..)&lt;/li&gt;
&lt;li&gt;Ensuite, j&amp;rsquo;ai mis en place le newsbot en tant que tel en &lt;a href=&#34;https://blog.rmendes.net/2023/08/14/comment-dployer-un.html&#34;&gt;suivant mon tuto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
 &lt;img src=&#34;https://blog.rmendes.net/uploads/2023/shapes.png&#34; width=&#34;600&#34; height=&#34;294&#34; alt=&#34;&#34;&gt;
&lt;h2 id=&#34;12-flux-de-veilles-sur-un-même-compte-bluesky&#34;&gt;12 flux de veilles sur un même compte bluesky&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-18-12.41.15-lemonde.rmendes.net-f127ad1d0077.jpg&#34; alt=&#34;Vue FreshRSS des catégories d&amp;rsquo;info LeMonde.fr&#34; title=&#34;Vue FreshRSS des catégories d&#39;info LeMonde.fr&#34;&gt;&lt;/p&gt;
&lt;p&gt;Il y a donc 12 processus de veille RSS qui tournent, un par catégorie maitresse sur le site LeMonde&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-18-12-04.png&#34; alt=&#34;Vue des 12 conteneurs qui font tourner le bot sur bluesky&#34; title=&#34;Vue des 12 conteneurs qui font tourner le bot sur bluesky&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;comment-sont-construits-les-custom-feeds-&#34;&gt;Comment sont construits les custom feeds ?&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;avais besoin d&amp;rsquo;une ancre stable sur lequel me baser pour chaque catégorie et je ne pouvais pas prévoir tous les mots utilisés dans un titre ou la description pour segmenter les articles en différent flux thématique, du coup, en éditant mon fichier config.json, je peux segmenter avant même la publication, et ce, de manière stable :&lt;/p&gt;
&lt;h3 id=&#34;configjson-pour-actu&#34;&gt;config.json pour Actu&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Actu: $title&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publishEmbed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fr&amp;#34;&lt;/span&gt;],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;truncate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;runInterval&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateField&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;configjson-pour-culture&#34;&gt;config.json pour Culture&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Culture: $title&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publishEmbed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fr&amp;#34;&lt;/span&gt;],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;truncate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;runInterval&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateField&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Etc.. etc..ce qui me permet de prendre le dossier/catégorie culture, actu, sports, france etc&amp;hellip;
et d&amp;rsquo;avoir une segmentation simple sans devoir passer par des tas de requête regex qui ne donneraient pas une segmentation aussi simple et efficace.&lt;/p&gt;
&lt;h2 id=&#34;résultat-de-la-veille-sur-bluesky&#34;&gt;Résultat de la veille sur Bluesky&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-18-11.20.59-bsky.app-47c2f830a66b.png&#34; alt=&#34;Flux d&amp;rsquo;information LeMonde sur bluesky&#34; title=&#34;Flux d&#39;information LeMonde sur bluesky&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;skyfeed-custom-feed-builder&#34;&gt;Skyfeed custom feed builder&lt;/h2&gt;
&lt;p&gt;Vue de la mise en place d&amp;rsquo;un custom feed avec &lt;a href=&#34;https://skyfeed.app&#34;&gt;skyfeed.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-18-11.22.02-skyfeed.app-a5a9f4a9f340.png&#34; alt=&#34;Vue de la construction d&amp;rsquo;un custom feed sur skyfeed&#34; title=&#34;Vue de la construction d&#39;un custom feed sur skyfeed&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;listes-des-custom-feeds-sur-lfmbskysocialhttpsbskyappprofilelmfbskysocial&#34;&gt;Listes des custom feeds sur &lt;a href=&#34;https://bsky.app/profile/lmf.bsky.social&#34;&gt;@lfm.bsky.social&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak5xpuqt5a&#34;&gt;International&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak6tv6b3wm&#34;&gt;Planète&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak6goyuuzw&#34;&gt;Opinions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak5ii3hl5c&#34;&gt;France&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak42um3ytm&#34;&gt;Culture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak5cxtrldw&#34;&gt;Economie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak63b6ltpm&#34;&gt;Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak6n7hmuua&#34;&gt;Pixels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak7d5jvnw2&#34;&gt;Sports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak5qr63svy&#34;&gt;Guide d&amp;rsquo;Achat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:f5mbotnuol4anbbwxwb6wnfg/feed/aaaak56aqxica&#34;&gt;M le Mag&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-18-11.21.22-bsky.app-d481b4821bcd.png&#34; alt=&#34;Vue du compte sur bluesky&#34; title=&#34;Vue du compte sur bluesky&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;résultats-&#34;&gt;Résultats :&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-18-12.21.56-skyfeed.app-ba18710228bd.jpg&#34; alt=&#34;Vue Skyfeed des différents flux thématique&#34; title=&#34;Vue Skyfeed des différents flux thématique&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;le-problème-des-doublons-résolu&#34;&gt;le problème des doublons (résolu)&lt;/h2&gt;
&lt;p&gt;Pour régler les problèmes de doublons, c&amp;rsquo;est-à-dire, un article qui apparaît dans 2 ou 3 flux, j&amp;rsquo;ai déjà viré les flux à la Une, vu qu&amp;rsquo;ils reprennent le contenu des catégories, ensuite grâce à Inoreader, je vire les doublons d&amp;rsquo;une même catégorie en faisant un tri sur les articles qui ont le même titre, mais qui sont publiées à plusieurs endroits et enfin, on utilise le flux de sortir du dossier (culture, actu, sports etc..) comme input d&amp;rsquo;entrée du bot qui veille à l&amp;rsquo;arrivée de nouvelles publications et qui s&amp;rsquo;en charge de les publier.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Comment déployer un news bot RSS sur Bluesky?</title>
      <link>https://blog.rmendes.net/2023/08/14/comment-dployer-un.html</link>
      <pubDate>Mon, 14 Aug 2023 11:34:27 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/08/14/comment-dployer-un.html</guid>
      <description>&lt;h2 id=&#34;pré-requis&#34;&gt;pré-requis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;un compte bluesky dédié&lt;/li&gt;
&lt;li&gt;un &amp;ldquo;app password&amp;rdquo;&lt;/li&gt;
&lt;li&gt;un flux RSS source de contenu à publier&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/milanmdev/bsky.rss/&#34;&gt;bsky.rss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;la commande git installée&lt;/li&gt;
&lt;li&gt;Docker et Docker-Compose installé&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&#34;https://blog.rmendes.net/uploads/2023/2023-08-14-13-48.png&#34; width=&#34;600&#34; height=&#34;334&#34; alt=&#34;&#34;&gt;
&lt;p&gt;Pour l&amp;rsquo;exercice, on va déployer un newsbot &lt;a href=&#34;https://disclose.ngo/&#34;&gt;https://disclose.ngo/&lt;/a&gt;
C&amp;rsquo;est un média d&amp;rsquo;investigation.&lt;/p&gt;
&lt;h3 id=&#34;setup&#34;&gt;Setup&lt;/h3&gt;
&lt;p&gt;Pas besoin d&amp;rsquo;un gros serveurs, il suffit d&amp;rsquo;avoir un ordinateur, évidemment si vous le débranché, le bot s&amp;rsquo;éteint aussi, donc, c&amp;rsquo;est plus pratique de mettre ça en ligne, sur un petit vps, même un serveur à 5€ par mois fera tout à fait l&amp;rsquo;affaire.&lt;/p&gt;
&lt;p&gt;Et sinon, votre machine, que ce soit sur Windows, Linux ou macOS, tout est bon !&lt;/p&gt;
&lt;h4 id=&#34;un-compte-bluesky-dédié&#34;&gt;un compte bluesky dédié&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Résultat de ce tuto visible sur ce bot : (sans les images parce que le site à la source ne support pas bien la technologie OpenGraph)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/disclosengo.bsky.social&#34;&gt;disclosengo.bsky.social&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;un-app-password&#34;&gt;un &amp;ldquo;app password&amp;rdquo;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;gardez-le au chaud pour plus tard&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;un-flux-rss-source-du-contenu-à-publier&#34;&gt;un flux RSS source du contenu à publier&lt;/h4&gt;
&lt;p&gt;le site Disclose.ngo est un site sur mesure, mais il propose 2 flux RSS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flux en Anglais : &lt;a href=&#34;https://disclose.ngo/feed?lang=en&#34;&gt;https://disclose.ngo/feed?lang=en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Flux en Français : &lt;a href=&#34;https://disclose.ngo/feed&#34;&gt;https://disclose.ngo/feed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour trouver le flux &lt;a href=&#34;https://fr.wikipedia.org/wiki/RSS&#34;&gt;RSS&lt;/a&gt; d&amp;rsquo;un site source, l&amp;rsquo;extension &lt;a href=&#34;https://nodetics.com/feedbro/&#34;&gt;Feedbro&lt;/a&gt; est très utile
on pourrait faire tout un article sur cette question, mais en général, il y a toujours moyen de récupérer le flux RSS d&amp;rsquo;un site, même s&amp;rsquo;il est bien caché !&lt;/p&gt;
&lt;h4 id=&#34;bskyrss&#34;&gt;bsky.rss&lt;/h4&gt;
&lt;p&gt;bsky.rss est un petit bijou de code qu&amp;rsquo;on peut trouver &lt;a href=&#34;https://github.com/milanmdev/bsky.rss/&#34;&gt;ici&lt;/a&gt; :&lt;/p&gt;
&lt;h4 id=&#34;la-commande-git-installée&#34;&gt;la commande git installée&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;hors du champ de ce tuto, mais voici &lt;a href=&#34;https://kinsta.com/fr/base-de-connaissances/installer-git-windows-macos-linux/&#34;&gt;l&amp;rsquo;essentiel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;docker-et-docker-compose-installé&#34;&gt;Docker et Docker-Compose installé&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/compose/install/&#34;&gt;Installer&lt;/a&gt; Docker et Docker-compose&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;mise-en-place&#34;&gt;mise en place&lt;/h2&gt;
&lt;p&gt;Je suis sur Linux Ubuntu, donc l&amp;rsquo;approche ici part de ce principe :&lt;/p&gt;
&lt;h3 id=&#34;step-1&#34;&gt;step 1&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Créer un dossier /bsky-bot/&lt;/li&gt;
&lt;li&gt;Cloner le dépôt à l&amp;rsquo;intérieur de ce dossier&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;git clone github.com/milanmdev/bsky.rss disclosengo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-2&#34;&gt;step 2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;rentrer dans le dossier via votre terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;cd disclosengo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;structure&#34;&gt;structure&lt;/h4&gt;
&lt;h5 id=&#34;fichier-et-dossier-important&#34;&gt;fichier et dossier important&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;docker-compose.example.yml&lt;/li&gt;
&lt;li&gt;data/config.example.json&lt;/li&gt;
&lt;li&gt;Dockerfile&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;ls disclosengo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Vous devriez voir un dossier data, le fichier compose et le fichier data/config.json&lt;/li&gt;
&lt;li&gt;préparer vos fichiers de config&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;cp docker-compose.example.yml docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;cp data/config.example.json data/config.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;mon-compose-file&#34;&gt;Mon compose file&lt;/h4&gt;
&lt;p&gt;Voici à quoi doit ressembler votre fichier docker-compose.yml une fois configuré&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;3&amp;#34;&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;bsky-rss&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# le conteneur se lance au démarrage&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bsky-queue:latest&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bsky-rss-disclosengo&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# le nom du container une fois qu&amp;#39;il tourne&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;mem_limit&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;256m&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#mémoire limitée à&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;mem_reservation&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;128m&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#mémoire réservée&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;APP_PASSWORD=bqif-&lt;/span&gt;
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;INSTANCE_URL=https://bsky.social&lt;/span&gt;
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;FETCH_URL=https://disclose.ngo/feed?lang=en&lt;/span&gt;
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;IDENTIFIER=disclosengo.bsky.social&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data:/build/data&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# le fameux dossier data dans le dépôt ? il sera utilisé comme volume d&amp;#39;écriture&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;passons-sur-la-branche-de-test-pour-bénéficier-du-système-de-file-dattente&#34;&gt;Passons sur la branche de test pour bénéficier du système de file d&amp;rsquo;attente&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;git fetch --all
Fetching origin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;par défaut, on est sur la branche main&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;disclosengo# git branch -a
* main
  remotes/origin/HEAD -&amp;gt; origin/main
  remotes/origin/main
  remotes/origin/queue &lt;span style=&#34;color:#75715e&#34;&gt;# on veut celle ci !!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;on bouge sur la branche &amp;ldquo;queue&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;disclosengo# git checkout queue
Branch &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;queue&amp;#39;&lt;/span&gt; set up to track remote branch &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;queue&amp;#39;&lt;/span&gt; from &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;origin&amp;#39;&lt;/span&gt;.
Switched to a new branch &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;queue&amp;#39;&lt;/span&gt;
disclosengo# 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;on confirme qu&amp;rsquo;on est bien sur la bonne branche&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;git branch
  main
* queue
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Par défaut le fichier docker-compose.yml va construire la dernière version stable de bsky.rss, mais nous on veut aller sur la version de dev, du coup on va la construire :&lt;/li&gt;
&lt;li&gt;on va devoir changer une ligne dans notre fichier docker-compose.yml&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ceci&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ghcr.io/milanmdev/bsky.rss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;devient :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bsky-queue:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;on sauve le fichier et on fait :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker build -t bsky-queue .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;très important le point, il indique qu&amp;rsquo;on va utiliser le Dockerfile dans le dossier où l&amp;rsquo;on se trouve, ou se trouve le docker-compose.yml et le Dockerfile&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;Sending build context to Docker daemon    406kB
Step 1/8 : FROM node:lts
 ---&amp;gt; d9ad63743e72
Step 2/8 : LABEL org.opencontainers.image.description &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;A configurable RSS poster for Bluesky&amp;#34;&lt;/span&gt;
 ---&amp;gt; Using cache
 ---&amp;gt; 9899d560e894
Step 3/8 : LABEL org.opencontainers.image.source &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/milanmdev/bsky.rss&amp;#34;&lt;/span&gt;
 ---&amp;gt; Using cache
 ---&amp;gt; 3b9d7809df6e
Step 4/8 : WORKDIR /build
 ---&amp;gt; Using cache
 ---&amp;gt; d112e60329f1
Step 5/8 : COPY package.json yarn.lock ./
 ---&amp;gt; Using cache
 ---&amp;gt; 4d72a941e806
Step 6/8 : RUN yarn install --frozen-lockfile
 ---&amp;gt; Using cache
 ---&amp;gt; 8ce9a7982023
Step 7/8 : COPY . .
 ---&amp;gt; aa24c9bb0b84
Step 8/8 : CMD yarn start
 ---&amp;gt; Running in 8bcfa27fee9b
Removing intermediate container 8bcfa27fee9b
 ---&amp;gt; 4a3c1736110d
Successfully built 4a3c1736110d
Successfully tagged bsky-queue:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;à ce stade vous avez la dernière image avec la version du code en phase de test, ce qui va nous permettre d&amp;rsquo;utiliser le système de file d&amp;rsquo;attente.&lt;/p&gt;
&lt;h5 id=&#34;ma-config-dataconfigsjon&#34;&gt;Ma config data/config.sjon&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;le lien va être intégré en carte, avec image intégrée grâce à PublishEmbed&lt;/li&gt;
&lt;li&gt;en fonction du flux RSS, la description peut être utilisée pour générer un post plus long que juste le titre&lt;/li&gt;
&lt;li&gt;configurer la langue en fonction du contenu du flux RSS&lt;/li&gt;
&lt;li&gt;truncate c&amp;rsquo;est pour raccourcir le texte si la description est utilisée&lt;/li&gt;
&lt;li&gt;le runInterval c&amp;rsquo;est toutes les minutes, il va checker s&amp;rsquo;il y a du contenu à publier&lt;/li&gt;
&lt;li&gt;le datefield ne vous préoccupez pas avec ça pour le moment&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$title&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publishEmbed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;truncate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;runInterval&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateField&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id=&#34;options&#34;&gt;Options&lt;/h5&gt;
&lt;p&gt;Quand le &amp;ldquo;publishEmbed&amp;rdquo; est en &amp;ldquo;True&amp;rdquo;, il n&amp;rsquo;est pas nécéssaire d&amp;rsquo;ajouter la variable $link dans le champ string, qui correspond à ce qui va être posté, en effet la génération de la carte Embed, va se baser sur les meta OpenGraph du lien, l&amp;rsquo;image, la description et le titre qui y sont associés.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$title - $link $description&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;en&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;général&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;le&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;titre&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;suffit&lt;/span&gt; 
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publishEmbed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;false&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;déconseillé&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;de&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;mettre&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;en&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;false&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;sauf&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;si&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;pas&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;de&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;lien&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;], &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;fr,&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;de,&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;es,&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;etc...&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;truncate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#false&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;runInterval&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;120&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;absent&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;de&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;la&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;branch&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;main&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateField&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;par&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;défaut&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;il&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;cherche&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;pubDate&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;sauf&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;si&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;le&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;flux&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;RSS&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;n&amp;#39;est&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;pas&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;standard&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;step-3&#34;&gt;step 3&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;à ce stade, vous êtes prêt pour lancer la bête !&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lancement&#34;&gt;Lancement&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker-compose up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;dabord-le-bot-va-remplir-la-file-dattente-avec-les-posts-dispo-dans-le-flux-rss&#34;&gt;D&amp;rsquo;abord le bot va remplir la file d&amp;rsquo;attente avec les posts dispo dans le flux RSS&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;:/home/bsky-bot/disclosengo# docker-compose up
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;+&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Running 1/1
 ⠿ Container bsky-rss-disclosengo  Created                                                                                                                                                                     0.2s
Attaching to bsky-rss-disclosengo
bsky-rss-disclosengo  | yarn run v1.22.19
bsky-rss-disclosengo  | $ tsx ./app/index.ts
bsky-rss-disclosengo  | &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Mon, &lt;span style=&#34;color:#ae81ff&#34;&gt;14&lt;/span&gt; Aug &lt;span style=&#34;color:#ae81ff&#34;&gt;2023&lt;/span&gt; 11:29:24 GMT&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; - &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss APP&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Started RSS reader. Fetching from https://www.inoreader.com/stream/user/1005343511/tag/Disclosengo every &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt; minutes.
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Starting queue handler. Running every &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt; seconds
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Queuing item &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Revealed: Perenco’s damaging oil spills in Gabon&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Queuing item &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Lützerath: French banks finance the extension of one of Europe’s largest coal mines &lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À ce stade, le bot se déploie et vous devriez voir un retour dans votre terminal, si tout va bien, il va checker que le flux RSS et publier ce qu&amp;rsquo;il trouve à publier, ensuite le bot écrit dans un fichier txt (data/last.txt) la dernière fois qu&amp;rsquo;il a checker le flux RSS et va utiliser cette date pour comparer s&amp;rsquo;il y a du nouveau dans le flux RSS et ce toutes les 5 minutes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss POST&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Posting new item &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Revealed: Perenco’s damaging oil spills in Gabon&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss POST&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Posting new item &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Lützerath: French banks finance the extension of one of Europe’s largest coal mines &lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
 &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Finished running queue. Next run in &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt; seconds
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Running queue with &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt; items
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Finished running queue. Next run in &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt; seconds
&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;bsky.rss QUEUE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Running queue with &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; items
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez interrompre le bot avec CTRL+C, changer la config, changer le flux RSS, bref fignoler les détails et quand vous êtes content du résultat, vous lancez le bot avec&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cela va lancer le bot comme un processus de tâche de fond.&lt;/p&gt;
&lt;h2 id=&#34;repasser-sur-la-branche-main-stable-du-code-&#34;&gt;Repasser sur la branche main, stable du code :&lt;/h2&gt;
&lt;p&gt;ceci dans le fichier docker-compose.yml&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bsky-queue:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;redevient :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;ghcr.io/milanmdev/bsky.rss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;on sauve le fichier et on fait :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker-compose pull
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;on vérifie bien que le fichier config.json est bien adapté à la version du code&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$title&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#vérifier&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;la&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;zone&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;qui&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;va&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;construire&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;le&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;text&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;du&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;post&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;publishEmbed&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#intégration&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;des&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;liens/images&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;], &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#la,gues&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;truncate&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;couper&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;la&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;description&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;si&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;trop&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;longue&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;runInterval&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;, &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;si&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;pas&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;dans&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;la&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;branche&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;queue&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dateField&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;#&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;champ&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;date&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;spécifique&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;pour&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;flux&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;RSS&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;non-standard&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bien faire attention que la dernière ligne de configuration du fichier config.json, ne doit pas comporter de virgule, mais toutes celles qui la précèdent bien !!&lt;/p&gt;
&lt;p&gt;On lance la sauce :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;vérifier l&amp;rsquo;état du bot sur laydocker ou docker logs -f nom-de-votre-container&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;lazydocker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;et voilà, vous êtes en train de faire tourner la version stable du bot !&lt;/p&gt;
&lt;h2 id=&#34;outils&#34;&gt;Outils&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;J&amp;rsquo;utilise &lt;a href=&#34;https://lindevs.com/install-lazydocker-on-ubuntu/&#34;&gt;Lazydocker&lt;/a&gt; pour explorer les conteneurs qui tournent, le log, voir si tout va bien&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://packages.azlux.fr&#34;&gt;docker-ctop&lt;/a&gt; est aussi pas mal pour explorer vite fait les bots qui tournent&lt;/li&gt;
&lt;li&gt;Il y a moyen de &amp;ldquo;mixer&amp;rdquo; plusieurs flux RSS ensemble et ainsi avoir un bot multisources, mais ça, c&amp;rsquo;est pour un autre tuto !&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2023/07/29/interesting-tool-for.html</link>
      <pubDate>Sat, 29 Jul 2023 14:23:00 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/07/29/interesting-tool-for.html</guid>
      <description>&lt;p&gt;Interesting tool for devs&lt;/p&gt;
&lt;p&gt;Explore the #ActivityPub protocol interactively&lt;/p&gt;
&lt;p&gt;ActivityPub.Academy is a learning resource for ActivityPub. The protocol is brought to life by showing Activities sent between different instances in real time!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://activitypub.academy&#34;&gt;activitypub.academy&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.rmendes.net/2023/07/21/neat-comprehensive-python.html</link>
      <pubDate>Fri, 21 Jul 2023 09:12:00 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/07/21/neat-comprehensive-python.html</guid>
      <description>&lt;p&gt;Neat Comprehensive #Python Cheatsheet&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gto76.github.io/python-cheatsheet/&#34;&gt;gto76.github.io/python-ch&amp;hellip;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Python &amp; ActivityPub, initial research </title>
      <link>https://blog.rmendes.net/2023/06/18/python-activitypub-initial.html</link>
      <pubDate>Sun, 18 Jun 2023 16:15:36 +0100</pubDate>
      
      <guid>http://rmdes.micro.blog/2023/06/18/python-activitypub-initial.html</guid>
      <description>&lt;h2 id=&#34;a-bunch-of-python-related-ressources-and-activitypub&#34;&gt;A bunch of Python related ressources and ActivityPub&lt;/h2&gt;
&lt;h3 id=&#34;implementations&#34;&gt;Implementations&lt;/h3&gt;
&lt;p&gt;These are examples of ActivityPub server implementations written in Python:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dsblank/activitypub&#34;&gt;ActivityPub Example&lt;/a&gt;: An example of an ActivityPub server implementation written in Python.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dsblank/activitypub&#34;&gt;dsblank/activitypub&lt;/a&gt;: Prototyping a Python ActivityPub distributed server in Tornado.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/pylodon/pylodon&#34;&gt;pylodon&lt;/a&gt;: Flask-based ActivityPub server implementation. Source: &lt;a href=&#34;https://github.com/BasixKOR/awesome-activitypub&#34;&gt;GitHub - BasixKOR/awesome-activitypub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;libraries&#34;&gt;Libraries&lt;/h3&gt;
&lt;p&gt;These are libraries that can help you with implementing ActivityPub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/go-fed/activity&#34;&gt;activity&lt;/a&gt;: ActivityPub library for Golang.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/pterotype-project/activitypub-php&#34;&gt;activitypub-php&lt;/a&gt;: A library to turn any PHP project into a full ActivityPub implementation. Source: &lt;a href=&#34;https://github.com/BasixKOR/awesome-activitypub&#34;&gt;GitHub - BasixKOR/awesome-activitypub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;other-resources&#34;&gt;Other Resources&lt;/h3&gt;
&lt;p&gt;Here are some Python libraries and resources that might be useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/tootsuite/atoot&#34;&gt;atoot&lt;/a&gt;: A library providing an easy way to create Mastodon API applications. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/federation/federation&#34;&gt;Federation&lt;/a&gt;: Library to abstract social web federation protocols like ActivityPub, Diaspora, and Matrix. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://git.exozy.me/exozy/fuwuqi&#34;&gt;fuwuqi&lt;/a&gt;: A server for ActivityPub enthusiasts. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://little-boxes.readthedocs.io&#34;&gt;Little Boxes&lt;/a&gt;: A tiny ActivityPub framework that is both database and server agnostic. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/halcy/Mastodon.py&#34;&gt;Mastodon.py&lt;/a&gt;: A Python wrapper for the Mastodon API. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/jaywink/pynodeinfo&#34;&gt;pynodeinfo&lt;/a&gt;: NodeInfo library implemented with poetry. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dsblank/activitypub&#34;&gt;Python ActivityPub&lt;/a&gt;: A general ActivityPub library. Source: &lt;a href=&#34;https://codeberg.org/fediverse/delightful-activitypub-development&#34;&gt;delightful-activitypub-development - Codeberg.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember to check each resource to see if it&amp;rsquo;s suitable for your project&amp;rsquo;s specific needs and constraints.&lt;/p&gt;
&lt;hr&gt;
</description>
    </item>
    
  </channel>
</rss>