<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title></title>
      <link>/</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Mon, 04 Aug 2025 00:00:00 +0000</lastBuildDate>
      <item>
          <title>DoSomething(string foo = &quot;WTF&quot;)</title>
          <pubDate>Mon, 04 Aug 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/dev_null/csharp-default-arguments/</link>
          <guid>/dev_null/csharp-default-arguments/</guid>
          <description xml:base="/dev_null/csharp-default-arguments/">&lt;p&gt;Ça maintenant quelques mois que j’écris du C# au quotidien, l’occasion pour moi de découvrir quelques joyeusetés.&lt;&#x2F;p&gt;
&lt;p&gt;Il y a quelques semaines, je voulais changer la signature d’une méthode et, pour éviter de tout casser, avoir une valeur par défaut.&lt;&#x2F;p&gt;
&lt;p&gt;Comme toute bonne codebase OOP, on ne dépend pas de classes concrètes mais d’interface.&lt;&#x2F;p&gt;
&lt;p&gt;Donc la question est : à quel niveau mettre la valeur par défaut.&lt;&#x2F;p&gt;
&lt;p&gt;Et la réponse est : on peut la mettre à peu près partout.&lt;&#x2F;p&gt;
&lt;p&gt;Par exemple:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;interface&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; IFoo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; DoSomething&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;from the interface&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; IFoo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; DoSomething&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;from the class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hello &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et à l’usage, ça dépendra du type qu’on donne à la variable:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Outputs &amp;quot;Hello from the class&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;foo&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;DoSomething&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;IFoo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Outputs &amp;quot;Hello from the interface&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;foo&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;DoSomething&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Évidemment, si naïvement on enlève la valeur par défaut dans la méthode de la classe concrète pensant qu&#x27;on utilisera celle de l’interface : nope nope.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;csharp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; IFoo&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    void&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; DoSomething&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Hello &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Foo&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; ça compile pas (╯°□°）╯︵ ┻━┻&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;foo&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;DoSomething&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Vous avez maintenant une nouvelle manière d’introduire des bugs dans votre codebase, ne me remerciez pas.&lt;&#x2F;p&gt;
&lt;p&gt;Voilà, c’était tout pour aujourd’hui.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Avril 2025</title>
          <pubDate>Sun, 04 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2025-04/</link>
          <guid>/links/2025-04/</guid>
          <description xml:base="/links/2025-04/">&lt;h2 id=&quot;la-news-du-mois&quot;&gt;La news du mois&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;shows.acast.com&#x2F;floodcast&#x2F;episodes&#x2F;il-sagissait-du-floodcast&quot;&gt;Il s&#x27;agissait du Floodcast&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pro-tips&quot;&gt;Pro-tips&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jvns.ca&#x2F;blog&#x2F;2016&#x2F;08&#x2F;31&#x2F;asking-questions&#x2F;&quot;&gt;Asking good questions is hard (but worth it)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;@duretti&#x2F;confronting-jargon-7d39c8dd9353&quot;&gt;Confronting jargon&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;c-est-tout-nouveau&quot;&gt;C&#x27;est tout nouveau&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;davepeck.org&#x2F;2025&#x2F;04&#x2F;11&#x2F;pythons-new-t-strings&#x2F;&quot;&gt;Python&#x27;s new t-strings&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;blog&#x2F;h1-element-styles&#x2F;&quot;&gt;Default styles for h1 elements are changing&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;riih-rewrite-it-in-haskell&quot;&gt;RIIH (Rewrite It In Haskell)&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bitbashing.io&#x2F;haskell-concurrency.html&quot;&gt;Concurrency in Haskell: Fast, Simple, Correct&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;entropicthoughts.com&#x2F;search-index-150-lines-haskell&quot;&gt;Search index in 150 lines of Haskell&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;byorgey.github.io&#x2F;blog&#x2F;posts&#x2F;2024&#x2F;11&#x2F;27&#x2F;stacks-queues.html&quot;&gt;Competitive programming in Haskell : stacks, queues and monoidal sliding windows&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;entropicthoughts.com&#x2F;parser-combinators-beat-regexes&quot;&gt;Parser combinators beat regexes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aie&quot;&gt;AÏe&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=JeNS1ZNHQs8&quot;&gt;Interview with Vibe Coder in 2025&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=xnGimEqnyBE&quot;&gt;ChatGPT Mistakes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;en-vrac&quot;&gt;En vrac&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;thume.ca&#x2F;2017&#x2F;06&#x2F;17&#x2F;tree-diffing&#x2F;&quot;&gt;Designing a Tree diff algorithm using dynamic programming and A*&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;buttondown.com&#x2F;hillelwayne&#x2F;archive&#x2F;requirements-change-until-they-dont&#x2F;&quot;&gt;Requirements change until they don&#x27;t&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;0x1.pt&#x2F;2025&#x2F;04&#x2F;06&#x2F;the-insanity-of-being-a-software-engineer&#x2F;&quot;&gt;The insanity of being a software engineer&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;matduggan.com&#x2F;slack-the-art-of-being-busy-without-getting-anything-done&#x2F;&quot;&gt;Slack: the art of being busy without getting anything done&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hteumeuleu.fr&#x2F;eco-conception-et-dithering&#x2F;&quot;&gt;Eco-conception et dithering&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;leanrada.com&#x2F;notes&#x2F;css-only-lqip&#x2F;&quot;&gt;Minimal CSS-only blurry image placeholders&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.jle.im&#x2F;entry&#x2F;faking-adts-and-gadts.html&quot;&gt;Faking ADTs and GADTs in languages that shoudln&#x27;t have them&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;webkit.org&#x2F;blog&#x2F;16547&#x2F;better-typography-with-text-wrap-pretty&#x2F;&quot;&gt;Better typography with text-wrap pretty&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;opencollective.com&#x2F;styled-components&#x2F;updates&#x2F;thank-you&quot;&gt;Thank you Styled Components&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;newsletter.manager.dev&#x2F;p&#x2F;the-13-software-engineering-laws&quot;&gt;The 13 software engineering laws&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Mars 2025</title>
          <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2025-03/</link>
          <guid>/links/2025-03/</guid>
          <description xml:base="/links/2025-03/">&lt;h2 id=&quot;du-neuf-du-cote-typescript&quot;&gt;Du neuf du côté TypeScript&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devblogs.microsoft.com&#x2F;typescript&#x2F;announcing-typescript-5-8&#x2F;&quot;&gt;Announcing TypeScript 5.8&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devblogs.microsoft.com&#x2F;typescript&#x2F;typescript-native-port&#x2F;&quot;&gt;A 10x Faster TypeScript&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;non-mais-alloy-quoi&quot;&gt;Non mais Alloy quoi&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alloytools.discourse.group&#x2F;t&#x2F;alloy-6-2-0-released&#x2F;508&quot;&gt;Alloy 6.2.0 released&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;practicalalloy.github.io&#x2F;&quot;&gt;Practical Alloy - A hands-on guide to formal software design&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;du-neovim&quot;&gt;Du neovim&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gpanders.com&#x2F;blog&#x2F;whats-new-in-neovim-0-11&#x2F;&quot;&gt;What&#x27;s new in neovim 0.11&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hugosum.com&#x2F;blog&#x2F;adding-types-to-your-neovim-configuration&quot;&gt;Adding types to your neovim configuration&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;blogpost-en-serie&quot;&gt;Blogpost en série&lt;&#x2F;h2&gt;
&lt;p&gt;Making a clean architecture blog engine from scratch - &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cekrem.github.io&#x2F;posts&#x2F;replacing-hugo-with-kotlin-clean-architecture&#x2F;&quot;&gt;part 1&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cekrem.github.io&#x2F;posts&#x2F;double-loop-tdd-blog-engine-pt2&#x2F;&quot;&gt;part 2&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cekrem.github.io&#x2F;posts&#x2F;refactoring-towards-cleaner-boundaries&#x2F;&quot;&gt;part 3&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jdrouet.github.io&#x2F;posts&#x2F;202503161800-search-engine-intro&#x2F;&quot;&gt;Building a search engine from scratch, in Rust&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ryanbrewer.dev&#x2F;posts&#x2F;sequent-calculus&quot;&gt;Par part 1: Sequent calculus&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;thunderseethe.dev&#x2F;series&#x2F;making-a-language&#x2F;&quot;&gt;Series: Making a language&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;en-vrac&quot;&gt;En vrac&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tigerbeetle.com&#x2F;blog&#x2F;2025-02-27-why-we-designed-tigerbeetles-docs-from-scratch&#x2F;&quot;&gt;Why We Designed TigerBeetle&#x27;s Docs from Scratch&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stevelosh.com&#x2F;blog&#x2F;2018&#x2F;08&#x2F;a-road-to-common-lisp&#x2F;&quot;&gt;A road to common lisp&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bartoszmilewski.com&#x2F;2013&#x2F;05&#x2F;15&#x2F;understanding-yoneda&#x2F;&quot;&gt;Understanding Yoneda&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;newsletter.eng-leadership.com&#x2F;p&#x2F;15-lessons-from-15-years-in-tech&quot;&gt;15 lessons from 15 years in tech&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.polybdenum.com&#x2F;2025&#x2F;02&#x2F;14&#x2F;designing-type-inference-for-high-quality-type-errors.html&quot;&gt;Designing type inference for high quality type errors&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tweag.io&#x2F;blog&#x2F;2025-01-30-topiary-tutorial-part-1&#x2F;&quot;&gt;Writing a formatter has never been so easy: a Topiary tutorial&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.polybdenum.com&#x2F;2025&#x2F;03&#x2F;01&#x2F;the-problem-with-type-aliases.html&quot;&gt;The problem with type aliases&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dl.acm.org&#x2F;doi&#x2F;pdf&#x2F;10.1145&#x2F;3712057&quot;&gt;Systems correctness practices at AWS&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chrlschn.dev&#x2F;blog&#x2F;2023&#x2F;02&#x2F;react-is-the-new-ibm&#x2F;&quot;&gt;React is the New IBM&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.dgt.is&#x2F;blog&#x2F;2025-01-10-nix-death-by-a-thousand-cuts&#x2F;&quot;&gt;Nix - Death by a thousand cuts&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.erethon.com&#x2F;blog&#x2F;2025&#x2F;02&#x2F;21&#x2F;my-nixos-notes&#x2F;&quot;&gt;My Nix(OS) notes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.gitbutler.com&#x2F;why-is-git-autocorrect-too-fast-for-formula-one-drivers&#x2F;&quot;&gt;Why is Git Autocorrect too fast for Formula One drivers?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.gitbutler.com&#x2F;interdiff-review-with-git-range-diff&#x2F;&quot;&gt;How to do patch-based review with git range-diff&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jamesoswald.dev&#x2F;posts&#x2F;sumtypes&#x2F;&quot;&gt;A Basic Inductive Type Comparison: Rust, Lean, C, C++&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.yossarian.net&#x2F;2025&#x2F;01&#x2F;10&#x2F;Be-aware-of-the-Makefile-effect&quot;&gt;Be aware of the Makefile effect&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;kevinmahoney.co.uk&#x2F;articles&#x2F;my-principles-for-building-software&#x2F;&quot;&gt;My Principles for Building Software&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;photonlines.substack.com&#x2F;p&#x2F;visual-focused-algorithms-cheat-sheet&quot;&gt;Visual-Focused Algorithms Cheat Sheet&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;welltypedwitch.bearblog.dev&#x2F;the-way-were-thinking-about-breaking-changes-is-really-silly&#x2F;&quot;&gt;The way we&#x27;re thinking about breaking changes is really silly&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fly.io&#x2F;blog&#x2F;operationalizing-macaroons&#x2F;&quot;&gt;Operationalizing Macaroons&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.scala-lang.org&#x2F;blog&#x2F;2025&#x2F;03&#x2F;24&#x2F;evolving-scala.html&quot;&gt;Evolving Scala&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jyn.dev&#x2F;terrible-horrible-no-good-very-bad-python&#x2F;&quot;&gt;Terrible Horrible No Good Very Bad Python&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hillelwayne.com&#x2F;post&#x2F;javascript-puzzle&#x2F;&quot;&gt;A Perplexing Javascript Parsing Puzzle&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Janvier 2025</title>
          <pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2025-01/</link>
          <guid>/links/2025-01/</guid>
          <description xml:base="/links/2025-01/">&lt;p&gt;Coucou, ça faisait longtemps 👋&lt;&#x2F;p&gt;
&lt;p&gt;Histoire d&#x27;entamer cette année 2025 (à la bourre, certes) sur le bon pied (ou la bonne roulette de chaise de bureau, ou sur le bon canapé, c’est vous qui choiz’),
je vous propose une petite sélection d’articles et de vidéos plutôt chouettes que j’ai pu croiser ce mois-ci.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;software-co&quot;&gt;Software &amp;amp; co.&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cs.cmu.edu&#x2F;~pavlo&#x2F;blog&#x2F;2025&#x2F;01&#x2F;2024-databases-retrospective.html&quot;&gt;Databases in 2024: A Year in Review&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;infrequently.org&#x2F;2024&#x2F;11&#x2F;if-not-react-then-what&#x2F;&quot;&gt;If Not React, Then What?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.screamingatmyscreen.com&#x2F;django-in-2024&#x2F;&quot;&gt;Django in 2024&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zdimension.fr&#x2F;everyone-gets-bidirectional-bfs-wrong&#x2F;&quot;&gt;Everyone gets bidirectional BFS wrong&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;message-id&#x2F;flat&#x2F;CA%2BRjkXFL6Jy7actUy%2BS%3DdGfjpuD_jpUYYofGpON%2B1Nq9S2Y75w%40mail.gmail.com#f9771ec89bf350e0594cf9640a1f912c&quot;&gt;About the psycopg2 name&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;facundoolano&#x2F;software-papers&quot;&gt;facundoolano&#x2F;software-papers: 📚 A curated list of papers for Software Engineers&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;du-meta&quot;&gt;Du méta&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ntietz.com&#x2F;blog&#x2F;estimating-projects-short-sale&#x2F;&quot;&gt;Estimating projects sells them short (and that&#x27;s okay)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.seangoedecke.com&#x2F;large-established-codebases&#x2F;&quot;&gt;Mistakes engineers make in large established codebases&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mihaiolteanu.me&#x2F;interactive-dev&quot;&gt;A high-velocity style of software development&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;buttondown.com&#x2F;hillelwayne&#x2F;archive&#x2F;stroustrops-rule&#x2F;&quot;&gt;Stroustrup&#x27;s Rule&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quelques-trucs-utiles&quot;&gt;Quelques trucs utiles&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tech.scrive.com&#x2F;exported-for-tests-only-precise-control-over-api-visibility-with-custom-warnings&#x2F;&quot;&gt;Exported for tests only: Precise control over API visibility with custom warnings&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packagemain.tech&#x2F;p&#x2F;essential-clitui-tools-for-developers&quot;&gt;Essential CLI&#x2F;TUI Tools for Developers&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bonjourlafuite.eu.org&#x2F;&quot;&gt;C’est qui qui a fuité aujourd’hui ?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quelques-talks-a-voir&quot;&gt;Quelques talks à voir&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=uRmNSuYBUOU&quot;&gt;What we know we don&#x27;t know - Hillel Wayne - DDD Europe&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=OasaWMC-zPs&quot;&gt;Tempête de boulettes géantes (en prod) - Agnès Haasser&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=XhKcelV7DB&quot;&gt;Why your AI generated talk abstract was rejected for NDC Oslo - Einar Høst - NDC Oslo 2024&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=5TnNlfPU7kY&quot;&gt;Adrienne Braganza Tacke - 👍 Looks GREAT To Me: Getting Past Bare Minimum Code Reviews&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtube.com&#x2F;watch?v=uZ8DcbhojOw&amp;amp;si=3nmf0AAJaClaiQ7Z&quot;&gt;Keynote: Advent of Code, Behind the Scenes - Eric Wastl&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;d-autres-videos-pour-la-route&quot;&gt;D’autres vidéos pour la route&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=-opBifFfsMY&quot;&gt;Generative AI is a Parasitic Cancer&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=v4H2fTgHGuc&quot;&gt;The amazing, but unsettling future of technology... - Fireship&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=4tk8lkmYGWQ&quot;&gt;DOOM: The Dark Ages Trailer&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;@Taskmaster&quot;&gt;Tous les épisodes de Taskmaster UK dispo gratuitement&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The Last Town - une ville contre la Silicon Valley 👉 &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=FldT8h9ceU4&quot;&gt;Partie 1&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=mtMza3iKhR4&quot;&gt;Partie 2&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=xXaoBd-vYM0&quot;&gt;Partie 3&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>git show 2024</title>
          <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/random/git-show-2024/</link>
          <guid>/random/git-show-2024/</guid>
          <description xml:base="/random/git-show-2024/">&lt;blockquote&gt;
&lt;p&gt;Ding-dong, c’est 2025 !&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Le temps passe vite dis donc, et j’ai oublié de passer du temps ici. Quoi de mieux qu’un petit
récap’ de 2024 pour remettre le pied à l’étrier et recommencer à blablater sur ce blog ?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Sur une idée pas très originale, piquée du formidable Siegfried que vous pouvez lire &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ehret.me&#x2F;to-2025-and-beyond&quot;&gt;ici&lt;&#x2F;a&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;le-dev&quot;&gt;Le dev&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;cote-pro&quot;&gt;Côté pro&lt;&#x2F;h3&gt;
&lt;p&gt;Début 2024, je quitte une scale-up désormais connue pour ses déboires malencontreux après un début prometteur (un peu comme la majorité des scale-up en somme).&lt;&#x2F;p&gt;
&lt;p&gt;Sans trop divulguer de détails, elle a, heureusement, été rachetée in-extremis ce qui évite à plusieurs
dizaines de personnes d’être sur le carreau. La magie de Noël j’imagine.&lt;&#x2F;p&gt;
&lt;p&gt;Fin Décembre, pour clôre une &lt;em&gt;longue&lt;&#x2F;em&gt; recherche pour mon nouveau poste (dont j’ai résumé les grandes lignes &lt;a href=&quot;&#x2F;blogposts&#x2F;une-annee-d-entretiens&#x2F;&quot;&gt;ici&lt;&#x2F;a&gt;)
je signe enfin 🎉&lt;&#x2F;p&gt;
&lt;p&gt;Ciao la morosité, et en route pour de nouvelles aventures [...].&lt;&#x2F;p&gt;
&lt;p&gt;Spoiler alert : c’était pas tout à fait ce qui me convenait.&lt;&#x2F;p&gt;
&lt;div style=&quot;width: 50%; margin: auto&quot;&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;random&#x2F;git-show-2024&#x2F;disappointment.gif&quot; alt=&quot;Progressive disappointment&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;En gros :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;je suis allergique à SCRUM à la sauce babysitting&lt;&#x2F;li&gt;
&lt;li&gt;je suis encore plus allergique à la réunionite (conséquence de SCRUM évidemment)&lt;&#x2F;li&gt;
&lt;li&gt;la moitié des presta devs sont remplacés 3 semaines après mon arrivée. Pas pratique pour créer du lien, surtout quand on est un poil introverti.&lt;&#x2F;li&gt;
&lt;li&gt;les process pour du process, c’est légèrement agaçant&lt;&#x2F;li&gt;
&lt;li&gt;ne faire que dépiler du ticket pour dépiler du ticket, ce n’est pas très stimulant&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bref, je passe sur les autres points. On ne peut pas tomber tout le temps dans des contextes épanouissants et c’est okay (tant que ça ne dure pas, j’imagine).
Ça peut convenir à d’autres, donc je ne vais pas jeter la pierre.&lt;&#x2F;p&gt;
&lt;p&gt;Me revoilà donc en train de prospecter ailleurs. Le marché n’est pas au beau fixe et si vous allez lu mon billet précédent, je redoutais un peu de
me réengager dans des process à rallonge.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Et le voilà qui va nous pondre une suite 😑&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;J’aurais pu mais je vous rassure : cette fois-ci ma recherche ne m’a prise que quelques mois. Evidemment je suis tombé sur des cas &lt;em&gt;particuliers&lt;&#x2F;em&gt;
(faute d’autres termes) mais un des process qui n’a pas trop traîné s’est au final très bien passé.&lt;&#x2F;p&gt;
&lt;p&gt;En route pour de nouvelles aventures donc (bis) 🤞&lt;&#x2F;p&gt;
&lt;h3 id=&quot;cd-home&quot;&gt;cd $HOME&lt;&#x2F;h3&gt;
&lt;p&gt;J’ai lâché un peu de leste sur les projets perso. Non pas que j’en ai sorti beaucoup, mais cette année particulièrement,
je n’ai pas réussi à trouver assez de temps ni d’énergie pour coder des bêtises. Mais j’ai fait quelques trucs !&lt;&#x2F;p&gt;
&lt;p&gt;Bon j’avais pour projet de m’investir un peu plus sur LISP, une des dernières bizarreries avec laquelle je n’avais pas
encore joué, l’objectif étant d’essayer de faire l’Advent of Code avec. Autant dire que ce sera pour une autre fois, même si
c’était cool de se mettre à Emacs pendant quelques mois.&lt;&#x2F;p&gt;
&lt;p&gt;A la place, je me suis mis à .NET et C# (pour de futures raisons professionnelles). Pour le moment, c’est une
bouffée d’air frais (enfin, tout est relatif). Depuis bientôt 3 ans, je baigne dans l&#x27;univers Python quotidiennement.&lt;&#x2F;p&gt;
&lt;p&gt;Je n’ai pas spécifiquement de grief contre ce langage (je n’ai bossé que sur du CRUD classique), mais le tooling est une plaie constante.&lt;&#x2F;p&gt;
&lt;p&gt;Et devoir convaincre des gens d’utiliser des outils comme &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;ruff&#x2F;&quot;&gt;ruff&lt;&#x2F;a&gt; ou &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mypy-lang.org&#x2F;&quot;&gt;mypy&lt;&#x2F;a&gt; pour
avoir un dixième des garanties que j’aurais pu avoir sans effort avec Haskell est : fatigant. Surtout quand ces mêmes gens ne
s’y intéressent pas.&lt;&#x2F;p&gt;
&lt;p&gt;Sans tomber dans le trash-talk gratuit, la quantité de bugs débiles que j’ai pu corriger sur des codebase python est exaspérante.
Adieu les véléités de refactoring, parce que ça devient une tâche trop risquée.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;[mandatory rant about ORMs]&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Et je n’inclus pas les problèmes de perfs liés
à un usage qu’on qualifiera de naïf de SQLAlchemy (ou d’autre ORMs).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;[&#x2F;mandatory rant about ORMs]&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Au final, j’ai fait la moitié de l’Advent of Code en C# et c’était chouette. Maintenant, l’objectif est de pouvoir
écrire des webservices classiques en .NET en y perdant le moins de cheveux possible.&lt;&#x2F;p&gt;
&lt;p&gt;En parlant d’Advent of Code, j’étais un poil plus relax que &lt;a href=&quot;&#x2F;blogposts&#x2F;aoc-2023&#x2F;&quot;&gt;l’an dernier&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Ce n’est pas grand chose, mais réussir à faire fonctionner son petit algo de pathfinding ou de programmation dynamique, et bien ça fait plaisir.&lt;&#x2F;p&gt;
&lt;p&gt;Les catégories de problèmes sont, au final, assez restreintes et à force de faire on choppe des automatismes.&lt;&#x2F;p&gt;
&lt;p&gt;Notons que ça ne me sert toujours absolument à rien dans mon quotidien, mais on cherche la stimulation où on peut !&lt;&#x2F;p&gt;
&lt;p&gt;Je ferai la deuxième moitié à l’occasion, si je trouve un peu de temps et d’envie.&lt;&#x2F;p&gt;
&lt;p&gt;Si au boulot, je me suis vite tourné vers VS Code (sans grande conviction), sur mon laptop perso je continue d’utiliser NeoVim (depuis pas mal d’années maintenant).&lt;&#x2F;p&gt;
&lt;p&gt;Et qui dit nouvelle année dit : réécrire sa config from scratch en se promettant d’avoir quelque chose de plus léger !&lt;&#x2F;p&gt;
&lt;p&gt;Je ne sais pas si le passage de VimScript à Lua a débloqué quelque chose, mais toucher à sa config est moins pénible.&lt;&#x2F;p&gt;
&lt;p&gt;La communauté et les plugins qui sortent me font aimer cet éditeur encore un peu plus, et je ne suis sans doute pas près de lâcher.&lt;&#x2F;p&gt;
&lt;p&gt;A côté de ça, un peu fatigué d’Alacritty, je suis passé sur WezTerm et forcément j’ai arrêté d’utiliser Zellij. Quant aux valeurs sûres, je garde
toujours dans un coin un Lazygit, ripgrep et un HTTPie (j’en ai sûrement oublié d’autres, mais j’aurai sûrement l’occasion d’en faire un billet).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;le-perso&quot;&gt;Le perso&lt;&#x2F;h2&gt;
&lt;p&gt;Sans trop dévoiler de détails, 2024 a été riche en évènements.&lt;&#x2F;p&gt;
&lt;p&gt;Début d’année, je débute enfin mes cours de moto (alors que je n’ai jamais mis les pieds sur un deux roues motorisés) et je : souffre.&lt;&#x2F;p&gt;
&lt;p&gt;J’ai la chance de tomber dans une moto-école avec des profs super pédagogiques et une piste dédiée évitant ainsi un contexte
où on aurait été une quinzaine sur le plateau.&lt;&#x2F;p&gt;
&lt;p&gt;Hormis le code, il faut valider le plateau et la circulation. Le premier étant la partie souvent la plus difficile du permis.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Une petite ellipse narrative&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Je passe le plateau en Juin, que j’obtiens du premier coup. Et la circulation est dans la poche, aussi du
premier coup, en Septembre.&lt;&#x2F;p&gt;
&lt;p&gt;Maintenant, c’est le moment d’angoisser à l’idée de rouler tout seul.&lt;&#x2F;p&gt;
&lt;p&gt;😬&lt;&#x2F;p&gt;
&lt;p&gt;J’ai désormais le loisir de pouvoir rouler et me faire doubler par des p*#t!ns de SUV alors que je roule
à 80 sur une roule à 80. Bref, malgré tous les inconvénients ça reste chouette.&lt;&#x2F;p&gt;
&lt;p&gt;A côté de ça, je me suis encore éloigné un peu plus de Paris pour profiter du calme (oui, ce n’est pas pour m’arranger avec
la diminution des postes en full-remote). Mes week-ends sont occupés à arpenter les allées des magasins de bricolage à la
recherche d’un truc (c’est le terme technique) qui me permettrait &lt;em&gt;enfin&lt;&#x2F;em&gt; d’accrocher ce p*#t!n de luminaire, ou à m’instruire
sur la pose d’un parquet.&lt;&#x2F;p&gt;
&lt;p&gt;Je continue de grimper, moins qu’avant forcément. Je déserte petit à petit les salles de blocs, moins fan des ouvertures
et de l’ambiance générale (l’essor de ce sport est une bonne chose, mais pas sur tous les plans).&lt;&#x2F;p&gt;
&lt;p&gt;Du coup, je me fais les doigts et les avant-bras sur de la voie.
Je m’amuse dans le 7a&#x2F;+, je me casse les dents sur des cotations plus ardues quelques fois, mais au-delà demanderait une rigueur
et un entraînement que je ne suis pas sûr de vouloir m’infliger.&lt;&#x2F;p&gt;
&lt;p&gt;Je progresse moins mais ça reste rigolo.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quelques-recos&quot;&gt;Quelques recos&lt;&#x2F;h2&gt;
&lt;p&gt;Avant de vous laisser, je vous partage quelques trucs qui m’ont agréablement marqué en 2024. Promis, on va faire vite !&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lecture&quot;&gt;Lecture&lt;&#x2F;h3&gt;
&lt;div style=&quot;display: flex; gap: 12px&quot;&gt;
    &lt;img src=&quot;derniere_etoile.jpg&quot; alt=&quot;La dernière étoile&quot;&gt;
    &lt;img src=&quot;premiere_loi.webp&quot; alt=&quot;La première loi&quot;&gt;
    &lt;img src=&quot;premier_de_cordee.webp&quot; alt=&quot;Premier de cordée&quot;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.babelio.com&#x2F;livres&#x2F;Tarlet-La-derniere-etoile&#x2F;1113758&quot;&gt;La dernière étoile — Fabien Tarlet&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Un petit space-opera parodique, dans la lignée de Pratchett mais dans un univers qui reprend les codes de la SF.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.babelio.com&#x2F;livres&#x2F;Abercrombie-La-Premiere-loi-tome-1--Premier-sang&#x2F;1422325&quot;&gt;La première loi, tome 1 — Joe Abercrombie&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;De la fantasy un peu sombre, des intrigues politiques et des personnages plutôt bien construits.&lt;&#x2F;p&gt;
&lt;p&gt;Ce premier tome de la trilogie sert de mise en place, on verra bien ce que le deuxième me réserve.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.babelio.com&#x2F;livres&#x2F;Frison-Roche-Premier-de-cordee&#x2F;36843&quot;&gt;Premier de cordée — Roger Frison-Roche&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ce livre parlera à tout les passionnés d’escalade et &#x2F; ou d’alpinisme. On est loin de la sécurité qu’on a aujourd’hui en falaise,
et on souffle fort pendant certains passages.&lt;&#x2F;p&gt;
&lt;p&gt;On suit récit d’un guide qui se reconstruit après un accident, en vivant au rythme de la montagne.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gaming&quot;&gt;Gaming&lt;&#x2F;h3&gt;
&lt;div style=&quot;display: flex; gap: 12px&quot;&gt;
    &lt;img src=&quot;acc.jpg&quot; alt=&quot;Assetto Corsa Competizione&quot;&gt;
    &lt;img src=&quot;rogue_trader.jpg&quot; alt=&quot;Warhammer 40,000: Rogue Trader&quot;&gt;
    &lt;img src=&quot;cairn.jpg&quot; alt=&quot;Cairn&quot;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;805550&#x2F;Assetto_Corsa_Competizione&#x2F;&quot;&gt;Assetto Corsa Competizione&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;C’est officiel, je suis tombé dans le SimRacing. C’est cool mais qu’est-ce que ça prend du temps !&lt;&#x2F;p&gt;
&lt;p&gt;Et un des jeux qui m’a donné envie d’y passer encore plus de temps, c’est Assetto Corsa Competizione.&lt;&#x2F;p&gt;
&lt;p&gt;Moins arcade qu’un Forza Horizon ou un F1 2024, pas de fioritures et juste de la conduite.&lt;&#x2F;p&gt;
&lt;p&gt;Parmi les petits trucs qui m’ont donné la banane cette année : une course d’endurance de 2h sur Paul Ricard,
et sans se vautrer.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;2186680&#x2F;Warhammer_40000_Rogue_Trader&#x2F;&quot;&gt;Warhammer 40,000: Rogue Trader&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Un petit cRPG de Owlcat sur une licence bien connue (enfin pas par moi mais ça viendra peut-être un jour).&lt;&#x2F;p&gt;
&lt;p&gt;Pas de grosse révolution, mais le gameplay est pas mal et ça fait passer le temps sans trop se prendre la tête.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;1588550&#x2F;Cairn&#x2F;&quot;&gt;Cairn&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Quoi ? Encore de l’escalade ?!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Forcément, quand on me vend un jeu sur de la grimpe, j’accours. J’avais joué à &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;1977170&#x2F;Jusant&#x2F;&quot;&gt;Jusant&lt;&#x2F;a&gt;
que j’avais bien aimé, mais pas au point d’y rejouer.&lt;&#x2F;p&gt;
&lt;p&gt;Là, la proposition se veut un peu plus immersive. Le jeu se prend en main assez rapidement et on souffle fort à certains passages.&lt;&#x2F;p&gt;
&lt;p&gt;Pour le moment, seule une démo est disponible. Démo sur laquelle j’ai passé au moins deux heures, à regrimper certains
pans en emprunant d’autres passages.&lt;&#x2F;p&gt;
&lt;p&gt;Après cette mise en bouche, on finit sur un plan large du sommet qu’on devra gravir dans le jeu final et ça donne
sacrément envie.&lt;&#x2F;p&gt;
&lt;p&gt;Hâte de faire du free solo depuis mon canap’.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;podcasts&quot;&gt;Podcasts&lt;&#x2F;h3&gt;
&lt;p&gt;Comment ne pas terminer ces recos par mes deux podcasts chouchous, qui ont rythmés mes semaines au fil de l’année :
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;shows.acast.com&#x2F;floodcast&quot;&gt;le Floodcast&lt;&#x2F;a&gt; et &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.geekzone.fr&#x2F;torre&#x2F;&quot;&gt;Torréfaction&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;en-conclusion&quot;&gt;En conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Bonne année 2025 🎉&lt;&#x2F;p&gt;
&lt;div style=&quot;width: 50%; margin: auto&quot;&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;random&#x2F;git-show-2024&#x2F;wee-hee.gif&quot; alt=&quot;wee-hee&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</description>
      </item>
      <item>
          <title>Fullscreen sentimental, Chrome et les permissions policy</title>
          <pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/dev_null/fullscreen-sentimental-permission-policies/</link>
          <guid>/dev_null/fullscreen-sentimental-permission-policies/</guid>
          <description xml:base="/dev_null/fullscreen-sentimental-permission-policies/">&lt;p&gt;Commençons par un petit jeu : est-ce que vous saurez trouver la différence entre ces deux images :&lt;&#x2F;p&gt;
&lt;div style=&quot;display: flex; gap: 15px;&quot;&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;dev_null&#x2F;fullscreen-sentimental-permission-policies&#x2F;fullscreen_disabled.png&quot; alt=&quot;fullscreen disabled&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;dev_null&#x2F;fullscreen-sentimental-permission-policies&#x2F;fullscreen_enabled.png&quot; alt=&quot;fullscreen enabled&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Réponse : l&#x27;une des vidéos peut être jouée en plein écran, pas l&#x27;autre.&lt;&#x2F;p&gt;
&lt;p&gt;Et c&#x27;est ainsi que commence une petite séance de débuggage WTF comme on les aime.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;le-contexte&quot;&gt;Le contexte&lt;&#x2F;h2&gt;
&lt;p&gt;Pour une quelconque raison, vous souhaitez inclure une vidéo Youtube sur un de vos sites.&lt;&#x2F;p&gt;
&lt;p&gt;Une &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;letmegooglethat.com&#x2F;?q=embed+youtube+video&quot;&gt;recherche rapide&lt;&#x2F;a&gt; plus tard, vous tombez sur un &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.google.com&#x2F;youtube&#x2F;answer&#x2F;171780?hl=fr&quot;&gt;tutoriel&lt;&#x2F;a&gt;
plutôt direct.&lt;&#x2F;p&gt;
&lt;p&gt;Première étape : allez sur la &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=V_SNDGwwGFM&quot;&gt;vidéo&lt;&#x2F;a&gt; en question.&lt;&#x2F;p&gt;
&lt;p&gt;Deuxième étape : trouver le bouton &quot;Partager&quot;, cliquer sur &quot;Intégrer&quot; et tada, vous avez un snippet prêt à être copié-collé :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    width&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;560&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    height&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;315&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;V_SNDGwwGFM?si=gNNpKH3mpbzRnpV8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    title&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;YouTube video player&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    frameborder&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    allow&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    referrerpolicy&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;strict-origin-when-cross-origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    allowfullscreen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ce qui m’intéresse particulièrement dans ce snippet, c&#x27;est l&#x27;attribut &lt;code&gt;allowfullscreen&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Comme son nom le laisse présumer, ça laisse la main au site qui embarque l&#x27;iframe d’autoriser ou non le plein écran (cf &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;HTML&#x2F;Element&#x2F;iframe#allowfullscreen&quot;&gt;la doc&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Dans notre cas, ça devrait être suffisant. Ça devrait l’être n&#x27;est-ce pas ?&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;padme_anaking_meme.jpg&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Sur Firefox et sûrement d&#x27;autres navigateurs non basés sur Chromium, oui. Sur Chrome, la situation est moins évidente.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;les-permissions-policy&quot;&gt;Les permissions policy&lt;&#x2F;h2&gt;
&lt;p&gt;La différence dans les deux exemples que j&#x27;ai partagés en début d&#x27;article ?&lt;&#x2F;p&gt;
&lt;p&gt;Le header &lt;code&gt;Permissions-Policy&lt;&#x2F;code&gt; ajouté par le serveur lorsqu&#x27;il nous sert notre page HTML (qui est pourtant la même dans les deux cas).&lt;&#x2F;p&gt;
&lt;p&gt;Dans un cas, on a :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;http&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;Permissions-Policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fullscreen=()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et dans l&#x27;autre :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;http&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;Permissions-Policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fullscreen=(self &amp;quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Dans le premier exemple, on bloque le plein écran pour toutes les iframes de la page et dans le deuxième,
on l’autorise uniquement pour des iframes chargeant des resources depuis le domaine &lt;code&gt;https:&#x2F;&#x2F;www.youtube-nocookie.com&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Et par défaut (i.e. si le header n&#x27;est pas rempli), on ne bloque le plein écran sur aucun domaine.&lt;&#x2F;p&gt;
&lt;p&gt;Merveilleux.&lt;&#x2F;p&gt;
&lt;p&gt;Pour tester ce genre de comportement, une config nginx plutôt simple suffit :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;nginx&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;events&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;http&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    server&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        root&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;data&#x2F;www&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        location&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; &#x2F;no-permissions &lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            try_files&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;index.html &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;=404&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        location&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; &#x2F;empty-permissions &lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            add_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Permissions-Policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;fullscreen=()&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            try_files&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;index.html &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;=404&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        location&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; &#x2F;valid-permissions &lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            add_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Permissions-Policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;fullscreen=(self &amp;quot;https:&#x2F;&#x2F;www.youtube-nocookie.com&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            try_files&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;index.html &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;=404&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;À noter que ce mécanisme peut contrôler les permissions de plusieurs fonctionnalités du navigateur (géolocalisation, webcam, picture-in-picture, ...).&lt;&#x2F;p&gt;
&lt;p&gt;Si vous voulez en savoir plus, je ne peux que vous conseiller la documentation MDN sur &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;HTTP&#x2F;Permissions_Policy&quot;&gt;le sujet&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;en-guise-de-conclusion&quot;&gt;En guise de conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;dev_null&#x2F;fullscreen-sentimental-permission-policies&#x2F;scream_pillow.gif&quot; alt=&quot;screaming in a pillow&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Mai 2024</title>
          <pubDate>Thu, 06 Jun 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2024-05/</link>
          <guid>/links/2024-05/</guid>
          <description xml:base="/links/2024-05/">&lt;h2 id=&quot;google-being-google&quot;&gt;Google being google&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.chromium.org&#x2F;2024&#x2F;05&#x2F;manifest-v2-phase-out-begins.html&quot;&gt;Chromium Blog: Manifest V2 phase-out begins&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.theverge.com&#x2F;2024&#x2F;5&#x2F;28&#x2F;24166177&#x2F;google-search-ranking-algorithm-leak-documents-link-seo&quot;&gt;Google won’t comment on a potentially massive leak of its search algorithm documentation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;la-fete-du-lisp&quot;&gt;La fête du Lisp&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simonsafar.com&#x2F;2021&#x2F;lisp_scripting&#x2F;&quot;&gt;Common Lisp for shell scripting&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stevelosh.com&#x2F;blog&#x2F;2018&#x2F;08&#x2F;a-road-to-common-lisp&quot;&gt;A Road to Common Lisp&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;marketsplash.com&#x2F;lisp-metaprogramming&#x2F;&quot;&gt;How To Explore Lisp Metaprogramming Techniques&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aie&quot;&gt;AÏe&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;techcrunch.com&#x2F;2024&#x2F;05&#x2F;18&#x2F;this-week-in-ai-openai-moves-away-from-safety&#x2F;&quot;&gt;This Week in AI: OpenAI moves away from safety&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;tech-policy&#x2F;2024&#x2F;05&#x2F;openai-pauses-chatgpt-4o-voice-that-fans-said-ripped-off-scarlett-johansson&#x2F;&quot;&gt;Scarlett Johansson says Altman insinuated that AI soundalike was intentional&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.theverge.com&#x2F;2024&#x2F;5&#x2F;21&#x2F;24161778&#x2F;windows-powertoys-advanced-ai-copy-paste&#x2F;&quot;&gt;Windows now has AI-powered copy and paste&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bbc.com&#x2F;news&#x2F;articles&#x2F;cpwwqp6nx14o&quot;&gt;Microsoft Copilot+ Recall feature &#x27;privacy nightmare&#x27;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;slack.com&#x2F;intl&#x2F;fr-fr&#x2F;trust&#x2F;data-management&#x2F;privacy-principles&quot;&gt;Slack, l’IA et sa version de l’opt-out&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.laquadrature.net&#x2F;2024&#x2F;05&#x2F;22&#x2F;le-reglement-ia-adopte-la-fuite-en-avant-techno-solutionniste-peut-se-poursuivre&#x2F;&quot;&gt;Le règlement IA adopté, la fuite en avant techno-solutionniste peut se poursuivre&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;information-technology&#x2F;2024&#x2F;05&#x2F;stack-overflow-users-sabotage-their-posts-after-openai-deal&#x2F;&quot;&gt;Stack Overflow users sabotage their posts after OpenAI deal&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;encore.dev&#x2F;blog&#x2F;queueing&quot;&gt;Queueing – An interactive study of queueing strategies&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.nelhage.com&#x2F;post&#x2F;stripe-dev-environment&#x2F;&quot;&gt;Stripe&#x27;s monorepo developer environment&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=_-6LgEjEyzE&quot;&gt;The latest in Web UI (Google I&#x2F;O ‘24)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;whattrainisitnow.com&#x2F;&quot;&gt;What Firefox trains are we in?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bessey.dev&#x2F;blog&#x2F;2024&#x2F;05&#x2F;24&#x2F;why-im-over-graphql&#x2F;&quot;&gt;Why, after 6 years, I’m over GraphQL&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ahelwer.ca&#x2F;post&#x2F;2024-05-28-tla-unicode&#x2F;&quot;&gt;TLA⁺ Unicode support&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.baldurbjarnason.com&#x2F;2024&#x2F;the-deskilling-of-web-dev-is-harming-us-all&#x2F;&quot;&gt;The deskilling of web dev is harming the product but, more importantly, it&#x27;s damaging our health – this is why burnout happens&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;daniel.haxx.se&#x2F;blog&#x2F;2024&#x2F;05&#x2F;27&#x2F;my-bdfl-guiding-principles&#x2F;&quot;&gt;My BDFL guiding principles&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.radiofrance.fr&#x2F;franceinter&#x2F;podcasts&#x2F;secrets-d-info&#x2F;secrets-d-info-du-samedi-25-mai-2024-3179825&quot;&gt;Cyberattaque : France Travail avait identifié la faille mais ne l’a pas corrigée à temps&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;tech-policy&#x2F;2024&#x2F;05&#x2F;amazon-execs-may-be-personally-liable-for-tricking-users-into-prime-sign-ups&#x2F;&quot;&gt;Amazon execs may be personally liable for tricking users into Prime sign-ups&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.datadoghq.com&#x2F;blog&#x2F;engineering&#x2F;how-we-migrated-our-static-analyzer-from-java-to-rust&#x2F;&quot;&gt;How We Migrated Our Static Analyzer From Java to Rust&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;buttondown.email&#x2F;jaffray&#x2F;archive&#x2F;null-bitmap-builds-a-database-1-the-log-is&#x2F;&quot;&gt;NULL BITMAP Builds a Database #1: The Log is Literally the Database&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;antithesis.com&#x2F;blog&#x2F;worst_bug&#x2F;&quot;&gt;The worst bug we faced at Antithesis&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aljamal.substack.com&#x2F;p&#x2F;homoiconic-python&quot;&gt;Homoiconic Python&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Avril 2024</title>
          <pubDate>Tue, 30 Apr 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2024-04/</link>
          <guid>/links/2024-04/</guid>
          <description xml:base="/links/2024-04/">&lt;h2 id=&quot;c-est-tout-nouveau&quot;&gt;C’est tout nouveau&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ruby-lang.org&#x2F;en&#x2F;news&#x2F;2024&#x2F;04&#x2F;23&#x2F;ruby-3-3-1-released&quot;&gt;Ruby 3.3.1 Released&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devblogs.microsoft.com&#x2F;typescript&#x2F;announcing-typescript-5-5-beta&#x2F;&quot;&gt;Announcing TypeScript 5.5 Beta&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;projectfluent.org&#x2F;&quot;&gt;Project Fluent&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zellij.dev&#x2F;news&#x2F;welcome-screen-pipes-filepicker&#x2F;&quot;&gt;Zellij 0.40.0: Welcome Screen, Filepicker, Pipes, Plugin Aliases&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aie&quot;&gt;AÏe&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bloodinthemachine.com&#x2F;p&#x2F;ai-really-is-smoke-and-mirrors&quot;&gt;AI really is smoke and mirrors&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;gadgets&#x2F;2024&#x2F;04&#x2F;ai-marketing-hype-is-coming-for-your-favorite-gadgets&quot;&gt;Tech brands are forcing AI into your gadgets—whether you asked for it or not&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ploum.net&#x2F;2024-04-04-la-bulle-ai.html?utm_source=pocket_saves&quot;&gt;Une bulle d’intelligence artificielle et de stupidité naturelle&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtube.com&#x2F;watch?v=xbf4BGIBENk&amp;amp;si=nZI7F2S39nlBypru&quot;&gt;Big Tech Is Faking AI&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lemonde.fr&#x2F;politique&#x2F;article&#x2F;2024&#x2F;04&#x2F;23&#x2F;gabriel-attal-mise-sur-l-intelligence-artificielle-pour-simplifier-les-demarches-administratives_6229417_823448.html&quot;&gt;Gabriel Attal mise sur l’intelligence artificielle pour « simplifier » les démarches administratives&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;des-p-tits-projets-sympas&quot;&gt;Des p’tits projets sympas&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ratpstatus.fr&#x2F;&quot;&gt;RATP status&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;about.contexte.com&#x2F;fr&#x2F;notre-actualite&#x2F;comment-remplace-google-docs-editeur-collaboratif-echo&quot;&gt;Comment nous avons développé un outil d’édition collaborative sur mesure pour nos journalistes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sindresorhus.com&#x2F;velja&quot;&gt;Velja - Powerful browser picker&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;will62794.github.io&#x2F;tla-web&quot;&gt;TLA+ web explorer&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;systemes-distribues-et-methodes-formelles&quot;&gt;Systèmes distribués et méthodes formelles&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brooker.co.za&#x2F;blog&#x2F;2024&#x2F;04&#x2F;17&#x2F;formal.html&quot;&gt;Formal Methods: Just Good Engineering Practice?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;muratbuffalo.blogspot.com&#x2F;2020&#x2F;06&#x2F;learning-about-distributed-systems.html&quot;&gt;Learning about distributed systems: where to start?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;2334256&#x2F;experiences-with-using-alloy-in-real-world-projects&quot;&gt;Experiences with using Alloy in real-world projects&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hillelwayne.com&#x2F;post&#x2F;alloy-facts&#x2F;&quot;&gt;Don&#x27;t let Alloy facts make your specs a fiction&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;c-est-beau-la-tech&quot;&gt;C’est beau la tech&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.wheresyoured.at&#x2F;the-men-who-killed-google&quot;&gt;The Man Who Killed Google Search&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;next.ink&#x2F;brief_article&#x2F;youtube-renforce-son-blocage-antipub-mais-ne-dit-rien-des-escroqueries-quil-publicise&#x2F;&quot;&gt;YouTube renforce son blocage antipub, mais ne dit rien des escroqueries qu’il publicise&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.web3isgoinggreat.com&#x2F;&quot;&gt;Web3 is going just great&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mcsweeneys.net&#x2F;articles&#x2F;the-millennial-captcha&quot;&gt;The Millennial CAPTCHA&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tonsky.me&#x2F;blog&#x2F;centering&#x2F;&quot;&gt;Hardest Problem in Computer Science: Centering Things&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;robertheaton.com&#x2F;interview&#x2F;&quot;&gt;How to pass a coding interview with me&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fluidmanifesto.org&#x2F;&quot;&gt;Manifesto for Fluid Software Development&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yorickpeterse.com&#x2F;articles&#x2F;how-to-write-a-code-formatter&#x2F;&quot;&gt;How to write a code formatter&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hybridhacker.email&#x2F;p&#x2F;my-25-year-engineering-career-retrospective&quot;&gt;My 25-Year Engineering Career Retrospective&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chaos.guru&#x2F;essays&#x2F;2024&#x2F;hostile-environments&#x2F;&quot;&gt;Shipping quality software in hostile environments&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.radiofrance.fr&#x2F;franceinter&#x2F;podcasts&#x2F;le-code-a-change&#x2F;le-code-a-change-9-3818194&quot;&gt;Quand l&#x27;État a voulu devenir une plateforme&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nextgres.com&#x2F;res&#x2F;20240419-The-Future-of-MySQL-is-Postgres.pdf&quot;&gt;The future of MySQL is Postgres&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jakearchibald.com&#x2F;2024&#x2F;attributes-vs-properties&quot;&gt;HTML attributes vs DOM properties&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Février 2024</title>
          <pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2024-02/</link>
          <guid>/links/2024-02/</guid>
          <description xml:base="/links/2024-02/">&lt;h2 id=&quot;aie&quot;&gt;AÏe&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.theverge.com&#x2F;2024&#x2F;2&#x2F;22&#x2F;24079876&#x2F;google-gemini-ai-photos-people-pause&quot;&gt;Google pauses Gemini’s ability to generate AI images of people after diversity errors&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=xPA0LFzUDiE&quot;&gt;Google has the best AI now, but there&#x27;s a problem...&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bbc.com&#x2F;worklife&#x2F;article&#x2F;20240214-ai-recruiting-hiring-software-bias-discrimination&quot;&gt;AI hiring tools may be filtering out the best job applicants&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;c-est-tout-nouveau&quot;&gt;C’est tout nouveau&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;astral.sh&#x2F;blog&#x2F;uv&quot;&gt;uv: Python packaging in Rust&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steamcommunity.com&#x2F;app&#x2F;596420&#x2F;eventcomments&#x2F;4361243264663731579?snr=2_groupannouncements_detail_&quot;&gt;Steam Audio Open Source Release&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;netflixtechblog.com&#x2F;introducing-safetest-a-novel-approach-to-front-end-testing-37f9f88c152d&quot;&gt;Introducing SafeTest: A Novel Approach to Front End Testing&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;react.dev&#x2F;blog&#x2F;2024&#x2F;02&#x2F;15&#x2F;react-labs-what-we-have-been-working-on-february-2024&quot;&gt;React Labs: What We&#x27;ve Been Working On – February 2024&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;racket.discourse.group&#x2F;t&#x2F;racket-v8-12-is-now-available&#x2F;2709?u=spdegabrielle&quot;&gt;Racket v8.12 is now available&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;news-js&quot;&gt;news.js&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;JavaScript&#x2F;Reference&#x2F;Global_Objects&#x2F;Array&#x2F;with&quot;&gt;Array.prototype.with()&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;socket.dev&#x2F;blog&#x2F;express-js-spam-prs-commoditization-of-open-source&quot;&gt;Express.js Spam PRs Incident Highlights the Commoditization of Open Source Contributions&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;socket.dev&#x2F;blog&#x2F;when-everything-becomes-too-much&quot;&gt;When &#x27;Everything&#x27; Becomes Too Much: The npm Package Chaos of 2024&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mrmr.io&#x2F;til&#x2F;prettier&quot;&gt;Why is Prettier rock solid?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;l-elephant-dans-la-piece&quot;&gt;L’éléphant dans la pièce&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.uber.com&#x2F;en-FR&#x2F;blog&#x2F;postgres-to-mysql-migration&#x2F;&quot;&gt;Why Uber Engineering Switched from Postgres to MySQL&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;thebuild.com&#x2F;presentations&#x2F;uber-perconalive-2017.pdf&quot;&gt;A PostgreSQL Response to Uber&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;echec-et-mat&quot;&gt;Echec et mat&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.radiofrance.fr&#x2F;franceculture&#x2F;podcasts&#x2F;entendez-vous-l-eco&#x2F;atos-le-bug-economique-7617162&quot;&gt;Atos : le bug économique&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.radiofrance.fr&#x2F;franceculture&#x2F;podcasts&#x2F;entendez-vous-l-eco&#x2F;wework-metro-bureau-fiasco-1862188&quot;&gt;WeWork : métro, bureau, fiasco&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.geoffreylitt.com&#x2F;2019&#x2F;07&#x2F;29&#x2F;browser-extensions&quot;&gt;Browser extensions are underrated: the promise of hackable software&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lafabriqueverticale.com&#x2F;fr&#x2F;le-marche-des-salles-descalade-en-france-en-2024&#x2F;&quot;&gt;Le marché des salles d’escalade en France en 2024&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ft.com&#x2F;content&#x2F;db864323-5b68-402b-8aa5-5c53a309acf1&quot;&gt;The Norwegian sovereign wealth fund’s $92mn Excel error&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=9aYgKQDOjI0&quot;&gt;J&#x27;ai envoyé 10246 CVs avec un bot, voici ce j&#x27;ai appris&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;di.nmfay.com&#x2F;random-geography-fluviation&quot;&gt;(Plausible) Random Geography Generation with PostGIS: Fluviation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hillelwayne.com&#x2F;post&#x2F;picat&#x2F;&quot;&gt;Planner programming blows my mind&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;webup.org&#x2F;blog&#x2F;the-high-risk-refactoring&#x2F;&quot;&gt;The High-Risk Refactoring&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;deepnight.net&#x2F;blog&#x2F;regarding-dead-cells-termination&#x2F;&quot;&gt;Regarding Dead Cells termination&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;security&#x2F;2024&#x2F;02&#x2F;canada-vows-to-ban-flipper-zero-device-in-crackdown-on-car-theft&#x2F;&quot;&gt;Canada declares Flipper Zero public enemy No. 1 in car-theft crackdown&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bitofbinary.com&#x2F;how-working-from-home-changed-my-life&#x2F;&quot;&gt;How Working From Home Changed My Life&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jvns.ca&#x2F;blog&#x2F;2024&#x2F;02&#x2F;16&#x2F;popular-git-config-options&#x2F;&quot;&gt;Popular git config options&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.copetti.org&#x2F;writings&#x2F;consoles&#x2F;playstation-2&#x2F;&quot;&gt;PlayStation 2 Architecture&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;shopify.engineering&#x2F;refactoring-legacy-code-strangler-fig-pattern&quot;&gt;Refactoring Legacy Code with the Strangler Fig Pattern&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bits.danielrothmann.com&#x2F;corporate-agile&quot;&gt;It&#x27;s time to break free from Corporate Agile&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tontinton.com&#x2F;posts&#x2F;database-fundementals&#x2F;&quot;&gt;Database Fundamentals&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cep.dev&#x2F;posts&#x2F;every-infrastructure-decision-i-endorse-or-regret-after-4-years-running-infrastructure-at-a-startup&#x2F;&quot;&gt;(Almost) Every infrastructure decision I endorse or regret after 4 years running infrastructure at a startup&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.piglei.com&#x2F;articles&#x2F;en-programming-is-still-hard-after-14-years&#x2F;&quot;&gt;After 14 years in the industry, I still find programming difficult&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=QhWdBhc3Wjc&quot;&gt;Le Design du Monde de Dark Souls | Boss Keys&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;webdev&#x2F;comments&#x2F;1b14bty&#x2F;netlify_just_sent_me_a_104k_bill_for_a_simple&#x2F;&quot;&gt;Netlify just sent me a $104K bill for a simple static site&lt;&#x2F;a&gt;&quot;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Une année d&#x27;entretiens</title>
          <pubDate>Mon, 26 Feb 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/random/une-annee-d-entretiens/</link>
          <guid>/random/une-annee-d-entretiens/</guid>
          <description xml:base="/random/une-annee-d-entretiens/">&lt;p&gt;Mes trois dernières années professionnelles ont été un peu mouvementées.&lt;&#x2F;p&gt;
&lt;p&gt;Trouver une nouvelle opportunité après 4 ans dans une même boîte,
quitter une boîte au bout de trois mois, car trop de désaccords,
vouloir quitter un nouveau poste en raison de l&#x27;inexpérience technique de l&#x27;équipe qui gérait le projet ;
à plusieurs reprises, je me suis frotté au marché de l&#x27;emploi.&lt;&#x2F;p&gt;
&lt;p&gt;Et au fur et à mesures des entretiens, ma passion pour ce métier que j&#x27;exerce depuis bientôt 10 ans a laissé place à
un certain cynisme regrettable.&lt;&#x2F;p&gt;
&lt;p&gt;Maintenant que j&#x27;ai trouvé une nouvelle opportunité qui, espérons, correspond à ce que je recherchais - même si moins excitante sur le papier que les levées indécentes de l&#x27;écosystème startup parisien -
j&#x27;ai voulu en profiter pour faire une petite synthèse de ce que j&#x27;ai pu voir après été dans plusieurs dizaines de process de recrutements.&lt;&#x2F;p&gt;
&lt;p&gt;L&#x27;objectif ici n&#x27;est pas tant de (trop) râler pour râler, que de faire un retour d&#x27;expérience sur cette longue période de recherche. Ou juste râler.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mon-parcours&quot;&gt;Mon parcours&lt;&#x2F;h2&gt;
&lt;p&gt;Non, mon rêve n&#x27;a jamais été de passer mon temps à faire du CRUD.&lt;&#x2F;p&gt;
&lt;p&gt;Je voulais devenir vétérinaire, mais étant une quiche en SVT, j&#x27;ai vite dévié vers les maths et la physique.&lt;&#x2F;p&gt;
&lt;p&gt;Direction la case prépa et école d&#x27;ingénieur, mes premiers pas dans la programmation se font
avec des cours de C et de Java. A côté de ça, je découvre &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;processing.org&#x2F;&quot;&gt;Processing&lt;&#x2F;a&gt;, un sketchbook de code créatif.
Je passe mon temps à coder des idées sans grands intérêts, loin des préoccupations que j&#x27;aurai une fois baigné dans le monde professionnel.&lt;&#x2F;p&gt;
&lt;p&gt;Au moment de choisir ma spécialisation, je me rends compte que contrairement à toutes les autres matières
dans lesquelles je suis (de nouveau) une quiche complète (coucou la mécanique des fluides), je peux passer mes soirées
entières à coder sans que ça me coûte. Filière informatique ce sera.&lt;&#x2F;p&gt;
&lt;p&gt;Ensuite, ce sera un stage de fin d&#x27;étude dans une ESN que je ne citerai pas, un premier job dans une autre ESN que je ne citerai pas non plus
et quelques années dans une startup.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mes-premiers-entretiens&quot;&gt;Mes premiers entretiens&lt;&#x2F;h3&gt;
&lt;p&gt;En 7 ans, j&#x27;ai passé des entretiens pour seulement 2 boîtes (si on ne compte pas ceux que j&#x27;ai passé pour les missions d&#x27;ESN).&lt;&#x2F;p&gt;
&lt;p&gt;Pour la première, le process était somme toute classique : un entretien d&#x27;algorithmie, un entretien sur JavaScript et
un entretien orienté applicatif sur un framework JS (Angular.js à l&#x27;époque).
Tout s&#x27;est enchaîné en une après-midi dans les bureaux de la boîte en question.&lt;&#x2F;p&gt;
&lt;p&gt;La deuxième est un cas un peu particulier. Le CTO étant une connaissance de connaissance, ayant des affinités avec un certain langage académique
pour lequel j&#x27;avais les mêmes affinités, les discussions se sont faites de fil en aiguille. Il a pu voir un aperçu du code que je pondais
pour des projets perso sur GitHub à l&#x27;époque et m&#x27;a proposé de rejoindre la boîte qu&#x27;il avait lui-même rejointe quelques mois auparavant.&lt;&#x2F;p&gt;
&lt;p&gt;Pour la petite histoire, le premier entretien s&#x27;est déroulé autour d&#x27;une bière pendant lequel les discussions portaient sur l&#x27;état du projet
en toute transparence et la direction technique que ça prendrait au fil des mois.&lt;&#x2F;p&gt;
&lt;p&gt;S&#x27;ajoute à cela une rencontre avec les fondateurs, bien évidemment.&lt;&#x2F;p&gt;
&lt;p&gt;Avec le recul, ce sera sûrement l&#x27;entretien qui me marquera le plus, positivement.
Pas de faux-semblant, juste un constat honnête de la situation et du reste à faire. Quid de mes compétences techniques ?
Toutes les idées farfelues que j&#x27;avais étaient disponibles publiquement, avec une implémentation qui, aujourd&#x27;hui,
me ferait grincer des dents (heureusement, j&#x27;ai beaucoup appris entre temps).&lt;&#x2F;p&gt;
&lt;p&gt;Je sais ce que vous me direz :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;T&#x27;es gentil, mais toutes les boîtes ne peuvent pas se permettre de faire ce genre de choses. Surtout quand tu as déjà une équipe de 50 devs.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Certes. C&#x27;était l&#x27;avantage à être un des premiers recrutements.
Et l&#x27;avenir m&#x27;a montré que même une boîte de 5 personnes peuvent avoir des process de recrutements pétés.&lt;&#x2F;p&gt;
&lt;p&gt;Tout ce petit aparté pour dire qu&#x27;au final, j&#x27;ai eu de la chance dans mon début de carrière et que je n&#x27;ai pas
eu à développer une expertise sur comment passer les entretiens.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;il-serait-peut-etre-temps-de-changer-de-cremerie&quot;&gt;Il serait peut-être temps de changer de crèmerie&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;l-etat-du-marche&quot;&gt;L&#x27;état du marché&lt;&#x2F;h3&gt;
&lt;p&gt;Vouloir changer, c&#x27;est bien. Encore faut-il savoir pour quoi.&lt;&#x2F;p&gt;
&lt;p&gt;Direction certains job-boards pour un premier constat déprimant : peu sont les boîtes
qui proposent une vraie composante métier, encore moins sur un domaine intéressant.&lt;&#x2F;p&gt;
&lt;p&gt;Sans aucun chiffre à l&#x27;appui, la majorité des offres que je vois passer sont pour des ESN
ou structures de consulting.&lt;&#x2F;p&gt;
&lt;p&gt;D&#x27;autres proposent, victimes des cycles de mode dans le milieu, des postes sur des
langages qui ne m&#x27;attirent pas.&lt;&#x2F;p&gt;
&lt;p&gt;Sur ce point, lucide sur le fait que l&#x27;opportunité de retravailler au quotidien sur le
langage en H ne se représentera sans doute pas de sitôt, j&#x27;élargis mes critères.
Après tout, le langage importe peu (dans une certaine mesure) par rapport au contexte humain.
Je préfère encore travailler dans un environnement sain, sur une techno un peu moins
excitante que l&#x27;inverse.&lt;&#x2F;p&gt;
&lt;p&gt;Heureusement, le monde des startups fourmille de nouvelles idées et je trouve quelques
opportunités, pour des boîtes en phase de structuration (i.e. pas 4 devs en train de hacker
dans un appart en plein Paris). Je cible très vite des boîtes dans le domaine bancaire, de l&#x27;assurance
ou encore de la logistique.&lt;&#x2F;p&gt;
&lt;p&gt;Lors de ma deuxième phase de recherche, quelques années plus tard, le constat de base est le même.
A ceci près que le cliché du solutionnisme technologique est de plus en plus présent.
Or, quand on a travaillé un certain temps dans cette branche, on a un poil plus de mal à partager
l&#x27;optimisme de fondateurs qui expliquent comment balancer une plâtrée de micro-services réglera
des problèmes d&#x27;un domaine vétuste.
À ça, s&#x27;ajoutent des boîtes plus orientées &quot;données&quot;, que ce soit à des fins purement marketing
ou de l&#x27;analytics.
Des années plus tard donc, je peine à trouver un projet qui m&#x27;emballe réellement.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;le-mot-en-t&quot;&gt;Le mot en T&lt;&#x2F;h3&gt;
&lt;p&gt;J&#x27;ai commencé à chercher un nouveau job en plein COVID. Le télétravail était une norme forcée.&lt;&#x2F;p&gt;
&lt;p&gt;Deux ans après, le bât blesse.&lt;&#x2F;p&gt;
&lt;p&gt;Je ne vais pas faire une redite de ce qui a été dit moulte fois. Le télétravail est en recul,
et pouvoir travailler de chez soi sans des contraintes absurdes réduit grandement le nombre
de possibilités.&lt;&#x2F;p&gt;
&lt;p&gt;Alors oui, bosser chacun chez soi, ce n&#x27;est pas pour tout le monde.
Pour autant, tout le monde n&#x27;a pas un appartement en plein Paris ou ne veut pas se prendre
45 minutes (voire plus d&#x27;une heure) de trajet pour se rendre dans un open-space bruyant
trois fois par semaines (don&#x27;t @ me les influenceurs LinkedIn).&lt;&#x2F;p&gt;
&lt;p&gt;Ce qui m&#x27;a doucement fait rire à chaque fois qu&#x27;on a abordé le sujet en entretien, ce sont les justifications.
Parce que oui, on n&#x27;autorise plus le travail de chez soi, mais on a de &quot;bonnes&quot; raisons.&lt;&#x2F;p&gt;
&lt;p&gt;Aussi, sur la roulette des excuses pétées, on pourra y lire entre autres :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;c&#x27;est important pour la cohésion d&#x27;équipe. C&#x27;est compliqué quand on ne voit pas les gens en direct.&lt;&#x2F;li&gt;
&lt;li&gt;certains clients ont des besoins particuliers. Il faut qu&#x27;on puisse discuter de solutions de manières efficaces et rapides.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Mention spéciale au CTO qui m&#x27;explique qu&#x27;actuellement, quelques devs bossent de chez eux, mais lui veut revenir à un modèle hybride
et privilégier les recrutements parisiens. On en fait quoi du coup des personnes en remote ?&lt;&#x2F;p&gt;
&lt;p&gt;Il est vrai que faire venir les gens deux ou trois fois par semaine sur site contrebalance efficacement
un management dysfonctionnel, c&#x27;est bien connu.&lt;&#x2F;p&gt;
&lt;p&gt;C&#x27;est aussi vrai qu&#x27;on n&#x27;a aucun moyen de communiquer efficacement en ligne, que ce soit par écrit, audio ou vidéo.&lt;&#x2F;p&gt;
&lt;p&gt;Les discussions avec les quelques boîtes qui ne s&#x27;embêtent pas de ce genre de contraintes sont rafraîchissantes, bien
qu&#x27;on enfonce quelques portes ouvertes.
Ces boîtes responsabilisent ses équipes, tout simplement.&lt;&#x2F;p&gt;
&lt;p&gt;Et, en guise d&#x27;alternative, pour des boîtes qui se trouvent souvent hors région parisienne, le rythme est de rassembler
toutes les équipes une fois par mois ou tous les deux mois. Ce qui est un juste milieu raisonnable.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-la-recherche-du-temps-perdu&quot;&gt;À la recherche du temps perdu&lt;&#x2F;h3&gt;
&lt;p&gt;Une fois le tour des annonces fait et les candidatures envoyées, commence les entretiens.
Et ça prend du temps.&lt;&#x2F;p&gt;
&lt;p&gt;Il faut compter entre 3 et 5 entretiens (voire plus pour des boîtes qui, étonnement, ne s&#x27;appellent
pas Google) :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;un entretien RH (30-45 minutes)&lt;&#x2F;li&gt;
&lt;li&gt;un premier entretien technique (1h-1h30)&lt;&#x2F;li&gt;
&lt;li&gt;un deuxième entretien technique (1h-1h30)&lt;&#x2F;li&gt;
&lt;li&gt;une rencontre avec les équipes (1h)&lt;&#x2F;li&gt;
&lt;li&gt;une rencontre potentielle avec les fondateurs (1h)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;En tout, si tout se passe bien, on peut aller jusqu&#x27;à 5 heures pour une seule boîte.&lt;&#x2F;p&gt;
&lt;p&gt;C&#x27;est tout de suite plus, si l&#x27;entretien technique est un exercice à faire à la maison.&lt;&#x2F;p&gt;
&lt;p&gt;Et comme il vaut mieux éviter de miser sur un seul cheval, je postule pour plusieurs boîtes
en même temps.&lt;&#x2F;p&gt;
&lt;p&gt;Le tout sans poser le moindre jour de congé. Étant donné les déconvenues que peuvent donner
ces process, il vaut mieux passer ces entretiens en dehors des heures de boulot plutôt que
de réduire son solde de RTT.&lt;&#x2F;p&gt;
&lt;p&gt;Tout ça prend un temps fou, et surtout une énergie folle. Surtout quand le premier entretien
se déroule quasiment toujours de la même manière :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;présentation de son parcours&lt;&#x2F;li&gt;
&lt;li&gt;présentation de la boîte&lt;&#x2F;li&gt;
&lt;li&gt;pourquoi tu veux venir bosser chez nous&lt;&#x2F;li&gt;
&lt;li&gt;voici le parcours du combattant qu&#x27;on te propose&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;L&#x27;avantage de l&#x27;expérience, c&#x27;est qu&#x27;on peut vite sentir quand tout ça n&#x27;en vaudra pas la
chandelle et s&#x27;épargner quelques heures laborieuses.&lt;&#x2F;p&gt;
&lt;p&gt;Nouveauté de cette année tout de même : les RHs qui se barrent en plein milieu du process
sans donner signe de vie. Ce qui m&#x27;est arrivé par deux fois.&lt;&#x2F;p&gt;
&lt;p&gt;La première fois, les entretiens s&#x27;étaient relativement bien passés. J&#x27;attendais donc qu&#x27;on
programme le suivant.
Quelques semaines se passent sans aucunes nouvelles. Les boîtes qui jouent aux abonnés absents, ça
existe et je me fais une raison.
On revient quelque temps après, en m&#x27;expliquant que la personne en charge du recrutement a dû quitter
la boîte et n&#x27;avait pas tout transmis. Chouette.&lt;&#x2F;p&gt;
&lt;p&gt;La deuxième fois, scénario quasi identique. Plusieurs semaines après, une personne freelance débauchée
pour pallier la démission de celle en charge de mon recrutement a repris le dossier.
Est-ce que cette dernière savait qu&#x27;elle allait quitter la boîte au moment de nos échanges ? Sans aucun doute.
Et pourtant, je me retrouve à réexpliquer à la nouvelle recrue où on en était et ce qu&#x27;il restait à faire.&lt;&#x2F;p&gt;
&lt;p&gt;À ce jour, c&#x27;est certainement le meilleur moyen de dissuader une personne de vous rejoindre.&lt;&#x2F;p&gt;
&lt;p&gt;Et je n&#x27;ai pas encore parlé des exercices à faire à la maison ou des entretiens qui se déroulent
sur une journée entière. Pour les derniers, c&#x27;est évidemment difficile à caser sans prendre
de jour de congés. Pour les deux, on frôle le foutage de gueule en termes de respect du temps
du candidat, bien que l&#x27;idée derrière soit compréhensible.&lt;&#x2F;p&gt;
&lt;p&gt;Dans le premier cas, les consignes donnent une fourchette de temps recommandée. Bien sûr, je n&#x27;ai quasiment
jamais respecté ça.&lt;&#x2F;p&gt;
&lt;p&gt;Quatre heures pour un serveur TCP agrémenté d&#x27;un interpréteur de commande (et donc du parsing) et des tests qui
couvrent tout ? Bien sûr.&lt;&#x2F;p&gt;
&lt;p&gt;Mention spéciale pour l&#x27;exercice (conçu pour un poste frontend alors que je postulais sur du backend)
qui se résumait à : &quot;prends ce dataset et fais des trucs intéressants avec&quot;.
Une recette miracle pour pourrir votre lundi soir pour lequel vous aviez prévu autre chose.&lt;&#x2F;p&gt;
&lt;p&gt;Dans le deuxième cas, l&#x27;investissement d&#x27;une journée entière se solde par :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;un refus par mail sans aucun retour ni pédagogie concernant mon rendu et ce qui a pêché&lt;&#x2F;li&gt;
&lt;li&gt;un retour, en tout et pour tout, de 5 minutes sur deux points vagues qui auraient pu être
largement mis en exergue par un entretien plus court&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;C&#x27;est cool de se dire que mettre en situation la personne
(et accessoirement lui faire rencontrer la moitié de la boîte au fil de la journée) est une bonne mesure
de ce qu&#x27;elle vaut.&lt;&#x2F;p&gt;
&lt;p&gt;Sauf qu&#x27;après quatre heures déjà passées, les semaines précédentes, se faire refouler
de manière aussi peu justifiée au bout d&#x27;une journée entière est légèrement compliqué à accepter en gardant
son calme.&lt;&#x2F;p&gt;
&lt;p&gt;La conclusion, évidente : les entretiens sont devenus un parcours du combattant qui drainent votre temps,
votre énergie et votre passion pour ce job (en tout cas, en ce qui me concerne).&lt;&#x2F;p&gt;
&lt;p&gt;Qui plus est, ça n&#x27;a jamais été une garantie d&#x27;un bon fonctionnement en interne. Donc, que penser après avoir subi
tout ça si c&#x27;est pour se retrouver avec une boîte complètement dysfonctionnelle et aux pratiques techniques beaucoup
moins rigoureuses que ce qu&#x27;on vous fait miroiter en entretien ?&lt;&#x2F;p&gt;
&lt;p&gt;Parmi les dernières boîtes que j&#x27;ai contactées, j&#x27;ai soupiré quand le recruteur m&#x27;a expliqué toutes les étapes
pourtant habituelles. Puis j&#x27;ai coupé court, préférant passer mon temps à faire autre chose qu&#x27;à résoudre
un puzzle tordu et me vendre.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;est-ce-que-les-boites-revent-de-moutons-a-5-pattes&quot;&gt;Est-ce que les boîtes rêvent de moutons à 5 pattes ?&lt;&#x2F;h3&gt;
&lt;p&gt;On passe notre temps à développer, il est normal de parler technique et coder un peu quand on postule pour une boîte.&lt;&#x2F;p&gt;
&lt;p&gt;Et puis vient le mur des gens qui prennent tout au pied de la lettre.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Alors, t&#x27;as 4 ans d&#x27;expérience sur React mais on recherche une personne avec 5 ans ou plus.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Désolé, on voit que tu n&#x27;es pas assez calé en DDD, TDD et autre *DD
vu que les réponses que tu as données ne sont pas exactement celles qu&#x27;on a données à la RH.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Je paraphrase mais l&#x27;idée est là. On considère le nombre d&#x27;années d&#x27;expérience comme un seuil immuable qui servirait
de proxy à la qualité de la personne. Je vous laisserai chercher les memes de personnes qui demandent un nombre d&#x27;années
d&#x27;expérience plus grand que celui d&#x27;existence de la techno.&lt;&#x2F;p&gt;
&lt;p&gt;Avec le recul, c&#x27;est assez amusant de se prendre ce genre de refus alors que j&#x27;ai commencé à toucher à React de mon côté
dès que la librairie était sortie.&lt;&#x2F;p&gt;
&lt;p&gt;Ensuite, viens l&#x27;entre soi dans lequel il est compliqué de s&#x27;y faire une place quand on manque soi-même de conviction.
Quoi dire à des gens qui vont religieusement écrire tous leurs tests avant leur implémentation, vont faire de l&#x27;architecture hexagonale
ou vous bassiner avec du Domain Driven Development ?&lt;&#x2F;p&gt;
&lt;p&gt;Evidemment, avec le temps je me suis familiarisé avec tout ça en essayant d&#x27;en comprendre la motivation et le gain.&lt;&#x2F;p&gt;
&lt;p&gt;Là où ça devient compliqué, c&#x27;est de tempérer les méthodologies avec le contexte. Le &quot;ça dépend&quot; plaît moyennement.
On veut des gens sûrs d&#x27;eux, absolus dans leurs décisions.&lt;&#x2F;p&gt;
&lt;p&gt;Or, c&#x27;est compliqué sur certains points d&#x27;être sûr de soi. Tout ce qui est DDD, architecture hexagonale, je ne l&#x27;ai vu dans
aucun contexte professionnel. Est-ce qu&#x27;on a appliqué certains points intuitivement sans mettre de mot dessus ?
Probablement.
Reste à savoir si en fin de compte, il ne s&#x27;agit là que d&#x27;apprendre par coeur un vocabulaire d&#x27;initié plus que de vouloir
résoudre des problèmes techniques en équipe.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;ai passé certains entretiens où la prémisse était une équipe qui expérimentait une nouvelle architecture et,
n&#x27;était même pas capable de m&#x27;aiguiller avec certitude sur certains de mes choix.&lt;&#x2F;p&gt;
&lt;p&gt;Viennent ensuite les entretiens un peu plus classique. Des séances en visio sur soit des problèmes
d&#x27;algorithmie, soit des problèmes pratiques.&lt;&#x2F;p&gt;
&lt;p&gt;Des premiers entretiens de ce type que j&#x27;ai passés en début de carrière, une chose m&#x27;est restée :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;C&#x27;est un entretien technique, mais c&#x27;est aussi l&#x27;occasion d&#x27;échanger et d&#x27;en savoir un peu plus sur la boîte, et réciproquement.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;L&#x27;entretien technique, je le vois comme un moment qui doit me permettre de répondre à : &quot;est-ce que j&#x27;ai envie de bosser avec cette personne au quotidien ?&quot;.
Peut-être à tort.&lt;&#x2F;p&gt;
&lt;p&gt;Dans la majorité des cas, cette heure est passée à résoudre un puzzle, souvent déconnecté de la réalité
business, fomenté par une équipe qui ne cherchera pas à en savoir plus sur vous.&lt;&#x2F;p&gt;
&lt;p&gt;Aussi, j&#x27;ai pu passer des entretiens où la personne s&#x27;est mise en sourdine pendant que je
codais sur un exercice bateau. Pour finir sur un : &quot;euh, t&#x27;as des questions sur la boîte ?&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Bonjour, au revoir. Peut-être à bientôt.&lt;&#x2F;p&gt;
&lt;p&gt;Autant dire que ce genre de moment de solitude, qui semble être une corvée, ne constitue pas
une vitrine très reluisante.&lt;&#x2F;p&gt;
&lt;p&gt;Et quand je parle d&#x27;exercice déconnecté de la réalité, le champ des possibles est infini.
Quel est l&#x27;intérêt de se taper un algo de flood-filling dans le secteur bancaire ?
Quid de refaire un tri distribué à la Spark parce que le CTO est hyper fan, si c&#x27;est pour faire
du dashboard ? Et potentiellement se placer dans un écosystème déjà installé dans la boîte ?&lt;&#x2F;p&gt;
&lt;p&gt;Tout ce que ces exercices mettent de côté, c&#x27;est le contexte technique de la boîte.&lt;&#x2F;p&gt;
&lt;p&gt;On a vu que je me débrouillais pas trop mal pour faire une TODO list (même si c&#x27;est limite,
et que tu aurais pu utiliser un reducer au lieu d&#x27;un state). Super.&lt;&#x2F;p&gt;
&lt;p&gt;Premier jour dans une boîte ? La stack est déjà là, elle a potentiellement plusieurs années
et possède son lot de fantaisies propre à la boîte.&lt;&#x2F;p&gt;
&lt;p&gt;D&#x27;autres s&#x27;en accommoderont, je n&#x27;en doute pas.&lt;&#x2F;p&gt;
&lt;p&gt;Des entretiens techniques que j&#x27;ai pu faire, j&#x27;en retiens quelques-uns qui, étant là pour
tester mes capacités, donnent un aperçu des problèmes que l&#x27;équipe est amené à résoudre au
quotidien.&lt;&#x2F;p&gt;
&lt;p&gt;Et c&#x27;est aussi bête que de se dire : &quot;on a un fichier texte un peu crade, on aimerait que
ça colle un peu plus à notre modèle de données. Comment tu t&#x27;y prendrais ?&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;La discussion peut commencer, et ne s&#x27;arrête pas à un bête exercice de pensée, mais s&#x27;ouvre
sur les problèmes que les gens ont pu avoir sur certaines intégrations et comment ils s&#x27;y sont
pris.&lt;&#x2F;p&gt;
&lt;p&gt;Du pire que j&#x27;ai expérimenté de ce côté-là, il y a eu deux situations.&lt;&#x2F;p&gt;
&lt;p&gt;La première, une boîte avec une stack intéressante, mais en peine de trouver des profils.
Pourtant, l&#x27;objectif est de créer une petite famille (hmmm) et d&#x27;arrêter de se reposer sur
des freelances.&lt;&#x2F;p&gt;
&lt;p&gt;Le premier entretien technique ? Une suite de problème d&#x27;algo à faire en 30 minutes. Le chronomètre
démarre dès que la base de code est téléchargée et doit être poussée sur un repo avant l&#x27;échéance dés
30 minutes.&lt;&#x2F;p&gt;
&lt;p&gt;Je me foire sur certaines parties. Mais ayant l&#x27;habitude du mantra &quot;c&#x27;est ton cheminement qui nous intéresse,
plus que le résultat final&quot;, je me demande quelle tournure la suite prendra.
Il ne m&#x27;a fallu pas attendre très longtemps, puisque quelques heures plus tard, je reçois ce qui semble être
un mail automatique de refus.&lt;&#x2F;p&gt;
&lt;p&gt;Le test était automatisé de bout en bout et personne, à aucun moment, n&#x27;a regardé ce que j&#x27;ai produit.
Ce que j&#x27;essaie d&#x27;expliquer à la recruteuse qui me répond simplement avec le rapport de tests.&lt;&#x2F;p&gt;
&lt;p&gt;La conclusion, devenue habituelle maintenant : tant mieux, cette boîte ne doit pas être faite pour moi.&lt;&#x2F;p&gt;
&lt;p&gt;La deuxième, un entretien censé être sur du React. Comme c&#x27;est la loterie à chaque fois,
je préfère ne pas trop me prendre la tête en avance de phase.&lt;&#x2F;p&gt;
&lt;p&gt;Petite question pour la mise en jambe :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il est 15h15. On aimerait connaître l&#x27;angle entre les deux aiguilles de l&#x27;horloge.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Sur l&#x27;échelle du malaise, on aurait pu y ajouter d&#x27;autres barreaux.&lt;&#x2F;p&gt;
&lt;p&gt;Alors oui, le problème n&#x27;est pas compliqué et j&#x27;aurais pu trouver la réponse si j&#x27;étais dans un meilleur jour.
Et une petite part d&#x27;orgueil a potentiellement éreinté ma patience.&lt;&#x2F;p&gt;
&lt;p&gt;Au bout de quelques minutes de réflexion laborieuse, une épiphanie. Cette question est digne d&#x27;un quiz
en ligne et je ne comprends pas comment on peut prendre une heure à quelqu&#x27;un pour commencer un test comme ça.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;explique, un peu agacé, à la personne en face mon point de vue qui me répond en balbutiant, que
le business implique souvent des calculs et c&#x27;est une manière de voir comment les gens réfléchissent.&lt;&#x2F;p&gt;
&lt;p&gt;Sur du SaaS. Et j&#x27;ai bossé largement plus d&#x27;un an sur des problèmatiques de pricing.&lt;&#x2F;p&gt;
&lt;p&gt;Je considère encore aujourd&#x27;hui (peut-être à tort) que ce genre de questions se résume à du foutage de gueule, totalement
déconnecté du réel et qu&#x27;il serait de bon ton de proposer des problématiques business vraisemblables
plutôt que d&#x27;utiliser des proxys merdiques, pensés probablement comme ludiques dans la tête de certains.&lt;&#x2F;p&gt;
&lt;p&gt;Et quand je parle de problématiques vraisemblables, je ne parle pas de demander à une personne
de penser l&#x27;architecture principale du business en une heure.&lt;&#x2F;p&gt;
&lt;p&gt;Je mettrai sans doute ce point sur mon incapacité à faire du &quot;design system&quot; de manière rigoureuse
et efficace.&lt;&#x2F;p&gt;
&lt;p&gt;Pour autant, j&#x27;ai du mal à concevoir qu&#x27;on puisse te dire :
&quot;bon, prends ce CSV dégueulasse. On voudrait avoir cette feature. Comment tu design ta solution ?&quot;&lt;&#x2F;p&gt;
&lt;p&gt;Et la feature, ce n&#x27;est pas une petite brique à côté légèrement simplifiée pour les besoins de l&#x27;exo.
C&#x27;est le coeur de métier de la boîte, et le CSV est une vraie entrée. Le tout en une heure.&lt;&#x2F;p&gt;
&lt;p&gt;Une heure à essayer de démystifier un fichier de base à la qualité douteuse, et improviser une archi
d&#x27;un système sur lequel des personnes travaillent depuis plus d&#x27;un an.
Alerte spoiler : ça ne s&#x27;est pas bien passé.&lt;&#x2F;p&gt;
&lt;p&gt;Si j&#x27;étais totalement nouveau dans le secteur, je prendrais ça comme un signe que je ne suis pas fait pour ça.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;ai bossé sur des systèmes en partant d&#x27;une page blanche, en essayant d&#x27;architecturer ça en pensant au moyen terme (pour le meilleur et pour le pire).
La dernière fois que j&#x27;ai eu à faire ça, j&#x27;ai mis sans doute plus de deux semaines avant de pondre la moindre ligne de code.&lt;&#x2F;p&gt;
&lt;p&gt;Et le projet vient se casser les dents sur la réalité, des erreurs bêtes d&#x27;anticipation ou de sous-estimation de certaines parties
viennent remettre en cause nos pré-conceptions. On itère, on apprend et on passe à autre chose.
Le tout prend un poil plus qu&#x27;une heure.&lt;&#x2F;p&gt;
&lt;p&gt;Donc l&#x27;idée de &quot;bon, on a une heure, ponds-moi une solution pour notre business&quot;, c&#x27;est aussi oublier que la solution
en question a pris du temps, s&#x27;est mangé des murs et a évolué.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;les-cabinets-de-recrutements-a-la-rescousse&quot;&gt;Les cabinets de recrutements à la rescousse&lt;&#x2F;h3&gt;
&lt;p&gt;Un point inédit dans ma carrière, je me suis essayé aux cabinets de recrutement.&lt;&#x2F;p&gt;
&lt;p&gt;Sur le papier, être en contact avec des gens qui sont au fait du marché et en mesure
de proposer les postes adaptés en fonction de mon profil est prometteur.&lt;&#x2F;p&gt;
&lt;p&gt;Fini les soirées à consulter WTTJ dans l&#x27;espoir de trouver une offre qui sorte du lot.&lt;&#x2F;p&gt;
&lt;p&gt;Dans la réalité, j&#x27;ai rapidement déchanté.&lt;&#x2F;p&gt;
&lt;p&gt;La première prise de contact se passe plutôt bien, mais la vitesse à laquelle tout se déroule
me donne un peu le vertige. Soit, on fait avec.&lt;&#x2F;p&gt;
&lt;p&gt;En l&#x27;espace de quelques jours, 3-4 appels sans prévenir. &quot;Voici le topo du poste, est-ce que
ça t&#x27;intéresse ? Oui, non ?&quot;. Je suis toujours en poste, et parfois, je me retrouve avec mon
téléphone en train de sonner alors que je suis en réunion.
Les premières fois, ça passe. Les fois d&#x27;après, c&#x27;est juste gonflant.&lt;&#x2F;p&gt;
&lt;p&gt;Quid des propositions ? La plus-value est moindre. J&#x27;aurais pu tout aussi bien trouver ces
offres moi-même dans la majorité des cas.&lt;&#x2F;p&gt;
&lt;p&gt;Tu finis par passer quelques entretiens, et le téléphone sonne peu de temps après.
Résumé de l&#x27;entretien, des questions posées, du ressenti et autres.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;ai l&#x27;impression d&#x27;avoir en face de moi des commerciaux d&#x27;ESN, plus soucieux de leurs
commissions que de leur mission première.&lt;&#x2F;p&gt;
&lt;p&gt;Le pire, c&#x27;est quand il y a de la redite entre le client final et le cabinet que ce soit
pour planifier la suite ou pour les retours. La perte de temps et la gestion des intermédiaires
font monter la frustration.&lt;&#x2F;p&gt;
&lt;p&gt;D&#x27;autres vous laisse un peu plus d&#x27;air quant à votre organisation ce qui me convient un peu mieux.
La contrepartie, c&#x27;est qu&#x27;une personne de ce cabinet vous enverra un message toutes les semaines
pour savoir où vous en êtes, sans avoir quelque chose de pertinent à ajouter.&lt;&#x2F;p&gt;
&lt;p&gt;De cette petite expérience, j&#x27;en conclus sans trop les accabler que ce n&#x27;est pas pour moi.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;la-conclusion&quot;&gt;La conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Si vous avez tenu jusqu&#x27;ici, merci de m&#x27;avoir lu ! Encore un peu de courage, on arrive à la fin.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;ai hésité longuement avant d&#x27;écrire ce billet, probablement de peur de passer pour un mauvais perdant.&lt;&#x2F;p&gt;
&lt;p&gt;Autant je peux reconnaître mes lacunes, autant certains retours me font penser que j&#x27;aurais peut-être dû
passer mon temps à faire autre chose de plus constructif.&lt;&#x2F;p&gt;
&lt;p&gt;En une année à prospecter pour un nouveau job par intermittence, hormis la critique de la méthodologie en tant
que telle, un des points qui m&#x27;a le plus impacté est mon ressenti personnel.&lt;&#x2F;p&gt;
&lt;p&gt;Si autant de boîtes me disent non, que penser de mes capacités en tant que développeur ?&lt;&#x2F;p&gt;
&lt;p&gt;Pourquoi dans toutes mes expériences, des personnes me disent qu&#x27;elles re-travailleraient avec moi avec plaisir
alors qu&#x27;aux vues de tous ces entretiens, je suis à la ramasse techniquement ?&lt;&#x2F;p&gt;
&lt;p&gt;Est-ce que je ne devrais pas prendre le temps nécessaire pour me former à passer des
entretiens comme on répéterait un numéro de cirque ?&lt;&#x2F;p&gt;
&lt;p&gt;Difficile de ne pas tomber dans un pseudo syndrome de l&#x27;imposteur après tout ça. Et encore plus difficile de se
motiver à coder un peu le soir, quand on se dit &quot;à quoi bon&quot; et quand vos intérêts techniques divergent avec
ceux qui veulent faire du business.&lt;&#x2F;p&gt;
&lt;p&gt;Je ne sais pas ce que je peux dire quand on me demande de me vendre et qu&#x27;à côté de ça je demande &quot;euh pourquoi
Mongo ? Ah, c&#x27;est parce que c&#x27;est la DB avec le CTO a le plus d&#x27;affinité&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Tout ce que je sais à l&#x27;heure actuelle, c&#x27;est que j&#x27;ai enfin trouvé une boîte qui a l&#x27;air de correspondre à ce que je cherchais, loin de l&#x27;ambiance start-up,
clôturant au passage une année d&#x27;entretiens avec ses hauts et ses bas.&lt;&#x2F;p&gt;
&lt;p&gt;Pas franchement hâte d&#x27;en repasser.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Janvier 2024</title>
          <pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2024-01/</link>
          <guid>/links/2024-01/</guid>
          <description xml:base="/links/2024-01/">&lt;h2 id=&quot;c-est-tout-nouveau&quot;&gt;C&#x27;est tout nouveau&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.vim.org&#x2F;vim-9.1-released.php&quot;&gt;Vim 9.1 is available&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.cachix.org&#x2F;posts&#x2F;2024-01-02-stamina-haskell-library-for-retries&#x2F;&quot;&gt;Stamina: Haskell library for retries&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mysql-js&quot;&gt;MySQL.js&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blogs.oracle.com&#x2F;mysql&#x2F;post&#x2F;introducing-javascript-support-in-mysql&quot;&gt;Introducing JavaScript support in MySQL&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=WjS7_ERqHxI&quot;&gt;ThePrimeTime - JavaScript IN MySQL DATABASE????&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;l-interlude-jeux-video&quot;&gt;L’interlude jeux vidéo&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=hYMZsMMlubg&quot;&gt;Why Doom is Awesome: Binary Space Partitioning&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=p8u_k2LIZyo&quot;&gt;Fast Inverse Square Root — A Quake III Algorithm&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=2SuvO4Gi7uY&quot;&gt;Superpositions, Sudoku, the Wave Function Collapse algorithm.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;parce-qu-on-ne-parle-pas-assez-d-ia&quot;&gt;Parce qu&#x27;on ne parle pas assez d&#x27;IA&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=rAG5YtBsBTw&quot;&gt;Vous ne rêvez pas, ChatGPT est devenu mauvais&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=VHHT6W-N0ak&quot;&gt;Torvalds Speaks: Impact of Artificial Intelligence on Programming&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nos-entreprises-ont-du-talent&quot;&gt;Nos entreprises ont du talent&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;torrentfreak.com&#x2F;dns-block-canal-sues-cloudflare-google-cisco-to-fight-piracy-231230&#x2F;&quot;&gt;DNS Block: Canal+ Sues Cloudflare, Google &amp;amp; Cisco to Fight Piracy&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gizmodo.com&#x2F;meet-link-history-facebook-s-new-way-to-track-the-we-1851134018&quot;&gt;Meet ‘Link History,’ Facebook’s New Way to Track the Websites You Visit&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=4HHUGnHcDQw&quot;&gt;Math - 2023&#x27;s Biggest Breakthroughs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;time.com&#x2F;5752129&#x2F;y2k-bug-history&#x2F;&quot;&gt;20 Years Later, the Y2K Bug Seems Like a Joke—Because Those Behind the Scenes Took It Seriously&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;meteofrance.fr&#x2F;actualite&#x2F;presse&#x2F;au-1er-janvier-2024-donnees-publiques-en-acces-libre&quot;&gt;Les données de Météo France en accès libre et gratuit&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;silhding.github.io&#x2F;2021&#x2F;08&#x2F;20&#x2F;A-Closer-Look-to-a-Key-Value-Storage-Engine&#x2F;&quot;&gt;A Closer Look to a Key-Value Storage Engine&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;etodd.io&#x2F;2024&#x2F;01&#x2F;01&#x2F;waiting-on-tests&#x2F;&quot;&gt;Waiting on Tests&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.zstavropoulos.com&#x2F;learning-a-new-language-by-making-projects&#x2F;&quot;&gt;Learning a new language by making projects&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jpospisil.com&#x2F;2023&#x2F;12&#x2F;19&#x2F;the-hidden-gems-of-moreutils&quot;&gt;The hidden gems of moreutils&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=JDLgw8Po9QY&quot;&gt;Database Sharding in 200 Seconds&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;techcrunch.com&#x2F;2024&#x2F;01&#x2F;03&#x2F;whats-next-for-mozilla&#x2F;&quot;&gt;What’s next for Mozilla?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;st4lk.github.io&#x2F;en&#x2F;blog&#x2F;2023&#x2F;12&#x2F;09&#x2F;sqlalchemy-vs-django-orm&#x2F;&quot;&gt;SQLALchemy vs Django ORM&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.scmagazine.com&#x2F;news&#x2F;npm-registry-prank-leaves-developers-unable-to-unpublish-packages&quot;&gt;NPM registry prank leaves developers unable to unpublish packages&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;frederic.menou.me&#x2F;writings&#x2F;retrospective-2023&#x2F;&quot;&gt;Retrospective 2023 (by @ptitfred)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rien-a-voir-avec-la-choucroute&quot;&gt;Rien à voir avec la choucroute&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=wEAPMZeZ1cY&quot;&gt;Le Cinéma C&#x27;était Mieux Avant ｜Partie 1 feat. @LaSeanceDeMarty&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>La joie d&#x27;utiliser les enums avec M-&#x27;aïe&#x27;-SQL</title>
          <pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/dev_null/la-joie-dutiliser-maiesql/</link>
          <guid>/dev_null/la-joie-dutiliser-maiesql/</guid>
          <description xml:base="/dev_null/la-joie-dutiliser-maiesql/">&lt;p&gt;Depuis que j&#x27;ai commencé à faire du backend, j&#x27;ai retenu deux points concernant les base de données :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;&quot;&gt;PostgreSQL&lt;&#x2F;a&gt; est presque toujours un bon choix par défaut pour commencer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mongodb.com&quot;&gt;MongoDB&lt;&#x2F;a&gt; est presque toujours un mauvais choix, pour commencer ou non&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Cette année, j&#x27;ai eu l&#x27;occasion de sortir de ma zone de confort et manger du MySQL tous les jours. Et Postgres, c&#x27;est quand même pas mal.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;les-enums&quot;&gt;Les enums&lt;&#x2F;h2&gt;
&lt;p&gt;Imaginons que vous ayez un champ pour lequel les valeurs sont limitées et connues.&lt;&#x2F;p&gt;
&lt;p&gt;Une première solution est d&#x27;utiliser une colonne de type &lt;code&gt;text&lt;&#x2F;code&gt; (ou &lt;code&gt;varchar&lt;&#x2F;code&gt;) et vous déplacez la contrainte qu&#x27;est l&#x27;enum côté applicatif.
Logiquement, le webservice est le seul point d&#x27;entrée pour écrire dans la base. Sauf quand vous bossez sur une migration un peu délicate, ou quand, par le plus grand des mystères cosmiques, vous avez un bug qui vous oblige à corriger la donnée à la main.&lt;&#x2F;p&gt;
&lt;p&gt;Avoir cette validation directement gérée par la base de donnée est donc un petit plus pour se prémunir de fâcheuses typos.
S&#x27;ajoute à ça un potentiel gain de place en terme de stockage, j&#x27;imagine.&lt;&#x2F;p&gt;
&lt;p&gt;Prenons un cas simple inspiré de la &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dev.mysql.com&#x2F;doc&#x2F;refman&#x2F;5.7&#x2F;en&#x2F;enum.html&quot;&gt;documentation&lt;&#x2F;a&gt; de MySQL :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;CREATE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; TABLE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; shirts&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; VARCHAR&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;40&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; NOT NULL&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    size&lt;&#x2F;span&gt;&lt;span&gt; ENUM(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;medium&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;NOT NULL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Avec Postgres, on a une définition similaire à quelques détails près :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;CREATE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; TYPE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; shirt_size&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; AS&lt;&#x2F;span&gt;&lt;span&gt; ENUM (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;medium&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;CREATE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; TABLE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; shirts&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; text&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    size&lt;&#x2F;span&gt;&lt;span&gt; shirt_size&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tout fonctionne, tout le monde est heureux. Jusqu&#x27;au jour où il faut ajouter une ou plusieurs tailles de T-shirt.&lt;&#x2F;p&gt;
&lt;p&gt;Depuis Postgres &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;docs&#x2F;release&#x2F;9.1.0&#x2F;&quot;&gt;9.1&lt;&#x2F;a&gt;, la modification peut se faire plutôt simplement :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ALTER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; TYPE&lt;&#x2F;span&gt;&lt;span&gt; shirt_size &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ADD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; VALUE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;xx-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; BEFORE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ALTER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; TYPE&lt;&#x2F;span&gt;&lt;span&gt; shirt_size &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ADD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; VALUE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;xx-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; AFTER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et maintenant, la même avec MySQL :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ALTER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; TABLE&lt;&#x2F;span&gt;&lt;span&gt; shirts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    MODIFY&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; size&lt;&#x2F;span&gt;&lt;span&gt; ENUM(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;xx-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;medium&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;xx-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En 2023, même avec la dernière version on est donc obligé de se refaire toute la série de valeur alors qu&#x27;on souhaite juste ajouter deux valeurs.&lt;&#x2F;p&gt;
&lt;p&gt;Pire encore, on lock la table le temps de passer toute la migration et comme on redéfinit toute l&#x27;enum, on est obligé de revalider chaque ligne avec le nouveau schéma.
En l&#x27;état, quasi-impossible de faire du zero-downtime quand on veut passer ce genre de migration.&lt;&#x2F;p&gt;
&lt;p&gt;Seul levier sur lequel on peut jouer est le &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dev.mysql.com&#x2F;doc&#x2F;refman&#x2F;8.0&#x2F;en&#x2F;innodb-online-ddl-operations.html&quot;&gt;type d&#x27;algo à utiliser pour le DDL&lt;&#x2F;a&gt; : bon courage.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;dev_null&#x2F;la-joie-dutiliser-maiesql&#x2F;online_ddl_operations.png&quot; alt=&quot;Online DDL operations&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Sur le papier, c&#x27;est déjà un bon début mais certaines contraintes font que ça ne fonctionnera pas à tout les coups, et on se retrouve à essayer d&#x27;anticiper le comportement de MySQL en tombant souvent à côté de la plaque :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Modifying the definition of an ENUM or SET column by adding new enumeration or set members to the end of the list of valid member values may be performed instantly or in place, as long as the storage size of the data type does not change. For example, adding a member to a SET column that has 8 members changes the required storage per value from 1 byte to 2 bytes; this requires a table copy. Adding members in the middle of the list causes renumbering of existing members, which requires a table copy.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;En plus d&#x27;un an, on n&#x27;a toujours pas trouvé une manière pérenne de jouer ce genre de migration sans se taper une plâtrée d&#x27;erreur dûes au lock sur la table impactée.&lt;&#x2F;p&gt;
&lt;p&gt;Conclusion : le coût opérationnel d&#x27;utiliser des enums avec MySQL, contrairement à Postgres, est tellement important qu&#x27;il vaut mieux s&#x27;abstenir et utiliser un simple champ texte.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;strict-ou-pas-strict-tel-est-le-wtf&quot;&gt;Strict ou pas strict, tel est le WTF&lt;&#x2F;h2&gt;
&lt;p&gt;Pour quelqu&#x27;un comme moi qui aime le typage fort et statique, un des avantages à utiliser une base de données SQL est dans l&#x27;auto-documentation qu&#x27;un schéma de données peut fournir.&lt;&#x2F;p&gt;
&lt;p&gt;En reprenant l&#x27;exemple précédent :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; DESCRIBE shirts;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-----+----------------------------------------------------+------+-----+---------+-------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| Field | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;Type&lt;&#x2F;span&gt;&lt;span&gt;                                               | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;Null&lt;&#x2F;span&gt;&lt;span&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;Key&lt;&#x2F;span&gt;&lt;span&gt; | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;Default&lt;&#x2F;span&gt;&lt;span&gt; | Extra |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-----+----------------------------------------------------+------+-----+---------+-------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;  | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;varchar&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;40&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;                                        | YES  |     | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;NULL&lt;&#x2F;span&gt;&lt;span&gt;    |       |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;size&lt;&#x2F;span&gt;&lt;span&gt;  | enum(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;small&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;medium&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x-large&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;) | YES  |     | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;NULL&lt;&#x2F;span&gt;&lt;span&gt;    |       |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-----+----------------------------------------------------+------+-----+---------+-------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;00&lt;&#x2F;span&gt;&lt;span&gt; sec)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et un jour de grand soleil, c&#x27;est le drame : alerte en prod&#x27;, le bout de code en charge de désérialiser les lignes de cette table échoue pour une raison surprenante.&lt;&#x2F;p&gt;
&lt;p&gt;Dans les grandes lignes, le code vous dira gentiment :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Euh, t&#x27;es gentil mais qu&#x27;est-ce que je fais d&#x27;une &#x27;size&#x27; qui est une chaîne vide ?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;En vérifiant rapidement en base, on constate bien le problème :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; select distinct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; size&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span&gt; shirts;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-----+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;size&lt;&#x2F;span&gt;&lt;span&gt;  |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-----+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| large |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|       |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-----+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; rows&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;00&lt;&#x2F;span&gt;&lt;span&gt; sec)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Une petite recherche sur votre moteur préféré, et on commence à comprendre quel est &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;1868380&#x2F;mysql-enums-always-contain-empty-string-in-possibilities&quot;&gt;le souci&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Tiré de la &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dev.mysql.com&#x2F;doc&#x2F;refman&#x2F;8.0&#x2F;en&#x2F;enum.html&quot;&gt;documentation de MySQL&lt;&#x2F;a&gt; :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Empty or NULL Enumeration Values&lt;&#x2F;p&gt;
&lt;p&gt;An enumeration value can also be the empty string (&#x27;&#x27;) or NULL under certain circumstances:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If you insert an invalid value into an ENUM (that is, a string not present in the list of permitted values), the empty string is inserted instead as a special error value. This string can be distinguished from a “normal” empty string by the fact that this string has the numeric value 0. See Index Values for Enumeration Literals for details about the numeric indexes for the enumeration values.&lt;&#x2F;li&gt;
&lt;li&gt;If strict SQL mode is enabled, attempts to insert invalid ENUM values result in an error.&lt;&#x2F;li&gt;
&lt;li&gt;If an ENUM column is declared to permit NULL, the NULL value is a valid value for the column, and the default value is NULL. If an ENUM column is declared NOT NULL, its default value is the first element of the list of permitted values.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Donc si on résume, selon la configuration de la base le comportement n&#x27;est pas le même concernant le fait d&#x27;insérer des valeurs d&#x27;enum invalides:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;par défaut, avec le mode strict activé, l&#x27;opération échoue et on rollback&lt;&#x2F;li&gt;
&lt;li&gt;si le mode strict est désactivé, MySQL insére une chaîne vide et l&#x27;erreur tombe dans les limbes de l&#x27;oubli pour venir nous hanter plus tard&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Pour vérifier ce petit bout de config :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; show variables &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;like&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;sql_mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-------------+-------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| Variable_name | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-------------+-------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| sql_mode      |       |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-------------+-------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; row&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;00&lt;&#x2F;span&gt;&lt;span&gt; sec)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lors du setup de ma base de test, la config par défaut ressemblait à :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; show variables &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;like&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;sql_mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-------------+-----------------------------------------------------------------------------------------------------------------------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| Variable_name | &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span&gt;                                                                                                                 |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-------------+-----------------------------------------------------------------------------------------------------------------------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;-------------+-----------------------------------------------------------------------------------------------------------------------+&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; row&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;00&lt;&#x2F;span&gt;&lt;span&gt; sec)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ici, c&#x27;est l&#x27;absence de la valeur &lt;code&gt;STRICT_TRANS_TABLES&lt;&#x2F;code&gt; qui est responsable de ce comportement que certains qualifieraient de foireux.&lt;&#x2F;p&gt;
&lt;p&gt;Et quand je demande au reste du plateau pourquoi la base de prod a une configuration aussi merdique (pas en ces termes évidemment, derrière chaque décision un peu stupide se cache une motivation raisonnable) :&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;dev_null&#x2F;la-joie-dutiliser-maiesql&#x2F;awkward_silence.gif&quot; alt=&quot;awkward silence&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Question bonus : que se passe-t-il lorsqu&#x27;on réactive le mode strict avec des valeurs invalides ?&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; sql_mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Réponse : rien. MySQL garde les chaînes vides, ce qui paraît avec un peu de recul, une sage décision.&lt;&#x2F;p&gt;
&lt;p&gt;La résolution du problème a posteriori se fait en deux étapes :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;changer la config pour celle par défaut, et donc un peu plus strict&lt;&#x2F;li&gt;
&lt;li&gt;modifier les lignes impactées, ce qui a posteriori est casse-gueule étant donné qu&#x27;on vient juste de perdre de la donnée&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;un-mot-pour-la-fin&quot;&gt;Un mot pour la fin ?&lt;&#x2F;h2&gt;
&lt;p&gt;Tabouret. T-A-B-O-U-R-E-T. Tabouret.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Décembre 2023</title>
          <pubDate>Sat, 30 Dec 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2023-12/</link>
          <guid>/links/2023-12/</guid>
          <description xml:base="/links/2023-12/">&lt;h2 id=&quot;pour-passer-le-temps&quot;&gt;Pour passer le temps&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brickception.xyz&#x2F;&quot;&gt;Brickception&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;c-est-tout-nouveau&quot;&gt;C&#x27;est tout nouveau&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.djangoproject.com&#x2F;en&#x2F;5.0&#x2F;releases&#x2F;5.0&quot;&gt;Django 5.0 release notes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asyncapi.com&#x2F;blog&#x2F;release-notes-3.0.0&quot;&gt;AsyncAPI 3.0.0 Release Notes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sqlite.org&#x2F;forum&#x2F;forumpost&#x2F;fa6f64e3dc1a5d97&quot;&gt;SQLite - JSONB has landed&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ruby-lang.org&#x2F;en&#x2F;news&#x2F;2023&#x2F;12&#x2F;25&#x2F;ruby-3-3-0-released&#x2F;&quot;&gt;Ruby 3.3.0 Released&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;encore-du-sql&quot;&gt;Encore du SQL&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;buttondown.email&#x2F;jaffray&#x2F;archive&#x2F;the-case-of-a-curious-sql-query&quot;&gt;The Case of a Curious SQL Query&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jepsen.io&#x2F;analyses&#x2F;mysql-8.0.34&quot;&gt;Jepsen - MySQL 8.0.34&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.thenile.dev&#x2F;blog&#x2F;transaction-isolation-postgres&quot;&gt;Transaction Isolation in Postgres, explained&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;aie&quot;&gt;AÏe&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;locusmag.com&#x2F;2023&#x2F;12&#x2F;commentary-cory-doctorow-what-kind-of-bubble-is-ai&#x2F;&quot;&gt;Cory Doctorow: What Kind of Bubble is AI?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;basta.media&#x2F;matmut-logiciel-smart-surveillance-management-risques-psychosociaux-travail-impossible-degradation-service&quot;&gt;À la Matmut, quand un nouveau logiciel rend le travail impossible&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=q5qAVmXSecQ&quot;&gt;Google&#x27;s Gemini just made GPT-4 look like a baby’s toy?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=90CYYfl9ntM&quot;&gt;The Gemini Lie&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bump.sh&#x2F;blog&#x2F;openapi-asyncapi-ref-usage-guide&quot;&gt;OpenAPI &amp;amp; AsyncAPI $ref: Advanced Guide&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;buttondown.email&#x2F;hillelwayne&#x2F;archive&#x2F;edge-case-poisoning&#x2F;&quot;&gt;Edge Case Poisoning&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=cDY2p1CTkPo&quot;&gt;I Redesigned the ENTIRE Steam UI from Scratch&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=vyQv563Y-fk&quot;&gt;You probably won’t survive 2024... Top 10 Tech Trends&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aphyr.com&#x2F;posts&#x2F;367-why-is-jepsen-written-in-clojure&quot;&gt;Why is Jepsen Written in Clojure?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wasp-lang.dev&#x2F;blog&#x2F;2023&#x2F;12&#x2F;05&#x2F;writing-rfcs&quot;&gt;On the Importance of RFCs in Programming&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;loup-vaillant.fr&#x2F;articles&#x2F;source-of-readability&quot;&gt;The Source of Readability&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.allegro.tech&#x2F;2023&#x2F;11&#x2F;how-does-btree-make-your-queries-fast.html&quot;&gt;How does B-tree make your queries fast?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;buttondown.email&#x2F;hillelwayne&#x2F;archive&#x2F;advice-for-new-software-devs-whove-read-all-those&#x2F;&quot;&gt;Advice for new software devs who&#x27;ve read all those other advice essays&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.theverge.com&#x2F;2023&#x2F;12&#x2F;18&#x2F;24005996&#x2F;adobe-figma-acquisition-abandoned-termination-fee&quot;&gt;Adobe abandons $20 billion acquisition of Figma&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;counterexamples.org&#x2F;intro.html&quot;&gt;Counterexamples in Type Systems&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;josem.co&#x2F;the-beauty-of-finished-software&#x2F;&quot;&gt;The beauty of finished software&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jstrieb&#x2F;just.sh&quot;&gt;Just.sh - Compile Justfiles to portable shell scripts&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;slack.engineering&#x2F;executing-cron-scripts-reliably-at-scale&#x2F;&quot;&gt;Slack - Executing Cron Scripts Reliably At Scale&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sieg.fr&#x2F;ied&#x2F;tag&#x2F;avent-2023&quot;&gt;Calendrier de l&#x27;avent des choses liées au boulot&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=GtYDhcVTNxo&quot;&gt;How Jusant Makes Rock-Climbing More Immersive&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=jjj6rjZ0mXo&quot;&gt;La norme 5G est une mafia&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dev.to&#x2F;chshersh&#x2F;8-months-of-ocaml-after-8-years-of-haskell-in-production-h96&quot;&gt;8 months of OCaml after 8 years of Haskell in production&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.stackbuilders.com&#x2F;blog&#x2F;the-uncommon-advantage-from-training-in-unpopular-programming-languages&#x2F;&quot;&gt;The Uncommon Advantage from Training in Unpopular Programming Languages&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;andreasjhkarlsson.github.io&#x2F;jekyll&#x2F;update&#x2F;2023&#x2F;12&#x2F;27&#x2F;4-billion-if-statements.html&quot;&gt;4 billion if statements&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pabloariasal.github.io&#x2F;2023&#x2F;12&#x2F;27&#x2F;git-worktrees&#x2F;&quot;&gt;Boost Your Workflow: Exploring Git Worktrees&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=9qljpi5jiMQ&quot;&gt;GitHub actions feels bad&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=_oNOTknRTSU&quot;&gt;Eric Wastl – Advent of Code: Behind the Scenes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;smartlink.ausha.co&#x2F;developer-experience&#x2F;celine-louvet&quot;&gt;Céline : 18 ans d&#x27;exploration technique et humaine dans l&#x27;informatique&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>L&#x27;Advent of Code 2023</title>
          <pubDate>Wed, 27 Dec 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/random/aoc-2023/</link>
          <guid>/random/aoc-2023/</guid>
          <description xml:base="/random/aoc-2023/">&lt;p&gt;Pour celles et ceux qui ne connaîtrait pas, l&#x27;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;adventofcode.com&#x2F;&quot;&gt;Advent of Code&lt;&#x2F;a&gt; est, comme son nom le laisse sous-entendre, un calendrier de l&#x27;avent de &quot;petits&quot; challenges d&#x27;algorithmie plutôt chouette.&lt;&#x2F;p&gt;
&lt;p&gt;Depuis 2015, du 1er au 25 Décembre, le site propose un problème en deux parties à résoudre.&lt;&#x2F;p&gt;
&lt;p&gt;Chaque jour, un peu de storytelling en lien avec Noël, des lutins pas très doués, une présentation du problème à résoudre avec une entrée de taille raisonnable et une explication du raisonnement.&lt;&#x2F;p&gt;
&lt;p&gt;Généralement, le problème se scinde en deux parties avec le même fonctionnement :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;la réponse attendue est un entier positif&lt;&#x2F;li&gt;
&lt;li&gt;un exemple d&#x27;input (relativement petit) est donné avec le raisonnement pas par pas pour trouver la réponse&lt;&#x2F;li&gt;
&lt;li&gt;un fichier d&#x27;input de taille beaucoup plus conséquente vous est généré par le site, que vous devrez utiliser pour trouver la réponse attendue (ce qui va, évidemment, poser des soucis de scalabilité de votre solution)&lt;&#x2F;li&gt;
&lt;li&gt;une fois la bonne réponse trouvée, rebelotte pour la deuxième partie&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Cette deuxième partie est soit :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;un ajustement du parsing de l&#x27;entrée&lt;&#x2F;li&gt;
&lt;li&gt;une mise à l&#x27;échelle plus importante, rendant toutes solutions &quot;brute-force&quot; trop longues à faire tourner, voire impossible&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Le challenge ayant commencé en 2015, je m&#x27;étais essayé à l&#x27;exercice de manière un peu laborieuse en 2017 sans grand succès (en tout et pour tout, 4 jours).&lt;&#x2F;p&gt;
&lt;p&gt;Cette année, à cause (ou grâce à, tout dépend de comment on voit le verre) de mon contexte professionnel un peu hasardeux, je me suis mis en tête d&#x27;essayer de faire cette édition 2023 de bout en bout.&lt;&#x2F;p&gt;
&lt;p&gt;Il faut noter que la difficulté des challenges peut varier grandement d&#x27;un jour à l&#x27;autre, les premiers jours étant des plus faciles.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;et-alors-le-bilan-samuel&quot;&gt;Et alors, le bilan Samuel ?&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hello-morty-i-m-quiche-rick&quot;&gt;Hello Morty, I&#x27;m quiche-Rick&lt;&#x2F;h3&gt;
&lt;p&gt;A ce jour, je viens de complèter les 25 jours (avec une aide considérable sur la dernière semaine mais j&#x27;y reviendrai).&lt;&#x2F;p&gt;
&lt;p&gt;L&#x27;AoC étant un challenge principalement DSA (pour Data Structure Algorithm), les quelques points à maîtriser sont, entre autre:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;le parsing, part léger du problème étant donné que le format est souvent simple et qu&#x27;il n&#x27;y a presque jamais de gestion d&#x27;erreur à gérer (l&#x27;input correspondant parfaitement au format présenté)&lt;&#x2F;li&gt;
&lt;li&gt;le choix de structure de données&lt;&#x2F;li&gt;
&lt;li&gt;les itérations, ou plus généralement l&#x27;algo que vous allez appliquer (duh, oui je sais)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Les premiers jours étaient relativement faciles, bien que certains étaient un peu plus corsés que d&#x27;autres.&lt;&#x2F;p&gt;
&lt;p&gt;Et après un mois de challenge, je me suis rendu compte que j&#x27;étais une quiche complète sur pas mal de points:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;les graphes&lt;&#x2F;li&gt;
&lt;li&gt;la programmation dynamique&lt;&#x2F;li&gt;
&lt;li&gt;tout ce qui est algo de floodfill, BFS etc... (bien que l&#x27;intuition soit là, je bloque complètement au moment d&#x27;écrire une ligne de code)&lt;&#x2F;li&gt;
&lt;li&gt;algo de géomètrie pour calculer des aires de polygones, ou encore trouver les points à l&#x27;intérieur d&#x27;une courbe&lt;&#x2F;li&gt;
&lt;li&gt;la gestion d&#x27;intervalles&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Bref, que des choses un peu velues tant qu&#x27;on ne les a pas vu et &#x2F; ou pratiquées maintes et maintes fois.&lt;&#x2F;p&gt;
&lt;p&gt;Evidemment, toutes ces choses ne me sont quasiment d&#x27;aucune utilité dans mon quotidien en tant que développeur web.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;ai appris pas mal de choses, pour certaines dont j&#x27;ai un peu honte étant donné que ma carrière frôle bientôt la décennie :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deque&lt;&#x2F;code&gt; de Python (et d&#x27;autres structures comme les priority queues)&lt;&#x2F;li&gt;
&lt;li&gt;le pathfinding, la traversée de graphes et d&#x27;autres algo de ce genre&lt;&#x2F;li&gt;
&lt;li&gt;la &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Shoelace_formula&quot;&gt;&lt;code&gt;Shoelace formula&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; et &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Pick%27s_theorem&quot;&gt;&lt;code&gt;Pick&#x27;s theorem&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sympy.org&#x2F;en&#x2F;index.html&quot;&gt;&lt;code&gt;sympy&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; pour faire de l&#x27;algèbre et &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;networkx.org&#x2F;&quot;&gt;&lt;code&gt;networkx&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; pour la gestion complexe de graphe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Et de cette liste, j&#x27;en tire quelques sujets à approfondir dans les prochains mois, même si, encore une fois, ça ne me servira sans doute que très peu à faire du CRUD.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;time-is-money-money-is-power-power-is-pizza-pizza-is-knowledge&quot;&gt;Time is money, money is power, power is pizza, pizza is knowledge&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;em&gt;April Ludgate, Parks &amp;amp; Recs&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Tout ça, ça prend du temps. Encore plus lorsque vous cherchez par vous même (ce qui est évidemment le plus gratifiant).
Et, pour peu que vous coinciez mais qu&#x27;il vous faille vaquer à d&#x27;autres sujets un peu plus rentables, le problème vous restera dans la tête
et vous passerez une énergie folle à retourner le problème dans tout les sens et expérimenter entre deux builds.&lt;&#x2F;p&gt;
&lt;p&gt;Evidemment, si vous voulez être dans le leaderboard, il va falloir vous lever tôt (ce qui est loin d&#x27;être mon cas) et vous focaliser uniquement là-dessus (ce qui est, encore, loin d&#x27;être mon cas).
Pour le reste du communs des mortels, il faut relâcher un peu la pression. Résoudre un problème trois jours après n&#x27;est pas si dramatique que ça, et
qui plus est, vous éviterez d&#x27;y passer votre week-end.&lt;&#x2F;p&gt;
&lt;p&gt;Pour éviter de bloquer sans avancer dans votre coin, le subreddit &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;adventofcode&#x2F;&quot;&gt;&#x2F;r&#x2F;adventofcode&lt;&#x2F;a&gt; crée un megathread par problème
où tout le monde poste leurs idées de solutions. Comme l&#x27;input donné à chaque exercice diffère pour chaque utilisateur, vous ne trouverez pas de réponse directe (et c&#x27;est bien mieux comme ça).
Toutefois, ça donne quelques lignes directrices sur des algos, des astuces que vous ne connaîtriez pas.&lt;&#x2F;p&gt;
&lt;p&gt;Après avoir bloqué sur quelques problèmes de la dernière semaine, j&#x27;ai un peu changé d&#x27;approche quant au challenge.&lt;&#x2F;p&gt;
&lt;p&gt;Je suis tombé sur la très chouette chaîne &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;@hyper-neutrino&quot;&gt;HyperNeutrino&lt;&#x2F;a&gt;, qui a sorti chaque jour une vidéo résumant
sa solution au problème du jour, le tout saupoudré de quelques explications et illustrations &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;excalidraw.com&#x2F;&quot;&gt;Excalidraw&lt;&#x2F;a&gt;.
Au lieu de me torturer chaque jour de manière désespérée, je me suis bloqué une petite heure à coder en ayant comme support ses vidéos.
Je peux comprendre l&#x27;approche, me noter quelques points à approfondir et exercer, et passer à autre chose.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;une-petite-digression-sur-copilot&quot;&gt;Une petite digression sur Copilot&lt;&#x2F;h3&gt;
&lt;p&gt;Loin de moi l&#x27;idée d&#x27;en rajouter sur l&#x27;effervescence légèrement agaçante autour des LLMs, ni les doutes légitimes qu&#x27;on puisse avoir
sur les méthodes d&#x27;entraînement de l&#x27;outil sorti par Github.&lt;&#x2F;p&gt;
&lt;p&gt;Au bout d&#x27;un an à avoir lu les retours d&#x27;expérience et les délires futuristes de certains, j&#x27;ai décidé d&#x27;appliquer l&#x27;adage de mes parents :&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bah comment tu peux savoir que c&#x27;est pas bon si t&#x27;as pas goûté&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Si ça a fonctionné pour les endives au jambon, ça doit fonctionner pour d&#x27;autres trucs.&lt;&#x2F;p&gt;
&lt;p&gt;Un matin, j&#x27;ai donc craqué et pris une licence personnel pour Copilot. Et après une petite heure, la complétion fonctionnait
à merveille dans mon éditeur préféré.&lt;&#x2F;p&gt;
&lt;p&gt;Les premières semaines d&#x27;utilisation ont été plutôt agréables, les propositions m&#x27;ont fait gagné pas mal de temps sur la base de code
sur laquelle je travaille au quotidien. Les tests sont un poil moins rébarbatifs à écrire, et je gagne un peu de temps sur l&#x27;implémentation
de courtes fonctions utilitaires.&lt;&#x2F;p&gt;
&lt;p&gt;Mais sur l&#x27;AoC, le nombre de fois où j&#x27;ai levé les yeux au ciel ferait le bonheur de mon orthoptiste.
Evidemment, comme beaucoup de gens ont versionné leurs solutions des années précédentes sur Github, Copilot se fait un malin plaisir
à me vomir des dizaines de lignes de code d&#x27;exercices d&#x27;années précédentes, tel un élève un peu trop enthousiaste qui lève la main en permanence pour dire
&quot;moi je sais, moi je sais&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Je me suis retrouvé embarqué à faire du pair-programming virtuel avec un outil qui ne me laissait pas
une seule seconde pour réfléchir proprement ou expérimenter.&lt;&#x2F;p&gt;
&lt;p&gt;Etant donné ma configuration, le moyen le plus simple pour laisser mon cerveau respirer fut de couper tout bonnement la complétion.
Ce qui est légèrement dommage pour un outil dont le but premier est d&#x27;assister.&lt;&#x2F;p&gt;
&lt;p&gt;Je le réactiverai sûrement pour des projets pro ou même perso et ferai en sorte de pouvoir le couper ou l&#x27;activer en deux touches (merci Neovim).&lt;&#x2F;p&gt;
&lt;p&gt;Pour le moment, l&#x27;effet waouh s&#x27;est un peu estompé, mais l&#x27;avoir dans sa caisse à outil en complément d&#x27;un bon plugin LSP rend le quotidien un peu plus agréable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;un-dernier-mot-pour-conclure&quot;&gt;Un dernier mot pour conclure ?&lt;&#x2F;h2&gt;
&lt;p&gt;Choucroute.&lt;&#x2F;p&gt;
&lt;p&gt;Et joyeuses fêtes à toutes et tous.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;random&#x2F;aoc-2023&#x2F;happy_holidays.gif&quot; alt=&quot;Happy Holidays&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Novembre 2023</title>
          <pubDate>Thu, 30 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2023-11/</link>
          <guid>/links/2023-11/</guid>
          <description xml:base="/links/2023-11/">&lt;h2 id=&quot;nouvelles-sorties&quot;&gt;Nouvelles sorties&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devblogs.microsoft.com&#x2F;dotnet&#x2F;announcing-fsharp-8&quot;&gt;Announcing F# 8&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;seanmonstar.com&#x2F;blog&#x2F;hyper-v1&quot;&gt;Hyper v1&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vitejs.dev&#x2F;blog&#x2F;announcing-vite5&quot;&gt;Vite 5.0 is out!&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;langages&quot;&gt;Langages&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;humanwhocodes.com&#x2F;blog&#x2F;2023&#x2F;09&#x2F;javascript-wtf-why-does-every-return-true-for-empty-array&quot;&gt;JavaScript WTF: Why does every() return true for an empty arrays?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.totaltypescript.com&#x2F;type-vs-interface-which-should-you-use&quot;&gt;Type vs Interface: Which Should You Use?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.svix.com&#x2F;blog&#x2F;using-the-type-system-effectively&quot;&gt;Using the Type System effectively&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.stefanjudis.com&#x2F;blog&#x2F;validate-urls-in-javascript&#x2F;&quot;&gt;A new method to validate URLs in JavaScript (2023 edition)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stefan-marr.de&#x2F;2023&#x2F;11&#x2F;python-global-interpreter-lock&quot;&gt;The Changing “Guarantees” Given by Python&#x27;s Global Interpreter Lock&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=XZ3w_jec1v8&quot;&gt;&quot;The Economics of Programming Languages&quot; by Evan Czaplicki (Strange Loop 2023)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tout-va-bien-ou-pas&quot;&gt;Tout va bien (ou pas)&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.laquadrature.net&#x2F;2023&#x2F;11&#x2F;27&#x2F;notation-des-allocataires-lindecence-des-pratiques-de-la-caf-desormais-indeniable&#x2F;&quot;&gt;Notation des allocataires : l’indécence des pratiques de la CAF désormais indéniable&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;webdesign&quot;&gt;Webdesign&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;randoma11y.com&#x2F;&quot;&gt;Randoma11y&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bradfrost.com&#x2F;blog&#x2F;post&#x2F;the-design-system-ecosystem&quot;&gt;The Design System Ecosystem&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;base-de-donnees&quot;&gt;Base de données&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.timescale.com&#x2F;blog&#x2F;building-columnar-compression-in-a-row-oriented-database&quot;&gt;Building Columnar Compression for Large PostgreSQL Databases &lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.epsio.io&#x2F;blog&#x2F;epsios-diff-in-the-streaming-landscape&quot;&gt;Epsio&#x27;s Diff in the Streaming Landscape&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.pypi.org&#x2F;posts&#x2F;2023-11-14-1-pypi-completes-first-security-audit&quot;&gt;PyPI has completed its first security audit&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jdsalaro.com&#x2F;tutorial&#x2F;git-configuration-folder-dependent-conditional-includes&quot;&gt;Multiple Git Configurations and Identities with Folder-Dependent Includes for GitLab, GitHub et al&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;code.visualstudio.com&#x2F;blogs&#x2F;2023&#x2F;11&#x2F;13&#x2F;vscode-copilot-smarter&quot;&gt;Pursuit of &quot;wicked smartness&quot; in VS Code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.theverge.com&#x2F;2023&#x2F;11&#x2F;16&#x2F;23964509&#x2F;google-manifest-v3-rollout-ad-blockers&quot;&gt;Google’s revised Chrome extension standard loosens restrictions on ad blockers&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.loro.dev&#x2F;blog&#x2F;loro-now-open-source&quot;&gt;Loro: Reimagine State Management with CRDTs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;engineercodex.substack.com&#x2F;p&#x2F;how-to-burnout-a-software-engineer&quot;&gt;How to burnout a software engineer, in 3 easy steps&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;build-your-own.org&#x2F;blog&#x2F;20231108_1week&#x2F;?id=20231108&quot;&gt;Things Programmers Can Do in One Week&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;utcc.utoronto.ca&#x2F;~cks&#x2F;space&#x2F;blog&#x2F;unix&#x2F;ShellsAndCurrentDirectory&quot;&gt;Unix shells and the current directory&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arkadiuszchmura.com&#x2F;posts&#x2F;accessing-cheatsheets-from-the-command-line&#x2F;&quot;&gt;Accessing cheatsheets from the command line&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vadimkravcenko.com&#x2F;shorts&#x2F;aging-code&#x2F;&quot;&gt;Aging Code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.blog&#x2F;2023&#x2F;11&#x2F;27&#x2F;are-remote-workers-more-productive-that-s-the-wrong-question&quot;&gt;Are remote workers more productive? That’s the wrong question.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bytes.zone&#x2F;posts&#x2F;modeling-crdts-in-alloy-counters&#x2F;&quot;&gt;Modeling CRDTs in Alloy - counters&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ahelwer.ca&#x2F;post&#x2F;2023-11-01-tla-finite-monotonic&#x2F;&quot;&gt;Wrangling monotonic systems in TLA⁺&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hurl.dev&#x2F;&quot;&gt;Hurl, a command line tool that runs HTTP requests&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rien-a-voir-avec-la-choucroute&quot;&gt;Rien à voir avec la choucroute&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=oGHH5aJEgXQ&quot;&gt;Jonathan blow hates Visual Studio | Prime Reacts&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=F90svRjYHE4&quot;&gt;Test : PlayStation Portal, un bon lecteur à distance... et c&#x27;est tout. Une occasion manquée.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=MFECMLU0YDg&quot;&gt;Cyril ABITEBOUL - Ce qu’il n’a jamais dit ! (Ricciardo, Briatore, Redbull et Netflix…) &lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Sauvez l&#x27;environnement, arrêtez d&#x27;utiliser pipenv</title>
          <pubDate>Wed, 08 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/dev_null/sauvez-lenvironnement-arretez-dutiliser-pipenv/</link>
          <guid>/dev_null/sauvez-lenvironnement-arretez-dutiliser-pipenv/</guid>
          <description xml:base="/dev_null/sauvez-lenvironnement-arretez-dutiliser-pipenv/">&lt;p&gt;&lt;em&gt;Docker, pipenv et Flask sont dans une stack...&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Derrière ce qui s&#x27;apparente à une mauvaise blague se cache une petite session de debug, tout aussi peu drôle.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;l-idee&quot;&gt;L&#x27;idée&lt;&#x2F;h2&gt;
&lt;p&gt;Partant d&#x27;une stack relativement classique - à savoir un frontend, un backend et une base de donnée - le projet louable est de mettre tout ça dans des containers et
utiliser &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;compose&#x2F;&quot;&gt;Docker Compose&lt;&#x2F;a&gt; en guise d&#x27;orchestrateur pour faciliter le développement local du projet, réduisant ainsi le nombre d&#x27;injures dûes à l&#x27;outillage Python.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;le-projet&quot;&gt;Le projet&lt;&#x2F;h2&gt;
&lt;p&gt;⚠ Soyez raisonnables, n&#x27;utilisez pas ça en production hein.&lt;&#x2F;p&gt;
&lt;p&gt;Tout part d&#x27;un fichier &lt;code&gt;compose.yaml&lt;&#x2F;code&gt;, drastiquement simplifié pour ce billet :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ervices&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;atabase&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;mage&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ysql:8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;orts&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;306:3306&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;nvironment&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; M&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;YSQL_ALLOW_EMPTY_PASSWORD=true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; M&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;YSQL_DATABASE=my_database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;olumes&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;tmp&#x2F;db:&#x2F;var&#x2F;lib&#x2F;mysql&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ackend&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;uild&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;      c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ontext&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;my-backend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;      d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ockerfile&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; D&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ockerfile.dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;orts&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;000:5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;nvironment&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; S&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;QLALCHEMY_DATABASE_URI=mysql+pymysql:&#x2F;&#x2F;root@database&#x2F;my_database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;epends_on&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;atabase&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;olumes&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;my-backend:&#x2F;backend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Jusque là, rien de bien sorcier mise à part la verbosité naturelle d&#x27;un fichier YAML et les spécificités de Docker auxquelles on s&#x27;habitue plus ou moins rapidement (comme tout syndrôme de Stockholm informatique).&lt;&#x2F;p&gt;
&lt;p&gt;On a une base de donnée &lt;code&gt;my_database&lt;&#x2F;code&gt;, exposée sur le port 3306 de votre machine avec un volume monté pour garantir la persistence entre deux lancement de la stack.&lt;&#x2F;p&gt;
&lt;p&gt;Le backend, quant à lui, est exposé via le port 5000, avec le répertoire de la base de code monté pour que les changements fait puisse se propager dans le container.
On injecte quelques variables d&#x27;environment, notamment l&#x27;URI de la base de donnée qu&#x27;on utilisera.&lt;&#x2F;p&gt;
&lt;p&gt;Pour notre backend, une simple application &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;flask.palletsprojects.com&#x2F;en&#x2F;3.0.x&#x2F;&quot;&gt;Flask&lt;&#x2F;a&gt; dont l&#x27;originalité sera quelconque : exposer une route d&#x27;API, interagir avec la base de données et envoyer une réponse au client.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ls&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;la&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-backend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;.env&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Dockerfile.dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Pipfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Pipfile.lock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;app.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pour la gestion de dépendances, comme vous l&#x27;aurez deviné, on utilisera &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pipenv.pypa.io&#x2F;en&#x2F;latest&#x2F;&quot;&gt;pipenv&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pipenv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Flask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; SQLAlchemy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pymysql&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et pour notre application principale :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; in app.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; os&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; HTTPStatus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; flask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; Flask&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; sqlalchemy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; create_engine&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Flask&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;__name__&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;engine&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; create_engine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;os&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;environ&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;SQLALCHEMY_DATABASE_URI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;route&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;monitoring&#x2F;ping&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; ping&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;pong&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;route&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;monitoring&#x2F;ping-db&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;def&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; ping_db&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        with&lt;&#x2F;span&gt;&lt;span&gt; engine&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;connect&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span&gt; conn&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            conn&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;execute&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;text&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;SELECT 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;all&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;OK&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HTTPStatus&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;OK&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    except&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; Exception&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span&gt; e&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; str&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;e&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; HTTPStatus&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;INTERNAL_SERVER_ERROR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;On expose deux endpoints :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET &#x2F;monitoring&#x2F;ping&lt;&#x2F;code&gt; pour un healthcheck basique&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;GET &#x2F;monitoring&#x2F;ping-db&lt;&#x2F;code&gt; pour un healthcheck naïf de la connection entre le serveur et la base de donnée&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Le fichier &lt;code&gt;.env&lt;&#x2F;code&gt; contiendra toutes les variables d&#x27;environnement servant à la configuration de notre backend :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SQLALCHEMY_DATABASE_URI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;y&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;q&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;y&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;y&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;q&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;y&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En l&#x27;état, on peut déjà lancer l&#x27;application et tester notre API :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pipenv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; flask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Loading&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; environment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; variables...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Tip:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; There&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; are&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; or&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .flaskenv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; present.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Do&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;pip install python-dotenv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; them.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mode:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;WARNING:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; This&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; development&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; server.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Do&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; not&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; deployment.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; WSGI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; serv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;er&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; instead.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;127.0.0.1:5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Press&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; CTRL+C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; quit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et dans un autre terminal :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;localhost:5000&#x2F;monitoring&#x2F;ping&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;HTTP&#x2F;1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 200&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OK&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Connection:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; close&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Length:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Type:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; text&#x2F;html&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; charset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Date:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Wed,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Nov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2023&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:33:41&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; GMT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Server:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Werkzeug&#x2F;3.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Python&#x2F;3.11.6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;localhost:5000&#x2F;monitoring&#x2F;ping-db&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;HTTP&#x2F;1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 500&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; INTERNAL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; SERVER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ERROR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Connection:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; close&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Length:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 178&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Type:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; text&#x2F;html&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; charset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Date:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Wed,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Nov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2023&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:33:57&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; GMT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Server:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Werkzeug&#x2F;3.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Python&#x2F;3.11.6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pymysql.err.OperationalError&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;2003,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Can&amp;#39;t connect to MySQL server on &amp;#39;localhost&amp;#39; ([Errno 61] Connection refused)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Background&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; error&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; at:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https:&#x2F;&#x2F;sqlalche.me&#x2F;e&#x2F;20&#x2F;e3q8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;La deuxième erreur est normale, étant donné qu&#x27;on n&#x27;a pas encore mis en place la base de données correspondante.&lt;&#x2F;p&gt;
&lt;p&gt;Pour packager notre application dans un container, on utilisera le &lt;code&gt;Dockerfile.dev&lt;&#x2F;code&gt; suivant :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; python:3.11&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;WORKDIR&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;backend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ENV&lt;&#x2F;span&gt;&lt;span&gt; FLASK_APP=app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; pip install pipenv==2023.2.18&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; Pipfile Pipfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; Pipfile.lock Pipfile.lock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; pipenv sync --dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; app.py app.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; pipenv install --dev --skip-lock python-dotenv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;EXPOSE&lt;&#x2F;span&gt;&lt;span&gt; 5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;CMD&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;pipenv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;flask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;--host=0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En l&#x27;état, notre image docker contiendra tout ce qu&#x27;il faut pour pouvoir faire tourner notre serveur. Pour développer localement, on viendra monter notre codebase sur le répertoire &lt;code&gt;&#x2F;backend&lt;&#x2F;code&gt; du container.&lt;&#x2F;p&gt;
&lt;p&gt;Pour des raisons évidentes de flexibilité, les variables d&#x27;environnement doivent être prioritaires sur les variables définies dans notre fichier &lt;code&gt;.env&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;que-le-fun-commence&quot;&gt;Que le fun commence&lt;&#x2F;h2&gt;
&lt;p&gt;Qu&#x27;est-ce qui arrive quand on lance notre projet via docker compose ?&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; compose&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; up&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;+&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; Building 0.0s (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;0&#x2F;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Attaching&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; docker-flask-pipenv-backend-1,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:52:06+00:00&lt;&#x2F;span&gt;&lt;span&gt; [Note&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;Entrypoint&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: Entrypoint script &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; MySQ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;L&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Server&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 8.1.0-1.el8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; started.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:52:06+00:00&lt;&#x2F;span&gt;&lt;span&gt; [Note&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;Entrypoint&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: Switching to dedicated use&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:52:06+00:00&lt;&#x2F;span&gt;&lt;span&gt; [Note&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;Entrypoint&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: Entrypoint script &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; MySQ&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;L&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Server&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 8.1.0-1.el8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; started.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:52:07+00:00&lt;&#x2F;span&gt;&lt;span&gt; [Note&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;Entrypoint&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;: Initializing database file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:07.223732Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; [System&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-015017&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;Server&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; MySQL Server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Initialization&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; start.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:07.226360Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; [Warning&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-011068&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;Server&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; The syntax &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;--skip-host-cache&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;size&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; instead.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:07.226496Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; [System&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-013169&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;Server&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;usr&#x2F;sbin&#x2F;mys&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;qld&lt;&#x2F;span&gt;&lt;span&gt; (mysqld&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 8.1.0&lt;&#x2F;span&gt;&lt;span&gt;) initializing of server in progress as process 81&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:07.236347Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; [Warning&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-010159&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;Server&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; Setting lowe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;r_case_table_names&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; because&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; system&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;var&#x2F;lib&#x2F;mysql&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; case&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; insensitive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:07.251522Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt; [System&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-013576&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;InnoDB&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; InnoDB initia&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;lization&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; has&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; started.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Loading&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; environment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; variables...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Serving&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Flask&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mode:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; WARNING:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; This&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; development&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; server.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Do&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; not&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; depl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;oyment.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Use&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; WSGI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; server&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; instead.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; addresses&lt;&#x2F;span&gt;&lt;span&gt; (0.0.0.0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;127.0.0.1:5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;172.20.0.3:5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-backend-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;   |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Press&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; CTRL+C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; quit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:09.017942Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt; [System&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-013577&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;InnoDB&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; InnoDB initialization has ended.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;docker-flask-pipenv-database-1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 2023-11-08T09:52:10.809406Z&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span&gt; [Warning&lt;&#x2F;span&gt;&lt;span&gt;] &lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;MY-010453&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;Server&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; root@localhost is created with an empty password &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Please&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; consider&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; switching&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; off&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-initialize-insecure&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; option.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Vérifions que notre application tourne correctement :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;localhost:5000&#x2F;monitoring&#x2F;ping&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;HTTP&#x2F;1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 200&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OK&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Connection:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; close&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Length:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Type:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; text&#x2F;html&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; charset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Date:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Wed,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Nov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2023&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:52:41&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; GMT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Server:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Werkzeug&#x2F;3.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Python&#x2F;3.11.6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Et maintenant, vérifions que la connection à la base de donnée fonctionne elle aussi :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;localhost:5000&#x2F;monitoring&#x2F;ping-db&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;HTTP&#x2F;1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 500&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; INTERNAL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; SERVER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ERROR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Connection:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; close&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Length:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 191&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Type:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; text&#x2F;html&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; charset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Date:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Wed,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Nov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2023&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:54:38&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; GMT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Server:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Werkzeug&#x2F;3.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Python&#x2F;3.11.6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pymysql.err.OperationalError&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;2003,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Can&amp;#39;t connect to MySQL server on &amp;#39;localhost&amp;#39; ([Errno 99] Cannot assign requested address)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Background&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; this&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; error&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; at:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https:&#x2F;&#x2F;sqlalche.me&#x2F;e&#x2F;20&#x2F;e3q8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Maintenant essayons en ayant l&#x27;URI de la base de donnée en dur :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; In app.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;engine&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; create_engine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;mysql+pymysql:&#x2F;&#x2F;database:3306&#x2F;my_database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Evidemment, toute la chaîne fonctionne comme prévue :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;localhost:5000&#x2F;monitoring&#x2F;ping-db&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;HTTP&#x2F;1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 200&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OK&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Connection:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; close&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Length:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Content-Type:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; text&#x2F;html&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; charset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Date:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Wed,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 08&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Nov&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2023&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 10:04:34&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; GMT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Server:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Werkzeug&#x2F;3.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Python&#x2F;3.11.6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;OK&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Si on affiche la valeur récupérer de l&#x27;environnement par le serveur pour notre URI, via un bête &lt;code&gt;print&lt;&#x2F;code&gt; on obtient :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Database URI:  mysql+pymysql:&#x2F;&#x2F;localhost:3306&#x2F;my_database_local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Oui, la valeur qui est dans notre &lt;code&gt;.env&lt;&#x2F;code&gt; 🙃&lt;&#x2F;p&gt;
&lt;h2 id=&quot;la-solution&quot;&gt;La solution&lt;&#x2F;h2&gt;
&lt;p&gt;Tout est dans la &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pipenv.pypa.io&#x2F;en&#x2F;latest&#x2F;shell&#x2F;&quot;&gt;documentation&lt;&#x2F;a&gt;. Entre autre : les fonctionnements les plus contre intuitif.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a .env file is present in your project, $ pipenv shell and $ pipenv run will automatically load it, for you&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Pipenv a donc la facheuse tendance à prendre le contenu du fichier &lt;code&gt;.env&lt;&#x2F;code&gt; et écraser les variables d&#x27;environnement, ne laissant aucun moyen d&#x27;en surcharger certaines au besoin.&lt;&#x2F;p&gt;
&lt;p&gt;Deux pistes pour résoudre notre problème :&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ignorer le fichier &lt;code&gt;.env&lt;&#x2F;code&gt; lorsqu&#x27;on monte le répertoire du serveur dans notre image Docker (chose plus facile à dire qu&#x27;à faire)&lt;&#x2F;li&gt;
&lt;li&gt;faire en sorte que pipenv ne charge pas automatiquement ce fichier au démarrage&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;On partira sur la deuxième solution pour des raisons de simplicité.&lt;&#x2F;p&gt;
&lt;p&gt;La solution la plus directe est donc d&#x27;utiliser la variable d&#x27;environnement &lt;code&gt;PIPENV_DONT_LOAD_ENV&lt;&#x2F;code&gt; :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ackend&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;uild&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ontext&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;my-backend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ockerfile&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; D&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ockerfile.dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;orts&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;000:5000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;nvironment&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; P&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;IPENV_DONT_LOAD_ENV=1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; S&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;QLALCHEMY_DATABASE_URI=mysql+pymysql:&#x2F;&#x2F;root@database&#x2F;my_database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;epends_on&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;atabase&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;olumes&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;my-backend:&#x2F;backend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;Et voilà&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Et pas merci pour ces trois heures d&#x27;arrachage de cheveux.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;dev_null&#x2F;sauvez-lenvironnement-arretez-dutiliser-pipenv&#x2F;bacry.gif&quot; alt=&quot;Jean-Pierre Bacry&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pot-pourri — Octobre 2023</title>
          <pubDate>Sat, 21 Oct 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>/links/2023-10/</link>
          <guid>/links/2023-10/</guid>
          <description xml:base="/links/2023-10/">&lt;h2 id=&quot;misc&quot;&gt;Misc&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.miguelgrinberg.com&#x2F;post&#x2F;we-have-to-talk-about-flask&quot;&gt;We have to talk about Flask&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ntietz.com&#x2F;blog&#x2F;write-more-useless-software&#x2F;&quot;&gt;Write more useless software&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=04RaxJya0E8&quot;&gt;Le DevOps en 2023 ?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.numerama.com&#x2F;cyberguerre&#x2F;1539910-dashlane-rend-sa-version-gratuite-infernale-a-utiliser.html&quot;&gt;Dashlane rend sa version gratuite infernale à utiliser&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sindresorhus.com&#x2F;blog&#x2F;goodbye-nodejs-buffer&quot;&gt;Goodbye, Node.js buffer&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;daverupert.com&#x2F;2023&#x2F;07&#x2F;why-not-webcomponents&quot;&gt;If Web Components are so great, why am I not using them?&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.luu.io&#x2F;posts&#x2F;code-review&quot;&gt;On reviewing code: Some practices I’ve found useful&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.specfy.io&#x2F;blog&#x2F;7-git-like-versioning-in-postgres&quot;&gt;Versioning data in Postgres? Testing a git like approach&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;austinhenley.com&#x2F;blog&#x2F;morechallengingprojects.html&quot;&gt;More challenging projects every programmer should try&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.shuttle.rs&#x2F;blog&#x2F;2023&#x2F;10&#x2F;25&#x2F;htmx-with-rust&quot;&gt;htmx, Rust &amp;amp; Shuttle: A New Rapid Prototyping Stack&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;antonz.org&#x2F;sqlite-3-44&quot;&gt;SQLite 3.44: Interactive release notes&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.reuters.com&#x2F;markets&#x2F;deals&#x2F;wework-plans-file-bankruptcy-early-next-week-wsj-2023-10-31&quot;&gt;WeWork plans to file for bankruptcy as early as next week, source says&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;borretti.me&#x2F;article&#x2F;why-checked-exceptions-failed&quot;&gt;Why Checked Exceptions Failed&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;muhammadraza.me&#x2F;2023&#x2F;shell-functions&quot;&gt;My Useful Shell Functions&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;badsoftwareadvice.substack.com&#x2F;p&#x2F;how-to-run-a-demoralizing-and-ineffective&quot;&gt;How to run a demoralizing and ineffective technical interview&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rien-a-voir-avec-la-choucroute&quot;&gt;Rien à voir avec la choucroute&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=0zky4p5HBYE&quot;&gt;Bon appétit! James Acaster serves up pure genius!&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
