<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Accueil on FDUCAT Notebook</title><link>https://notes.ducatillon.net/fr/</link><description>Recent content in Accueil on FDUCAT Notebook</description><generator>Hugo</generator><language>fr-FR</language><atom:link href="https://notes.ducatillon.net/fr/index.xml" rel="self" type="application/rss+xml"/><item><title>Comment créer une custom skill</title><link>https://notes.ducatillon.net/fr/posts/2026-05-05-how-to-create-a-custom-skill-from-scratch/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/posts/2026-05-05-how-to-create-a-custom-skill-from-scratch/</guid><description>&lt;p&gt;J’ai créé la skill &lt;code&gt;article-writing&lt;/code&gt; pour transformer des conversations CLI en articles markdown publiables.
La V1 était surtout orientée Codex, puis j’ai itéré : extraction plus générique, livrables plus propres, et 4 tones/voices.&lt;/p&gt;
&lt;p&gt;Voici une méthode reproductible pour créer une custom skill.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis&lt;a class="anchor" href="#pr%c3%a9requis"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Avoir un outil CLI comme claude code, copilot, codex ou autres et un fichier &lt;code&gt;SKILL.md&lt;/code&gt; pour décrire votre skill.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SKILLS/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Exemple :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SKILLS/article-writing/SKILL.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="how-to"&gt;How-to&lt;a class="anchor" href="#how-to"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="1-définir-le-scope"&gt;1) Définir le scope&lt;a class="anchor" href="#1-d%c3%a9finir-le-scope"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Définir le comportement de la skill en une phrase complète :&lt;/p&gt;</description></item><item><title>IA 2026 Le Guide de Survie après la fin des Premium Requests</title><link>https://notes.ducatillon.net/fr/posts/ai-cost-2026/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/posts/ai-cost-2026/</guid><description>&lt;p&gt;L&amp;rsquo;annonce d&amp;rsquo;avril 2026 a marqué un tournant : GitHub a officiellement mis fin au principe des &amp;ldquo;Premium Requests&amp;rdquo; pour basculer vers un modèle de &lt;strong&gt;consommation réelle (AI Credits)&lt;/strong&gt;. Désormais, chaque interaction est facturée au poids des données. Pour un développeur, cela signifie qu&amp;rsquo;une mauvaise gestion du contexte peut coûter cher.&lt;/p&gt;
&lt;p&gt;Voici le guide complet pour naviguer dans cette nouvelle économie de l&amp;rsquo;IA.&lt;/p&gt;
&lt;h3 id="1-la-nouvelle-anatomie-de-linteraction-système-juin-2026"&gt;1. La Nouvelle Anatomie de l&amp;rsquo;Interaction (Système Juin 2026)&lt;a class="anchor" href="#1-la-nouvelle-anatomie-de-linteraction-syst%c3%a8me-juin-2026"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Composant&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Définition&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Logique &amp;ldquo;Legacy&amp;rdquo; (Pré-2026)&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Logique &amp;ldquo;Moderne&amp;rdquo; (Juin 2026)&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Optimisation (Save $)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Hub Copilot&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Interface web ou VS Code&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Unlimited (Gratuit).&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Charge par interaction.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Basique via Bing.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Microsoft Copilot&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Pro ($10/mo)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;$10 en AI Credits&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Top&lt;/strong&gt; : Unlimited et free Ghost-text.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Moyenne&lt;/strong&gt; : Chat agentic cher en crédits.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;ZeroTwo Pro&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Ultra ($25/mo)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Accès illimité via &amp;ldquo;Smart Proxy&amp;rdquo;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Elite&lt;/strong&gt; : Meilleur taux de réussite sur code complexe.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Multi-IA&lt;/strong&gt; : Compare GPT-5 et Claude 4.5 simultanément.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;OpenRouter&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Pay-as-you-go&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Aucun (Dépôt gratuit)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Économique&lt;/strong&gt; : Accès aux modèles Open Source (Llama 4).&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Transparent&lt;/strong&gt; : Coût exact affiché par correction.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Claude&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Pro ($20/mo)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Quota de messages intelligents&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Référence&lt;/strong&gt; : Code le plus propre et respect des patterns.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Logique&lt;/strong&gt; : Détecte les bugs structurels profonds.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Advanced ($20/mo)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Fenêtre de 2M tokens incluse&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Massif&lt;/strong&gt; : &amp;ldquo;Lit&amp;rdquo; l&amp;rsquo;intégralité de votre dépôt GitHub à la fois.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Rapide&lt;/strong&gt; : Trouver une aiguille dans une pile de 100 fichiers.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;More ($20/mo)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;~100 messages (série o)&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Très bon sur les algorithmes bas niveau.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Expert&lt;/strong&gt; : Le modèle &amp;ldquo;série o&amp;rdquo; fonctionne par étapes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id="3-outils-pour-réduire-la-facture"&gt;3. Outils pour réduire la facture&lt;a class="anchor" href="#3-outils-pour-r%c3%a9duire-la-facture"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;En juin 2026, l&amp;rsquo;utilisateur intelligent utilise des &amp;ldquo;filtres&amp;rdquo; pour éviter de brûler ses crédits inutilement :&lt;/p&gt;</description></item><item><title>Sites Statiques en 2025: Astro, Hugo, et Performance</title><link>https://notes.ducatillon.net/fr/posts/static-sites/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/posts/static-sites/</guid><description>&lt;p&gt;Pourquoi « l&amp;rsquo;architecture des îles » change le Web en 2026?&lt;/p&gt;
&lt;h2 id="le-changement-de-stratégie"&gt;Le changement de stratégie&lt;a class="anchor" href="#le-changement-de-strat%c3%a9gie"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pendant de nombreuses années, WordPress a placé la barre haute : des installations faciles, des flux de travail éditoriaux et des pages rendues par le serveur qui fonctionnaient immédiatement pour les blogs et les petits sites. Cette période (« l’ère WordPress ») nous a appris la valeur d’une publication simple et d’une fonctionnalité immédiate.&lt;/p&gt;
&lt;p&gt;Plus tard est venue l’ère SSG (Hugo et similaires) : performances du HTML pré-construit et petites empreintes d’hébergement.&lt;/p&gt;</description></item><item><title>Notions de bases en réseau</title><link>https://notes.ducatillon.net/fr/posts/notions-reseau/</link><pubDate>Tue, 11 Jan 2011 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/posts/notions-reseau/</guid><description>&lt;p&gt;Notions de bases en réseau&lt;/p&gt;
&lt;h2 id="réseau-informatique"&gt;Réseau (informatique)&lt;a class="anchor" href="#r%c3%a9seau-informatique"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ensemble d&amp;rsquo;ordinateurs reliés entre eux (cables ou sans fil). Ces ordinateurs peuvent ainsi à distance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Partager des ressources (modem, disque dur, lecteur de CD-Rom, applications etc.)&lt;/li&gt;
&lt;li&gt;Echanger des données: documents, tchats etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="cables-réseau-ou-cable-ethernet"&gt;Cables réseau ou cable ethernet&lt;a class="anchor" href="#cables-r%c3%a9seau-ou-cable-ethernet"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UTP-CAT5 (Unshielded Twist Pair Category 5) :100mégabit/seconde&lt;/li&gt;
&lt;li&gt;UTP-CAT6 (Unshielded Twist Pair Category 6): 1gigabit/seconde&lt;/li&gt;
&lt;li&gt;cables ethernet droits: relie un ordinateur à un switch&lt;/li&gt;
&lt;li&gt;cables ethernet croisés: relie 2 ordinateurs entre eux&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="carte-réseau"&gt;Carte réseau&lt;a class="anchor" href="#carte-r%c3%a9seau"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Matériel qui permet d&amp;rsquo;accéder au réseau. C&amp;rsquo;est par là que les données transites. La carte réseau fourni une adresse MAC à l&amp;rsquo;ordinateur en question afin de l&amp;rsquo;identifier sur le réseau (adresse physique). Une carte réseau se fixe au port PCI de l&amp;rsquo;ordinateur.&lt;/p&gt;</description></item><item><title>Charger ses propres fichiers .css et .js dans Wordpress</title><link>https://notes.ducatillon.net/fr/posts/load-js-to-wp/</link><pubDate>Thu, 02 Dec 2010 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/posts/load-js-to-wp/</guid><description>&lt;h2 id="objectif"&gt;Objectif&lt;a class="anchor" href="#objectif"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Charger un ou plusieurs fichiers .js et/ou .css afin de créer une animation ou ajouter un effet de style.&lt;/p&gt;
&lt;h2 id="solution"&gt;Solution&lt;a class="anchor" href="#solution"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sur un site &amp;ldquo;non wordpress&amp;rdquo; on pourrait inclure nos scripts entre les balises &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; de notre page HTML.&lt;/p&gt;
&lt;p&gt;Avec WordPress (3.X.X et 4.X.X) une des solutions possible est d&amp;rsquo;utiliser les méthodes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_wp_enqueue_script_&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_wp_enqueue_style_&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;du fichier &lt;code&gt;function.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Voici un exemple de code à inclure dans le fichier function.php :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Créer une fonction pour appeler les fichiers javascript et css
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;load_my_files&lt;/span&gt;() { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Charger les fichiers SAUF sur l&amp;#39;administration du site
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is_admin&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Load js files
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_script&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;script1&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;/wp-content/themes/custom_theme/js/script1.js&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_script&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;script2&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;/wp-content/themes/custom_theme/js/script2.js&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Load css files
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_style&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;style2&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;/wp-content/themes/custom_theme/css/style2.css&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;wp_enqueue_style&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;style1&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;/wp-content/themes/custom_theme/css/style1.css&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Charger notre fonction à l&amp;#39;initialisation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;add_action&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;init&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;load_my_files&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis déposer sur votre serveur les fichiers .js et .css à dans les dossiers créés à cet effet comme dans l&amp;rsquo;example ci-dessus&lt;/p&gt;</description></item><item><title>Afficher un PDF dans une page HTML</title><link>https://notes.ducatillon.net/fr/docs/web/embed-pdf-in-html/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/web/embed-pdf-in-html/</guid><description>&lt;h1 id="display-a-pdf-in-an-html-page"&gt;Display a PDF in an HTML page&lt;a class="anchor" href="#display-a-pdf-in-an-html-page"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;There are several ways to display a PDF inside an HTML page. Below are three common approaches, with notes on compatibility and a recommended Hugo shortcode method.&lt;/p&gt;
&lt;h2 id="1-using-the-embed-tag"&gt;1. Using the &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; tag&lt;a class="anchor" href="#1-using-the-embed-tag"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt; tag is the simplest option, but some browsers (especially mobile) may not render PDFs inline.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;embed&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://yoursite.com/document.pdf&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;100%&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;400px&amp;#34;&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-using-an-iframe-with-google-viewer"&gt;2. Using an &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; with Google Viewer&lt;a class="anchor" href="#2-using-an-iframe-with-google-viewer"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can use an &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; to embed Google Docs Viewer. This works even if the browser can&amp;rsquo;t render PDFs inline, but it requires the PDF to be accessible publicly by Google.&lt;/p&gt;</description></item><item><title>Aide-mémoire Google Workspace</title><link>https://notes.ducatillon.net/fr/posts/gp-cheat-sheet/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/posts/gp-cheat-sheet/</guid><description>&lt;p&gt;Me: &lt;a href="https://www.linkedin.com/in/sukumar-p/"&gt;https://www.linkedin.com/in/sukumar-p/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHub Copilot
Copilot flow:
Installation - &lt;a href="https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-extension"&gt;https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-extension&lt;/a&gt;
Context gathering
Proxy service - &lt;a href="https://devblogs.microsoft.com/all-things-azure/github-copilot-chat-explained-the-life-of-a-prompt/"&gt;https://devblogs.microsoft.com/all-things-azure/github-copilot-chat-explained-the-life-of-a-prompt/&lt;/a&gt;
&lt;a href="https://iitsnl.com/blog/understanding-github-copilots-internal-architecture/"&gt;https://iitsnl.com/blog/understanding-github-copilots-internal-architecture/&lt;/a&gt;
Model selection
Pre and Post model filters
Duplicate code detection/filtering - &lt;a href="https://github.com/orgs/community/discussions/159805"&gt;https://github.com/orgs/community/discussions/159805&lt;/a&gt;
Chat Experience:
Slash commands:
/delegate, /search, /explain, /fix, /new, /newNotebook, /setupTests, /tests, /savePrompt, /clear etc..
&lt;a href="https://docs.github.com/en/copilot/reference/chat-cheat-sheet?tool=vscode#slash-commands-1"&gt;https://docs.github.com/en/copilot/reference/chat-cheat-sheet?tool=vscode#slash-commands-1&lt;/a&gt;
Context Variables:
#{file}, #terminalLastCommand, #terminalSelection, #problems, #openSimpleBrowser, #changes, #githubRepo, #codebase, #fetch etc..
&lt;a href="https://docs.github.com/en/copilot/reference/chat-cheat-sheet?tool=vscode#chat-variables"&gt;https://docs.github.com/en/copilot/reference/chat-cheat-sheet?tool=vscode#chat-variables&lt;/a&gt;
Chat Participants:
@cli, @cloud, @vscode, @workspace etc..
&lt;a href="https://docs.github.com/en/copilot/reference/chat-cheat-sheet?tool=vscode#chat-participants"&gt;https://docs.github.com/en/copilot/reference/chat-cheat-sheet?tool=vscode#chat-participants&lt;/a&gt;
Adding context
Explaining commit from Source Control tab’s graph
Voice chat - &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-speech"&gt;https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-speech&lt;/a&gt;
Code completions:
Purpose - &lt;a href="https://code.visualstudio.com/docs/copilot/ai-powered-suggestions"&gt;https://code.visualstudio.com/docs/copilot/ai-powered-suggestions&lt;/a&gt;
Enable/Disable for all/specific files in settings and from Copilot in status bar - &lt;a href="https://code.visualstudio.com/docs/copilot/ai-powered-suggestions#_enable-or-disable-inline-suggestions"&gt;https://code.visualstudio.com/docs/copilot/ai-powered-suggestions#_enable-or-disable-inline-suggestions&lt;/a&gt;
Snooze option
Completions model - &lt;a href="https://code.visualstudio.com/docs/copilot/ai-powered-suggestions#_change-the-ai-model-for-suggestions"&gt;https://code.visualstudio.com/docs/copilot/ai-powered-suggestions#_change-the-ai-model-for-suggestions&lt;/a&gt;
Next Edit Suggestion:
What, Why, How
&lt;a href="https://code.visualstudio.com/docs/copilot/ai-powered-suggestions#_next-edit-suggestions"&gt;https://code.visualstudio.com/docs/copilot/ai-powered-suggestions#_next-edit-suggestions&lt;/a&gt;
Inline chat:
Purpose
Context and Model Selections
Inline chat in editor - &lt;a href="https://code.visualstudio.com/docs/copilot/chat/inline-chat#_use-editor-inline-chat"&gt;https://code.visualstudio.com/docs/copilot/chat/inline-chat#_use-editor-inline-chat&lt;/a&gt;
Inline chat in terminal - &lt;a href="https://code.visualstudio.com/docs/copilot/chat/inline-chat#_use-terminal-inline-chat"&gt;https://code.visualstudio.com/docs/copilot/chat/inline-chat#_use-terminal-inline-chat&lt;/a&gt;
Model selection:
Standard and Premium models
Models comparison - &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/model-comparison"&gt;https://docs.github.com/en/copilot/reference/ai-models/model-comparison&lt;/a&gt;
Premium requests, Model multiplier, quota for Business/Enterprise users, Additional usage - &lt;a href="https://docs.github.com/en/copilot/concepts/billing/copilot-requests"&gt;https://docs.github.com/en/copilot/concepts/billing/copilot-requests&lt;/a&gt;
Custom instructions:
Purpose
Use cases with copilot-instructions.md file - &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-instructions#_use-a-githubcopilotinstructionsmd-file"&gt;https://code.visualstudio.com/docs/copilot/customization/custom-instructions#_use-a-githubcopilotinstructionsmd-file&lt;/a&gt;
Enable custom instructions file in settings
Chat debug view with .copilotmd files - &lt;a href="https://code.visualstudio.com/docs/copilot/chat/chat-debug-view"&gt;https://code.visualstudio.com/docs/copilot/chat/chat-debug-view&lt;/a&gt;
Generating chat instructions for existing repo - &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-instructions#_generate-an-instructions-file-for-your-workspace"&gt;https://code.visualstudio.com/docs/copilot/customization/custom-instructions#_generate-an-instructions-file-for-your-workspace&lt;/a&gt;
Custom instructions for - Code Generation, Commit Message Generation, Pull Request Description Generation, Test Generation.
AGENTS.md - &lt;a href="https://agents.md/"&gt;https://agents.md/&lt;/a&gt;
Instructions.md files:
Compare with custom instructions
Sample instructions files with meta tags
Adding new instructions directory in settings
&lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-instructions#_use-instructionsmd-files"&gt;https://code.visualstudio.com/docs/copilot/customization/custom-instructions#_use-instructionsmd-files&lt;/a&gt;
Reusable prompts:
Purpose, locations
Calling from copilot chat and editor
&lt;a href="https://code.visualstudio.com/docs/copilot/customization/prompt-files"&gt;https://code.visualstudio.com/docs/copilot/customization/prompt-files&lt;/a&gt;
Spec story extension - &lt;a href="https://marketplace.visualstudio.com/items?itemName=SpecStory.specstory-vscode"&gt;https://marketplace.visualstudio.com/items?itemName=SpecStory.specstory-vscode&lt;/a&gt;
Chat modes or Agents:
Built-in agents - &lt;a href="https://code.visualstudio.com/docs/copilot/chat/copilot-chat#_choose-an-agent"&gt;https://code.visualstudio.com/docs/copilot/chat/copilot-chat#_choose-an-agent&lt;/a&gt;
Ask vs Edit vs Agent vs Plan modes
Custom agents - &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-agents#_what-are-custom-agents"&gt;https://code.visualstudio.com/docs/copilot/customization/custom-agents#_what-are-custom-agents&lt;/a&gt;
Agent file options - argument-hint, tools, model, infer, target, mcp-servers, handoffs - &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-agents#_custom-agent-file-structure"&gt;https://code.visualstudio.com/docs/copilot/customization/custom-agents#_custom-agent-file-structure&lt;/a&gt;
Custom agents at Org and Enterprise level - &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents&lt;/a&gt;
&lt;a href="https://code.visualstudio.com/docs/copilot/agents/overview"&gt;https://code.visualstudio.com/docs/copilot/agents/overview&lt;/a&gt;
Sub agents - &lt;a href="https://code.visualstudio.com/docs/copilot/agents/subagents"&gt;https://code.visualstudio.com/docs/copilot/agents/subagents&lt;/a&gt;
&lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7436079249784057856/"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7436079249784057856/&lt;/a&gt;
Copilot in CLI:
Installation
Usage with / commands, ! shell commands, @ file references.
Background agents with @cli command and “New chat” button in VS Code
&lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli"&gt;https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli&lt;/a&gt;
Vision input:
Enabling it - &lt;a href="https://docs.github.com/en/copilot/how-tos/chat-with-copilot/chat-in-ide#using-images-in-copilot-chat"&gt;https://docs.github.com/en/copilot/how-tos/chat-with-copilot/chat-in-ide#using-images-in-copilot-chat&lt;/a&gt;
Copilot on github.com:
Delegating tasks from VS Code, CLI, github.com
Premium requests usage for coding agent task
Triggering coding agent from github.com, follow up tasks - &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/manage-agents"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-agents/manage-agents&lt;/a&gt;
Agent selection, Model selection.
Working with GitHub issues using copilot - &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-for-common-tasks/use-copilot-to-create-or-update-issues"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-for-common-tasks/use-copilot-to-create-or-update-issues&lt;/a&gt;
Pull request summary - &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-for-common-tasks/create-a-pr-summary"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-for-common-tasks/create-a-pr-summary&lt;/a&gt;
PR review using Copilot and PRU, Agents tab in GitHub repository.
Customizing coding agent environment - &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Astuces Google Spreadsheet</title><link>https://notes.ducatillon.net/fr/docs/productivity/google-spreadsheet-tricks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/productivity/google-spreadsheet-tricks/</guid><description>&lt;h1 id="google-spreadsheet-tricks"&gt;Google spreadsheet tricks&lt;a class="anchor" href="#google-spreadsheet-tricks"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="remove-characters-from-a-string-in-a-cell-with-google-spreadsheet"&gt;Remove characters from a string in a cell with Google spreadsheet&lt;a class="anchor" href="#remove-characters-from-a-string-in-a-cell-with-google-spreadsheet"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="goal"&gt;Goal&lt;a class="anchor" href="#goal"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Remove the first 2 characters from a string in cell D1 :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; =RIGHT(D1,LEN(D1)-2)&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="explanations"&gt;Explanations&lt;a class="anchor" href="#explanations"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LEN(D1)&lt;/code&gt; returns the length of the string in a cell.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RIGHT(D1, X)&lt;/code&gt; returns a substring from the end.
First argument is the string.
Seconde argument is the length of the substring to return.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternatively, to remove the last 2 characters, use :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; =LEFT(D1,LEN(D1)-2)&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Badge Maker</title><link>https://notes.ducatillon.net/fr/docs/web/badges/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/web/badges/</guid><description>&lt;h2 id="shieldsio-badge-maker"&gt;Shields.io Badge Maker&lt;a class="anchor" href="#shieldsio-badge-maker"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Struggling to create the perfect shields.io badge? Here’s a quick, practical guide—with real examples—to help you avoid common pitfalls and craft badges that stand out.&amp;rdquo;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;strong&gt;Rendered Badge&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Goal&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;URL Structure&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Key Tips&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/Java-17-ED8B00" alt="Java 17" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Basic Badge&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://img.shields.io/badge/&amp;lt;LEFT_TEXT&amp;gt;-&amp;lt;RIGHT_TEXT&amp;gt;-&amp;lt;COLOR&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use a valid hex color (e.g., &lt;code&gt;ED8B00&lt;/code&gt; for Java). If &lt;code&gt;&amp;lt;RIGHT_TEXT&amp;gt;&lt;/code&gt; is not a color, it will appear as text.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/Java-ED8B00?logo=openjdk&amp;amp;logoColor=white" alt="Java" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Logo Integration&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;?logo=&amp;lt;LOGO&amp;gt;&amp;amp;logoColor=&amp;lt;LOGO_COLOR&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Find the correct logo name on &lt;a href="https://simpleicons.org/"&gt;Simple Icons&lt;/a&gt;. Use &lt;code&gt;openjdk&lt;/code&gt; for Java, not &lt;code&gt;java&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/Java-ED8B00?style=flat&amp;amp;logo=openjdk&amp;amp;logoColor=white" alt="Java" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Style: Flat&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;?style=flat&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use &lt;code&gt;flat&lt;/code&gt; for a minimalist look.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/Java-ED8B00?style=for-the-badge&amp;amp;logo=openjdk&amp;amp;logoColor=white" alt="Java" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Style: For the Badge&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;?style=for-the-badge&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use &lt;code&gt;for-the-badge&lt;/code&gt; for a larger, rounded style.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/Java-ED8B00?style=for-the-badge&amp;amp;logo=openjdk&amp;amp;logoColor=black" alt="Java" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Logo Color: Black&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;amp;logoColor=black&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use &lt;code&gt;black&lt;/code&gt; for logos on light backgrounds.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/Java-17-blue?style=for-the-badge&amp;amp;logo=openjdk&amp;amp;logoColor=white" alt="Java 17" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Text on Right Side&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://img.shields.io/badge/&amp;lt;LEFT_TEXT&amp;gt;-&amp;lt;RIGHT_TEXT&amp;gt;-&amp;lt;COLOR&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Ensure &lt;code&gt;&amp;lt;COLOR&amp;gt;&lt;/code&gt; is a valid hex code or color name.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="https://img.shields.io/badge/OpenSearch-00BFB3?style=for-the-badge&amp;amp;logo=opensearch&amp;amp;logoColor=white" alt="OpenSearch" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;OpenSearch Badge&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://img.shields.io/badge/OpenSearch-00BFB3?style=for-the-badge&amp;amp;logo=opensearch&amp;amp;logoColor=white&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use official brand colors for consistency (e.g., &lt;code&gt;00BFB3&lt;/code&gt; for OpenSearch).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div align="center"&gt;
&lt;a class="book-btn"href="https://shields.io/badges"rel="noopener"target="_blank"&gt;👉 Shields.io Badge Maker&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>Client GraphQL avec Springboot</title><link>https://notes.ducatillon.net/fr/docs/java/springboot-graphql-client/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/java/springboot-graphql-client/</guid><description>&lt;h1 id="minimal-graphql-client-request-with-springboot"&gt;Minimal Graphql client request with Springboot&lt;a class="anchor" href="#minimal-graphql-client-request-with-springboot"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://miro.medium.com/max/1280/1*eyC_K8xUyRHqlIaIbghHyg.jpeg" alt="Photo from Farzad Nazifi under Unsplash Licence" /&gt;
&lt;em&gt;&lt;a href="https://unsplash.com/license"&gt;https://unsplash.com/license&lt;/a&gt; Photo from Farzad Nazifi under Unsplash Licence&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most API’s architectural styles are RESTful. &lt;a href="https://www.javatpoint.com/graphql-advantages-and-disadvantages"&gt;For some good reasons&lt;/a&gt;, APIs can also be built based on a Graphql architecture style. I recently had the opportunity to call one of them. I discovered and tried several ways to perform this Graphql request, all with pros and cons. In this article, I will describe how to perform a &lt;strong&gt;minimal Graphql client request&lt;/strong&gt; with &lt;strong&gt;Spring Boot&lt;/strong&gt; and &lt;strong&gt;WebClient&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Commandes Bash pour les développeurs</title><link>https://notes.ducatillon.net/fr/docs/devops/bash-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/bash-commands/</guid><description>&lt;h1 id="day-to-day-bash-commands-for-developers"&gt;Day to day bash commands for developers&lt;a class="anchor" href="#day-to-day-bash-commands-for-developers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://notes.ducatillon.net/img/linux_pingouin.png" alt="Penguin" /&gt;&lt;/p&gt;
&lt;h2 id="bash-commands"&gt;Bash commands&lt;a class="anchor" href="#bash-commands"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd folder_name&lt;/code&gt; entrer dans un dossier&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd ..&lt;/code&gt; : revenir au dossier précédant&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat file_name&lt;/code&gt; : affiche le contenu d&amp;rsquo;un fichier&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwd&lt;/code&gt; : dis moi où je suis !&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdir folder_name&lt;/code&gt; : créer un dossier&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd / :&lt;/code&gt; Aller à la racine du serveur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd :&lt;/code&gt; Aller au répertoire de l&amp;rsquo;utilisateur (la &amp;ldquo;home directory&amp;rdquo; de l&amp;rsquo;utilisateur)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;df -h :&lt;/code&gt; Affiche les informations sur le volume de stockage. (h pour &lt;strong&gt;h&lt;/strong&gt;uman)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;du -hd1 (anciennement du -h --max-depth=1):&lt;/code&gt; Affiche les informations sur le volume de stockage du répertoire dans lequel on se trouve.(&amp;ldquo;disk free&amp;rdquo;,&amp;ldquo;disk usage&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rmdir file_name :&lt;/code&gt; supprimer un dossier&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rmdir -rf file_name :&lt;/code&gt; supprimer un dossier &lt;strong&gt;non vide.&lt;/strong&gt; Attention, cela supprime tous le contenu à l&amp;rsquo;intérieur du dossier (sous dossiers et fichiers)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;touch nomdufichier&lt;/code&gt; : créer un fichier ou mettre à jour la date de modification sur un fichier existant.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod 700 file_name&lt;/code&gt; : Modifier les permissions du fichier/dossier&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod 777 -R folder_name&lt;/code&gt; : Modifier les permissions du dossier ainsi que celles de tous les sous-dossiers et fichiers inclus&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chwon -R root:root folder_name&lt;/code&gt; : Modifie le propriétaire d&amp;rsquo;un dossier (avec sous dossiers et fichiers inclus dans mondossier)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;passwd utilisateur&lt;/code&gt;: Changer le mot de passe de l&amp;rsquo;utilisateur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;su -&lt;/code&gt; : Se connecter en root&lt;/li&gt;
&lt;li&gt;&lt;code&gt;su -utilisateur&lt;/code&gt; : Se connecter avec utilisateur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls&lt;/code&gt; : Lister le contenu d&amp;rsquo;un dossier&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -l (ou ll)&lt;/code&gt; : Liste le contenu d&amp;rsquo;un dossier avec le détail (permission, user, group)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -ltr&lt;/code&gt; : Afficher les fichiers du plus ancien au plus récent&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -a&lt;/code&gt; : Lister tout le contenu d&amp;rsquo;un dossier (dont les fichiers cachés)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -h&lt;/code&gt; : Lister les repertoires en affichant le volume des fichiers de manière &amp;ldquo;lisible&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -t | head -n 1&lt;/code&gt; : Liste le dernier le fichier édité. Ici, la commande &amp;ldquo;head&amp;rdquo; permet d&amp;rsquo;afficher le nombre de ligne voulu par rapport au résultat de la commande ls (ici une seule ligne)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -d */&lt;/code&gt; : Lister UNIQUEMENT les repertoires.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/&lt;/code&gt; : équivaut à /home/dossierUser&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -l &amp;gt; ls-l.txt&lt;/code&gt; : Liste le contenu du répertoire dans le fichier ls-l.txt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ls -l &amp;gt; ls-l.txt 2&amp;gt;&amp;amp;1&lt;/code&gt; : Liste uniquement les erreurs liés à la commande ls -l dans le fichier ls-l.txt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scp -r /Users/john/Documents/mondossier/* user@IP:~/mondossier&lt;/code&gt; : Envoyer un fichier serveur dont le contenu des dossiers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scp -P 5555 /Users/john/archive.tar.gz user@IP:~/mondossier&lt;/code&gt; : Envoyer un fichier compressé en spécifiant le port. (-P)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cp -rp /var/tmp/prestashop_1.5.2.0  /var/www/html/&lt;/code&gt; : Déplacer (=copier/coller) un répertoire d&amp;rsquo;un emplacement A à un emplacement B en gardant les permissions des fichiers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tar -pczf nameoftarball.tar.gz directoryname/&lt;/code&gt; Compresser et conserver les permissions des fichiers(-p)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tar -xzvf nameoftarball.tar.gz&lt;/code&gt; : Décompresser une archive.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[root@127.0.0.1 demo]#mv folder/* .&lt;/code&gt; : Déplace le contenu du dossier &amp;ldquo;folder&amp;rdquo; dans le dossier &amp;ldquo;demo&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unzip package.zip -d /path/to/directory/to/unzip&lt;/code&gt; : Dézipper le contenu de &amp;ldquo;package.zip&amp;rdquo; en choisissant le répertoire de destination.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gunzip -c backup.sql.gzip &amp;gt; backup.sql :&lt;/code&gt; Extraire le fichier &amp;ldquo;backup.sql.gzip&amp;rdquo; pour contourner l&amp;rsquo;erreur &amp;ldquo;Gunzip unknwon suffix&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find / -name file.log&lt;/code&gt; : Recherche le fichier file.log à la racine&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find . -iname file.log&lt;/code&gt; : Recherche le fichier file.log dans le répertoire où l&amp;rsquo;on se trouve.(case sensitive : sensible aux majuscules et minuscules)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find . -iname php.ini&lt;/code&gt; : Recherche le fichier php.ini dans le répertoire où l&amp;rsquo;on se trouve.(sans prendre en compte les majuscules et minuscules)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find . -mtime -3 | grep test&lt;/code&gt; : Recherche les fichiers qui ont été modifié dans les 3 derniers jours et contenant &amp;ldquo;test&amp;rdquo; dans leur nom.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find . -mtime +3 | grep test&lt;/code&gt; : Recherche les fichiers qui ont été modifié il y a plus de 3 jours et contenant &amp;ldquo;test&amp;rdquo; dans leur nom.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;locate php.ini&lt;/code&gt; : Recherche le fichier php.ini sur le serveur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -lR &amp;quot;chaine de caractere&amp;quot; *&lt;/code&gt; : Rechercher une chaine de caractère dans tous les fichiers du dossier dans lequel on se trouve.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;find /search/in/this/folder/ -type d -name &amp;quot;wordpress&amp;quot;&lt;/code&gt; : Recherche le répertoire intitulé &amp;ldquo;wordpress&amp;rdquo; dans le répertoire /search/in/this/folder/&lt;/li&gt;
&lt;li&gt;&lt;code&gt;diff file1 file2 | more&lt;/code&gt; : Afficher les différences entre 2 fichiers;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt; fileToPurge.txt&lt;/code&gt; : Effacer le contenu du fichier sans supprimer le fichier lui-même.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -Ri --color motarecherche /repertoire/ou/rechercher/&lt;/code&gt; : Rechercher un mot dans un repertoire sans prendre en compte la casse et en affichant le mot à rechercher en couleur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed -i 's/mot_a_rechercher/remplacé_par_celuici-meme/' fichier_en_question.txt&lt;/code&gt; : Commande de rechercher/remplacer de &amp;ldquo;mot_a_rechercher&amp;rdquo; en &amp;ldquo;remplacé_par_celuici-meme&amp;rdquo; dans le fichier fichier_en_question.txt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sed -i 's/mot_a_rechercher/remplacé_par_celuici-meme/g' fichier_en_question.txt&lt;/code&gt; : Commande de rechercher/remplacer de &amp;ldquo;mot_a_rechercher&amp;rdquo; en &amp;ldquo;remplacé_par_celuici-meme&amp;rdquo; dans le fichier fichier_en_question.txt. Le &lt;code&gt;/g&lt;/code&gt; permet de rechercher/remplacer plusieurs occurences de &amp;ldquo;mot_a_rechercher&amp;rdquo; sur une même ligne.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep motarechercher/etc/php.ini&lt;/code&gt; : Rechercher motarechercher dans le fichier php.ini&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep -v motaexclure/etc/php.ini&lt;/code&gt; : Rechercher TOUT sauf motarechercher dans le fichier php.ini&lt;/li&gt;
&lt;li&gt;&lt;code&gt;history&lt;/code&gt; : affiche l&amp;rsquo;historique des commandes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;history | grep install&lt;/code&gt; : Recherche dans l&amp;rsquo;historique des commandes celles qui contiennent le mot install&lt;/li&gt;
&lt;li&gt;&lt;code&gt;history -c&lt;/code&gt; : Efface l&amp;rsquo;historique&lt;/li&gt;
&lt;li&gt;&lt;code&gt;man command&lt;/code&gt;: Afficher les possibilités de la commande (Exemple: man ls)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt; : Quitter l&amp;rsquo;écran&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exit&lt;/code&gt; : Log out le user&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clear&lt;/code&gt; : Rafraichir l&amp;rsquo;écran&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shutdown -r now&lt;/code&gt; : Redémarrer le serveur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uname -m&lt;/code&gt; : Déterminer si la version de Linux utilisée est en 32 bit ou 64 bit x86_64 &amp;raquo;&amp;gt; 64-bit kernel i686 &amp;raquo;&amp;gt; 32-bit kernel&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ps -fu $USER&lt;/code&gt; : Visualiser les USERS en activité.(&amp;ldquo;process statistics&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ps -ef | grep ftp&lt;/code&gt; : Visualiser les processus en activité contenant &amp;ldquo;ftp&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service apache2 start &amp;amp;&lt;/code&gt; : Exécuter un script en tâche de fond.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;env&lt;/code&gt; : Affiche les variables d&amp;rsquo;environnement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top&lt;/code&gt; : Affiche les performances machines instantanées. Une fois dans le &amp;ldquo;top&amp;rdquo; en appuyant sur &amp;ldquo;SHIFT 1&amp;rdquo; permet d&amp;rsquo;afficher les performances de chaque CPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="quick-history-search-in-terminal"&gt;Quick history search in terminal&lt;a class="anchor" href="#quick-history-search-in-terminal"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Common search history is a combination of &lt;code&gt;history&lt;/code&gt; and &lt;code&gt;grep&lt;/code&gt; key words :
&lt;code&gt;history | grep word_to_search&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Commandes Git au quotidien</title><link>https://notes.ducatillon.net/fr/docs/devops/git-commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/git-commands/</guid><description>&lt;h1 id="every-day-git-commands"&gt;Every day Git commands&lt;a class="anchor" href="#every-day-git-commands"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Git-logo.svg/1280px-Git-logo.svg.png" alt="git" /&gt;&lt;/p&gt;
&lt;p&gt;Here are some day to day useful git commands&lt;/p&gt;
&lt;h3 id="refresh-git-repo-after-gitignore-edition"&gt;Refresh git repo after .gitignore edition&lt;a class="anchor" href="#refresh-git-repo-after-gitignore-edition"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When you add a new file to the &lt;code&gt;.gitignore&lt;/code&gt; it is not immediatly ignored. It stills appears on &lt;code&gt;git status&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To refresh the git repo&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git rm -rf --cached .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git rm -rf --cached specifyOnlyTheFolderToResfreshInsteadOftheEntireRepo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="remove-remote-branch"&gt;Remove remote branch&lt;a class="anchor" href="#remove-remote-branch"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin --delete my-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="remove-locale-branch"&gt;Remove locale branch&lt;a class="anchor" href="#remove-locale-branch"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D my-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="rename-locale-branch"&gt;Rename locale branch&lt;a class="anchor" href="#rename-locale-branch"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Switch to branch to rename&lt;/p&gt;</description></item><item><title>Commandes Kubernetes</title><link>https://notes.ducatillon.net/fr/docs/devops/kubernetes-command/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/kubernetes-command/</guid><description>&lt;h2 id="kubernetes--docker-commands-for-developers"&gt;Kubernetes &amp;amp; Docker commands for developers&lt;a class="anchor" href="#kubernetes--docker-commands-for-developers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="export-pod-logs"&gt;Export pod logs&lt;a class="anchor" href="#export-pod-logs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl logs pod-name -n namespace-name &amp;gt;&amp;gt; /export/path/file.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="deploy-a-debugutils-pod"&gt;Deploy a &amp;ldquo;debug/utils&amp;rdquo; pod&lt;a class="anchor" href="#deploy-a-debugutils-pod"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl run -i --tty --rm debug --image&lt;span style="color:#f92672"&gt;=&lt;/span&gt;busybox --restart&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Never --sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="use-bach-inside-a-pod"&gt;Use bach inside a pod&lt;a class="anchor" href="#use-bach-inside-a-pod"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl exec -it myPod -n myNameSpace -- /bin/bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="run-container"&gt;Run container&lt;a class="anchor" href="#run-container"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -p 8080:80 --name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="run-specific-docker-service"&gt;Run specific docker service&lt;a class="anchor" href="#run-specific-docker-service"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker-compose up -d myDatabaseApp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pod-port-forwarding"&gt;Pod Port forwarding&lt;a class="anchor" href="#pod-port-forwarding"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl port-forward pod/your-pod-name-85e45234ef-e345 8080:8080 -n your-name-space
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Forwarding from 127.0.0.1:8080 -&amp;gt; &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Forwarding from &lt;span style="color:#f92672"&gt;[&lt;/span&gt;::1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;:8080 -&amp;gt; &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Handling connection &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="get-pods-ip"&gt;Get Pods ip&lt;a class="anchor" href="#get-pods-ip"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Retrieve the IP of pods (pods of a deployment)&lt;/p&gt;</description></item><item><title>Commandes Poetry</title><link>https://notes.ducatillon.net/fr/docs/python/poetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/python/poetry/</guid><description>&lt;h1 id="poetry-commands"&gt;Poetry commands&lt;a class="anchor" href="#poetry-commands"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="init-poetry"&gt;Init poetry&lt;a class="anchor" href="#init-poetry"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry env remove --all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tables"&gt;Tables&lt;a class="anchor" href="#tables"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run python - &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;from app.adapters.outgoing.database.database import Base
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;print(Base.metadata.tables)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="db-config-url"&gt;DB Config url&lt;a class="anchor" href="#db-config-url"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run python - &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;from decouple import config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;print(&amp;#34;DATABASE_URL =&amp;#34;, config(&amp;#34;DATABASE_URL&amp;#34;))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="alembic"&gt;Alembic&lt;a class="anchor" href="#alembic"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run alembic revision --autogenerate -m &lt;span style="color:#e6db74"&gt;&amp;#34;initial schema&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run alembic upgrade head
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run alembic current&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="displays-tables"&gt;Displays Tables&lt;a class="anchor" href="#displays-tables"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run python -c &lt;span style="color:#e6db74"&gt;&amp;#34;from app.adapters.outgoing.database.database import Base; print(Base.metadata.tables.keys())&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ndash;dict_keys([&amp;lsquo;assets&amp;rsquo;, &amp;lsquo;asset_types&amp;rsquo;, &amp;lsquo;sessions&amp;rsquo;])&lt;/p&gt;
&lt;h2 id="run-app"&gt;Run app&lt;a class="anchor" href="#run-app"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;poetry run uvicorn app.main:app --reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Convertir PDF en Docx</title><link>https://notes.ducatillon.net/fr/docs/productivity/pdf_to_doc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/productivity/pdf_to_doc/</guid><description>&lt;h1 id="convert-pdf-to-docx"&gt;Convert PDF to Docx&lt;a class="anchor" href="#convert-pdf-to-docx"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="prerequesites-for-macos"&gt;Prerequesites for macos&lt;a class="anchor" href="#prerequesites-for-macos"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install pipx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pipx install pdf2docx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cli-usage"&gt;CLI usage&lt;a class="anchor" href="#cli-usage"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pdf2docx convert file.pdf file.docx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sources"&gt;Sources&lt;a class="anchor" href="#sources"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;(&lt;a href="https://github.com/ArtifexSoftware/pdf2docx%29[https://github.com/ArtifexSoftware/pdf2docxe]"&gt;https://github.com/ArtifexSoftware/pdf2docx)[https://github.com/ArtifexSoftware/pdf2docxe]&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Économiser de l'espace: PDF, Images et Vidéos</title><link>https://notes.ducatillon.net/fr/docs/productivity/save-storage-pdf-images-videos/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/productivity/save-storage-pdf-images-videos/</guid><description>&lt;h2 id="compress-pdf-offline"&gt;Compress PDF offline&lt;a class="anchor" href="#compress-pdf-offline"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://www.ghostscript.com/images/logos/ghostscript-plus-text.png" alt="Ghoscript_logo" /&gt;&lt;/p&gt;
&lt;p&gt;I found this great tool to compress pdf (python script) from the command line.&lt;/p&gt;
&lt;h3 id="requirements"&gt;Requirements&lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="python"&gt;Python&lt;a class="anchor" href="#python"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Check your python version&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ ~ python --version
Python 3.8.9&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="ghoscript"&gt;Ghoscript&lt;a class="anchor" href="#ghoscript"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Check your ghoscript version&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;➜ ~ gs
GPL Ghostscript 10.0.0 (2022-09-21)&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="setup"&gt;Setup&lt;a class="anchor" href="#setup"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Add this command in your &lt;code&gt;.bash_profile&lt;/code&gt; or &lt;code&gt;.zshrc&lt;/code&gt; file&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Usage: spdf [input file] [output file] [screen*|ebook|printer|prepress]
spdf() {
 gs -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dBATCH -dPDFSETTINGS=/${3:-&amp;#34;screen&amp;#34;} -dCompatibilityLevel=1.4 -sOutputFile=&amp;#34;$2&amp;#34; &amp;#34;$1&amp;#34;
}&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="usage"&gt;Usage&lt;a class="anchor" href="#usage"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;spdf BigFile.pdf SmallFile.pdf ebook&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="image-command-lines"&gt;Image command lines&lt;a class="anchor" href="#image-command-lines"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="batch-resize-image"&gt;Batch resize image&lt;a class="anchor" href="#batch-resize-image"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id="usage-1"&gt;Usage&lt;a class="anchor" href="#usage-1"&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ~ sips -Z 720 *.jpg&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Adjsut max image ratio examples: 640,720,1024,1280 etc.&lt;/p&gt;</description></item><item><title>Enregistrement écran Mac avec audio</title><link>https://notes.ducatillon.net/fr/docs/productivity/mac-screen-record-with-audio/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/productivity/mac-screen-record-with-audio/</guid><description>&lt;h2 id="mac-os-screen-record-with-audio-for-free"&gt;Mac OS Screen record with audio for free&lt;a class="anchor" href="#mac-os-screen-record-with-audio-for-free"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://km.support.apple.com/kb/image.jsp?productid=124912&amp;amp;size=240x240" alt="Quicktime" /&gt;&lt;/p&gt;
&lt;p&gt;This &lt;a href="https://www.youtube.com/watch?v=prUVS0HF2gU"&gt;video&lt;/a&gt; explains very clearly how to record your screen with audio on mac os for free.&lt;/p&gt;
&lt;p&gt;Without audio just use quicktime:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://notes.ducatillon.net/img/quicktime_screen_recording.png" alt="Screen REcord With Quicktime" /&gt;&lt;/p&gt;
&lt;h3 id="sources"&gt;Sources&lt;a class="anchor" href="#sources"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device"&gt;https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Exclure une ressource d'un Page Bundle</title><link>https://notes.ducatillon.net/fr/docs/hugo/exclude-resource-from-page-bundle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/hugo/exclude-resource-from-page-bundle/</guid><description>&lt;h1 id="exclude-a-specific-resource-from-a-page-bundle"&gt;Exclude a specific Resource from a Page Bundle&lt;a class="anchor" href="#exclude-a-specific-resource-from-a-page-bundle"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This code block prevents a specific image (resource) from being included in the page bundle.
This is useful when you want to exclude a specific image from being included in the page bundle.
In this example, the image &lt;code&gt;header.jpg&lt;/code&gt; is excluded from the page bundle.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ $images := .Resources.ByType &amp;#34;image&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ range $images }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- Exclude header.jpg --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ $relPermalink := .RelPermalink }} &lt;span style="color:#75715e"&gt;&amp;lt;!-- Get the relative permalink of the image --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ $filename := index (split $relPermalink &amp;#34;/&amp;#34;) (sub (len (split $relPermalink &amp;#34;/&amp;#34;)) 1) }} &lt;span style="color:#75715e"&gt;&amp;lt;!-- Extract the filename --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ $baseFilename := (split $filename &amp;#34;.&amp;#34;) }} &lt;span style="color:#75715e"&gt;&amp;lt;!-- Split the filename by &amp;#34;.&amp;#34; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ $baseFilename := index $baseFilename 0 }} &lt;span style="color:#75715e"&gt;&amp;lt;!-- Take the first part of the split result (before the dot) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt; {{ $filename }}&amp;lt;/&lt;span style="color:#f92672"&gt;span&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ if not (eq $baseFilename &amp;#34;header&amp;#34;) }} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;!-- Exclude header.jpg --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ $image := .Resize &amp;#34;960x webp&amp;#34; }} 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;img&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;{{ $image.RelPermalink }}&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{ end }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Git Submodules</title><link>https://notes.ducatillon.net/fr/docs/devops/git-submodules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/git-submodules/</guid><description>&lt;h1 id="demystifying-git-submodules-a-comprehensive-guide"&gt;Demystifying Git Submodules: A Comprehensive Guide&lt;a class="anchor" href="#demystifying-git-submodules-a-comprehensive-guide"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Git submodules allow you to keep one Git repository as a subdirectory of another. This is a powerful feature for managing dependencies while keeping their histories separate.&lt;/p&gt;
&lt;p&gt;In this guide, we&amp;rsquo;ll use the terms &lt;strong&gt;Main Project (Parent)&lt;/strong&gt; and &lt;strong&gt;Submodule (Child)&lt;/strong&gt; to explain the logic.&lt;/p&gt;
&lt;h2 id="1-what-is-a-git-submodule"&gt;1. What is a Git Submodule?&lt;a class="anchor" href="#1-what-is-a-git-submodule"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A submodule is &lt;strong&gt;not&lt;/strong&gt; just a copy of a folder. It is a &lt;strong&gt;pointer&lt;/strong&gt; to a specific commit in another repository.&lt;/p&gt;</description></item><item><title>Github Pages</title><link>https://notes.ducatillon.net/fr/docs/devops/githubpages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/githubpages/</guid><description>&lt;h2 id="static-content-hosting-with-github-pages"&gt;Static content hosting with GitHub Pages&lt;a class="anchor" href="#static-content-hosting-with-github-pages"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s review the nuances between site types and how to automate their deployment.&lt;/p&gt;
&lt;h3 id="github-pages-site-types"&gt;GitHub Pages Site Types&lt;a class="anchor" href="#github-pages-site-types"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Feature&lt;/th&gt;
 &lt;th style="text-align: left"&gt;User Site&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Organization Site&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Project Site&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Primary Intent&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Personal portfolio, resume, or central hub.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Brand, company, or collective identity.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Documentation or landing page for a specific repo.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Repo Naming&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;username.github.io&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;orgname.github.io&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;any-repo-name&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Default URL&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;https://username.github.io&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;https://orgname.github.io&lt;/code&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;code&gt;https://username.github.io/repo/&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Apex Domain&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Supported&lt;/strong&gt; (e.g., &lt;code&gt;domain.com&lt;/code&gt;).&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Supported&lt;/strong&gt; (e.g., &lt;code&gt;company.com&lt;/code&gt;).&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Supported&lt;/strong&gt; (e.g., &lt;code&gt;project.com&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Subdomain&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Supported&lt;/strong&gt; (e.g., &lt;code&gt;user.domain.com&lt;/code&gt;).&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Supported&lt;/strong&gt; (e.g., &lt;code&gt;org.domain.com&lt;/code&gt;).&lt;/td&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Supported&lt;/strong&gt; (e.g., &lt;code&gt;docs.domain.com&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Capacity&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;One (1) per account.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;One (1) per organization.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Unlimited per account/org.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;Permissions&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Individual ownership.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Shared team administrative access.&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Inherited from the project repository.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="deployment-workflow-strategies"&gt;Deployment Workflow Strategies&lt;a class="anchor" href="#deployment-workflow-strategies"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Static site generators (SSGs) like Hugo or MkDocs require a build step to turn source files into HTML. How you handle that build defines your workflow.&lt;/p&gt;</description></item><item><title>La variable PATH expliquée</title><link>https://notes.ducatillon.net/fr/docs/devops/pathpath/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/pathpath/</guid><description>&lt;h1 id="path-variable-explained"&gt;PATH variable explained&lt;a class="anchor" href="#path-variable-explained"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="the-path-variable"&gt;The &lt;code&gt;$PATH&lt;/code&gt; variable&lt;a class="anchor" href="#the-path-variable"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;lists directories to search fro executables&lt;/li&gt;
&lt;li&gt;only contains the directory paths where executables live&lt;/li&gt;
&lt;li&gt;itself never contains any executables (like &amp;ldquo;python&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="see-all-directories-in-your-path"&gt;See all directories in your PATH&lt;a class="anchor" href="#see-all-directories-in-your-path"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;echo $PATH | tr ':' '\n'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We see directories like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/usr/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/opt/homebrew/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Executables INSIDE those directories:
ls /usr/local/bin | grep python
ls /opt/homebrew/bin | grep python
ls /usr/bin | grep python&lt;/p&gt;
&lt;h3 id="this-shows-the-first-python3-found-in-path"&gt;This shows the first python3 found in PATH&lt;a class="anchor" href="#this-shows-the-first-python3-found-in-path"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;which python3&lt;/code&gt;
&amp;ndash; /usr/local/bin/python3&lt;/p&gt;</description></item><item><title>Le cycle vertueux de la revue de code</title><link>https://notes.ducatillon.net/fr/docs/process/the-virtuous-cycle-of-code-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/process/the-virtuous-cycle-of-code-review/</guid><description>&lt;h1 id="the-virtuous-cycle-of-code-reviews"&gt;The virtuous cycle of Code Reviews&lt;a class="anchor" href="#the-virtuous-cycle-of-code-reviews"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://notes.ducatillon.net/img/code-review.jpeg" alt="Photo by Alvaro Reyes on Unsplash" /&gt;
&lt;em&gt;&lt;a href="https://unsplash.com/license"&gt;https://unsplash.com/license&lt;/a&gt; Photo by Alvaro Reyes on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;a class="anchor" href="#introduction"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yet another article dealing with Code Reviews. Indeed it is. But I really believe this is worth it! I have little experience as a developer within Agile teams but enough to be convinced how much benefits and serenity it brings to &lt;strong&gt;people&lt;/strong&gt;, &lt;strong&gt;products&lt;/strong&gt; and &lt;strong&gt;organisations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get straight to the point.&lt;/p&gt;</description></item><item><title>Les licences logicielles expliquées</title><link>https://notes.ducatillon.net/fr/docs/opensource/licences/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/opensource/licences/</guid><description>&lt;h1 id="software-licences-explained"&gt;Software Licences Explained&lt;a class="anchor" href="#software-licences-explained"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Licenses are responses to historical pressures, not abstract ideologies.
👉 It&amp;rsquo;s basically choosing a social contract, not a legal detail.&lt;/p&gt;
&lt;h2 id="tldr"&gt;TLDR&lt;a class="anchor" href="#tldr"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MIT&lt;/strong&gt; → &lt;em&gt;Freedom without obligations&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache 2.0&lt;/strong&gt; → &lt;em&gt;Freedom with legal safety&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPL&lt;/strong&gt; → &lt;em&gt;Freedom with reciprocity&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="licence-summary"&gt;Licence summary&lt;a class="anchor" href="#licence-summary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;License&lt;/th&gt;
 &lt;th&gt;Birthdate&lt;/th&gt;
 &lt;th&gt;Creator / Origin&lt;/th&gt;
 &lt;th&gt;Mental model&lt;/th&gt;
 &lt;th&gt;Commercial use?&lt;/th&gt;
 &lt;th&gt;Closed-source allowed?&lt;/th&gt;
 &lt;th&gt;What must be shared&lt;/th&gt;
 &lt;th&gt;Famous examples&lt;/th&gt;
 &lt;th&gt;Who profits&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Unlicense&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;~2010&lt;/td&gt;
 &lt;td&gt;Public domain attempt&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Do literally anything.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;Nothing&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Anyone&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1988&lt;/td&gt;
 &lt;td&gt;MIT (academia)&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Take it and run.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;Keep license notice&lt;/td&gt;
 &lt;td&gt;NumPy, Flask, Requests&lt;/td&gt;
 &lt;td&gt;Everyone&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;BSD (2/3-Clause)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1988&lt;/td&gt;
 &lt;td&gt;UC Berkeley&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Open code, no strings.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;Keep copyright notice&lt;/td&gt;
 &lt;td&gt;FreeBSD, OpenSSH&lt;/td&gt;
 &lt;td&gt;Apple, Juniper&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Apache 2.0&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2004&lt;/td&gt;
 &lt;td&gt;Apache Software Foundation&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Open, but legally safe.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;Preserve notices + patent peace&lt;/td&gt;
 &lt;td&gt;Kubernetes, Spark, Kafka&lt;/td&gt;
 &lt;td&gt;Google, Confluent&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MPL 2.0&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1998&lt;/td&gt;
 &lt;td&gt;Netscape / Mozilla&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Open files, closed products.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;⚠️ Except MPL files&lt;/td&gt;
 &lt;td&gt;Modified MPL files&lt;/td&gt;
 &lt;td&gt;Firefox&lt;/td&gt;
 &lt;td&gt;Mozilla&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;LGPL&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1991&lt;/td&gt;
 &lt;td&gt;Free Software Foundation&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Share the core, not the app.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;⚠️ App yes, library no&lt;/td&gt;
 &lt;td&gt;Changes to LGPL library&lt;/td&gt;
 &lt;td&gt;glibc, FFmpeg&lt;/td&gt;
 &lt;td&gt;Red Hat, IBM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GPL (v2/v3)&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;1989 (v1)&lt;/td&gt;
 &lt;td&gt;Richard Stallman (FSF)&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;Take it, but give back.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;❌ No (if distributed)&lt;/td&gt;
 &lt;td&gt;Full source + same license&lt;/td&gt;
 &lt;td&gt;Linux kernel, WordPress, Git&lt;/td&gt;
 &lt;td&gt;Automattic, Red Hat, Canonical, GitLab&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;AGPL&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;2007&lt;/td&gt;
 &lt;td&gt;FSF + Affero Inc.&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;SaaS must share too.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;❌ No (incl. SaaS)&lt;/td&gt;
 &lt;td&gt;Source, incl. network use&lt;/td&gt;
 &lt;td&gt;Nextcloud, Mastodon&lt;/td&gt;
 &lt;td&gt;Nextcloud GmbH&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Proprietary&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Vendor-defined&lt;/td&gt;
 &lt;td&gt;&lt;em&gt;You rent, not share.&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;⚠️ Limited&lt;/td&gt;
 &lt;td&gt;✅ Yes&lt;/td&gt;
 &lt;td&gt;Fees, data, compliance&lt;/td&gt;
 &lt;td&gt;Windows, macOS&lt;/td&gt;
 &lt;td&gt;Microsoft, Apple&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="how-do-companies-monetize-open-source"&gt;How do companies monetize open source?&lt;a class="anchor" href="#how-do-companies-monetize-open-source"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most organizations and individuals make money with open-source software through:&lt;/p&gt;</description></item><item><title>Origines des systèmes d'exploitation</title><link>https://notes.ducatillon.net/fr/docs/opensource/os_origins/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/opensource/os_origins/</guid><description>&lt;h1 id="os-origins"&gt;OS Origins&lt;a class="anchor" href="#os-origins"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Where did Linux / Windows / macOS come from?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A concise overview of how modern operating systems evolved — from early UNIX systems to Linux distributions, Windows NT, macOS, Android, and Chrome OS.&lt;/p&gt;
&lt;blockquote class="book-hint info"&gt;
&lt;p&gt;&lt;strong&gt;💡Tip💡&lt;/strong&gt;&lt;br&gt;
👉Zoom in anywhere on the graph&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="mermaid"&gt;
graph TB

%% ========= USAGE COLOR DEFINITIONS =========
classDef desktop fill:#E8EEF3,stroke:#777;
classDef server fill:#F3EFEA,stroke:#777;
classDef hybrid fill:#E9F1EC,stroke:#777;

%% ========= LEGEND =========
subgraph LEGEND[&amp;#34;Legend&amp;#34;]
 direction TB
 D1[Desktop / User-facing]:::desktop
 D2[Server / Infrastructure]:::server
 D3[Hybrid usage]:::hybrid
 D4[Solid arrow → Direct code lineage]
 D5[Dashed arrow → Influence / POSIX / UNIX-like]
end

%% ========= EARLY SYSTEMS =========
subgraph EARLY[&amp;#34;Early Systems&amp;#34;]
 direction TB
 CP[CP/M&amp;lt;br/&amp;gt;1974&amp;lt;br/&amp;gt;Gary Kildall]:::server
 DOS[MS-DOS&amp;lt;br/&amp;gt;1981&amp;lt;br/&amp;gt;Microsoft]:::desktop
 CP --&amp;gt; DOS
end

%% ========= UNIX ROOT =========
subgraph UNIX[&amp;#34;UNIX Family&amp;#34;]
 direction TB
 U[UNIX&amp;lt;br/&amp;gt;1969&amp;lt;br/&amp;gt;Bell Labs]:::server
 BSD[BSD Unix&amp;lt;br/&amp;gt;1977&amp;lt;br/&amp;gt;Berkeley]:::server
 SYSV[System V&amp;lt;br/&amp;gt;1983&amp;lt;br/&amp;gt;AT&amp;amp;T]:::server
 U --&amp;gt; BSD
 U --&amp;gt; SYSV
end

%% ========= BSD DERIVATIVES =========
subgraph BSD_SYS[&amp;#34;BSD-derived Systems&amp;#34;]
 direction TB
 DARWIN[Darwin / XNU&amp;lt;br/&amp;gt;2000&amp;lt;br/&amp;gt;Apple]:::hybrid
 MAC[macOS&amp;lt;br/&amp;gt;2001]:::desktop
 IOS[iOS / iPadOS&amp;lt;br/&amp;gt;2007]:::desktop
 BSDOS[FreeBSD / OpenBSD / NetBSD&amp;lt;br/&amp;gt;1993–1996]:::server
 BSD --&amp;gt; DARWIN
 DARWIN --&amp;gt; MAC
 DARWIN --&amp;gt; IOS
 BSD --&amp;gt; BSDOS
end

%% ========= CLASSIC MAC =========
CLASSIC[Classic Mac OS&amp;lt;br/&amp;gt;1984&amp;lt;br/&amp;gt;Apple]:::desktop
CLASSIC -.-&amp;gt; MAC

%% ========= MINIX =========
MINIX[MINIX&amp;lt;br/&amp;gt;1987&amp;lt;br/&amp;gt;Andrew S. Tanenbaum]:::server

%% ========= LINUX KERNEL =========
subgraph LINUX[&amp;#34;Linux Kernel&amp;#34;]
 direction TB
 LINUXK[Linux Kernel&amp;lt;br/&amp;gt;1991&amp;lt;br/&amp;gt;Linus Torvalds]:::server
end

%% ========= LINUX DISTRIBUTIONS CALLOUT =========
subgraph LINUXDIST[&amp;#34;Linux Distributions&amp;#34;]
 direction TB
 NOTE[Linux is a kernel.&amp;lt;br/&amp;gt;Distributions combine it with&amp;lt;br/&amp;gt;userland, package managers,&amp;lt;br/&amp;gt;and policies.]:::hybrid
end
LINUXK --&amp;gt; NOTE

%% ========= EARLY LINUX DISTROS =========
subgraph EARLYDIST[&amp;#34;Early Linux Distributions&amp;#34;]
 direction TB
 SLACK[Slackware&amp;lt;br/&amp;gt;1993]:::server
 DEB[Debian&amp;lt;br/&amp;gt;1993]:::server
 RH[Red Hat Linux&amp;lt;br/&amp;gt;1994]:::server
 LINUXK --&amp;gt; SLACK
 LINUXK --&amp;gt; DEB
 LINUXK --&amp;gt; RH
end

%% ========= DEBIAN FAMILY =========
subgraph DEBFAM[&amp;#34;Debian Family&amp;#34;]
 direction TB
 UB[Ubuntu&amp;lt;br/&amp;gt;2004&amp;lt;br/&amp;gt;Canonical]:::hybrid
 MINT[Linux Mint&amp;lt;br/&amp;gt;2006]:::desktop
 KALI[Kali Linux&amp;lt;br/&amp;gt;2013]:::server
 DEB --&amp;gt; UB
 UB --&amp;gt; MINT
 DEB --&amp;gt; KALI
end

%% ========= RED HAT FAMILY =========
subgraph RHF[&amp;#34;Red Hat Family&amp;#34;]
 direction TB
 FED[Fedora&amp;lt;br/&amp;gt;2003]:::hybrid
 RHEL[RHEL&amp;lt;br/&amp;gt;2002]:::server
 CLONES[RHEL Clones&amp;lt;br/&amp;gt;CentOS / Alma / Rocky&amp;lt;br/&amp;gt;2004–2021]:::server
 RH --&amp;gt; FED --&amp;gt; RHEL --&amp;gt; CLONES
end

%% ========= INDEPENDENT DISTROS =========
subgraph INDEP[&amp;#34;Independent Linux Distributions&amp;#34;]
 direction TB
 ARCH[Arch Linux&amp;lt;br/&amp;gt;2002]:::hybrid
 GENTOO[Gentoo&amp;lt;br/&amp;gt;2002]:::hybrid
 LINUXK --&amp;gt; ARCH
 LINUXK --&amp;gt; GENTOO
end

%% ========= MOBILE / SPECIALIZED =========
subgraph MOBILE[&amp;#34;Mobile / Specialized Linux&amp;#34;]
 direction TB
 AND[Android&amp;lt;br/&amp;gt;2008&amp;lt;br/&amp;gt;Google]:::desktop
 CHROMIUM[Chromium OS&amp;lt;br/&amp;gt;2009]:::hybrid
 CHROME[Chrome OS&amp;lt;br/&amp;gt;2011]:::desktop
 LINUXK --&amp;gt; AND
 LINUXK --&amp;gt; CHROMIUM --&amp;gt; CHROME
end

%% ========= WINDOWS =========
subgraph WINDOWS[&amp;#34;Windows NT Family&amp;#34;]
 direction TB
 NT[Windows NT&amp;lt;br/&amp;gt;1993]:::server
 W2K[Windows 2000 / XP&amp;lt;br/&amp;gt;2000–2001]:::hybrid
 W7[Windows 7&amp;lt;br/&amp;gt;2009]:::hybrid
 W10[Windows 10 / 11&amp;lt;br/&amp;gt;2015–2021]:::desktop
 NT --&amp;gt; W2K --&amp;gt; W7 --&amp;gt; W10
end

%% ========= INFLUENCE LINKS =========
U -.-&amp;gt;|POSIX / UNIX concepts| LINUXK
MINIX -.-&amp;gt;|UNIX-like| LINUXK
DOS --&amp;gt; NT

%% ========= SUBGRAPH STYLING =========
style UNIX fill:#FBF2EA,stroke:#B85C38,stroke-width:2.5px
style BSD_SYS fill:#EEF3F8,stroke:#4A6FA5,stroke-width:2.5px
style LINUX fill:#F6F1E7,stroke:#9C8A4D,stroke-width:2.5px
style EARLYDIST fill:#EDF4EF,stroke:#5C8A72,stroke-width:2px
style DEBFAM fill:#EAF3F1,stroke:#4F8F8B,stroke-width:2px
style RHF fill:#F4EEE9,stroke:#9A6B4F,stroke-width:2px
style INDEP fill:#F1F3F3,stroke:#6B7280,stroke-width:2px
style MOBILE fill:#FAF0EB,stroke:#C97C5D,stroke-width:2px
style WINDOWS fill:#EEF2F7,stroke:#3A5F8C,stroke-width:2.5px
style EARLY fill:#F4F4F2,stroke:#7A7A7A,stroke-width:2px
style LEGEND fill:#F6F6F6,stroke:#999,stroke-width:1.8px
style LINUXDIST fill:#EDF2F7,stroke:#5A6F8E,stroke-width:2px
&lt;/pre&gt;&lt;script src="https://notes.ducatillon.net/mermaid.min.js" onload="mermaid.initialize({&amp;#34;flowchart&amp;#34;:{&amp;#34;useMaxWidth&amp;#34;:true},&amp;#34;theme&amp;#34;:&amp;#34;default&amp;#34;})"&gt;&lt;/script&gt;</description></item><item><title>Traitement de fichiers en lot</title><link>https://notes.ducatillon.net/fr/docs/devops/batch-process-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://notes.ducatillon.net/fr/docs/devops/batch-process-files/</guid><description>&lt;h2 id="script-that-removes-all-lines-containing-foo-in-all-md-files-into-the-current-folder-recursively"&gt;Script that removes all lines containing foo in all .md files into the current folder recursively&lt;a class="anchor" href="#script-that-removes-all-lines-containing-foo-in-all-md-files-into-the-current-folder-recursively"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# If a command fails then the deploy stops&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;printf &lt;span style="color:#e6db74"&gt;&amp;#34;\033[0;32mProcessing all files in current directory...\033[0m\n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Find all .md files in the current directory and subdirectories&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type f -name &lt;span style="color:#e6db74"&gt;&amp;#34;*.md&amp;#34;&lt;/span&gt; | &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read file; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Run vim on each file to remove all lines containing foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vim -es -c &lt;span style="color:#e6db74"&gt;&amp;#34;:g/foo/d&amp;#34;&lt;/span&gt; -c &lt;span style="color:#e6db74"&gt;&amp;#34;:wq&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$file&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>