<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Laïla Atrmouh</title>
        <link>/fr/posts/</link>
        <description>Recent content in Posts on Laïla Atrmouh</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>fr</language>
        <copyright>&lt;a href=&#34;https://creativecommons.org/licenses/by-nc/4.0/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CC BY-NC 4.0&lt;/a&gt;</copyright>
        <lastBuildDate>Mon, 27 Jul 2026 15:21:00 +0000</lastBuildDate>
        <atom:link href="/fr/posts/index.xml" rel="self" type="application/rss+xml" />
        
        <item>
            <title>Migrer une application React vers TypeScript avec un agent IA</title>
            <link>/fr/posts/2026/07/migrer-une-application-react-vers-typescript-avec-un-agent-ia/</link>
            <pubDate>Mon, 27 Jul 2026 15:21:00 +0000</pubDate>
            
            <guid>/fr/posts/2026/07/migrer-une-application-react-vers-typescript-avec-un-agent-ia/</guid>
            <description>&lt;p&gt;Il y a quelques années, j&amp;rsquo;ai commencé un projet pour un praticien en acupuncture qui souhaitait pouvoir suivre ses patient(e)s sur une application hébergée sur son serveur et garder le contrôle de ses données.&lt;/p&gt;
&lt;p&gt;Sur l&amp;rsquo;application, différents cas d&amp;rsquo;usage existent. Un praticien peut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;enregistrer une nouvelle personne qui vient le consulter ainsi que sa séance&lt;/li&gt;
&lt;li&gt;accéder à l&amp;rsquo;historique des séances pour une personne&lt;/li&gt;
&lt;li&gt;saisir ses dépenses pour son cabinet&lt;/li&gt;
&lt;li&gt;suivre ses revenus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On l&amp;rsquo;a ouvert à d&amp;rsquo;autres praticien·ne·s : c&amp;rsquo;est devenu un vrai produit utilisé au quotidien par un petit nombre de personnes ! J&amp;rsquo;y ai accumulé de la dette technique, et un de mes gros sujets de 2025 était &lt;strong&gt;de migrer le projet vers TypeScript&lt;/strong&gt;.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Il y a quelques années, j&rsquo;ai commencé un projet pour un praticien en acupuncture qui souhaitait pouvoir suivre ses patient(e)s sur une application hébergée sur son serveur et garder le contrôle de ses données.</p>
<p>Sur l&rsquo;application, différents cas d&rsquo;usage existent. Un praticien peut :</p>
<ul>
<li>enregistrer une nouvelle personne qui vient le consulter ainsi que sa séance</li>
<li>accéder à l&rsquo;historique des séances pour une personne</li>
<li>saisir ses dépenses pour son cabinet</li>
<li>suivre ses revenus</li>
</ul>
<p>On l&rsquo;a ouvert à d&rsquo;autres praticien·ne·s : c&rsquo;est devenu un vrai produit utilisé au quotidien par un petit nombre de personnes ! J&rsquo;y ai accumulé de la dette technique, et un de mes gros sujets de 2025 était <strong>de migrer le projet vers TypeScript</strong>.</p>
<p>Cette migration est finie et en prod depuis quelques mois ! Je prends donc le temps de faire le bilan <del>calmement</del> sur comment j&rsquo;ai réussi à mener cette migration et sur l&rsquo;évolution de mon usage de l&rsquo;IA.</p>
<h2 id="contexte">Contexte</h2>
<p>L&rsquo;organisation de mon projet a facilité sa maintenance : tests unitaires en place, architecture Atomic Design (surtout des molécules, des organisms et des pages, mes atoms étant les composants de Chakra).</p>
<p>J&rsquo;ai choisi de migrer progressivement mon projet, ayant initié cette migration à un moment où c&rsquo;était un peu le rush sur d&rsquo;autres projets professionnels 😅</p>
<p>Une configuration dans le <code>tsconfig.json</code> permet à des fichiers JavaScript et TypeScript de cohabiter dans le même projet : <code>allowJs: true</code>. Ça m&rsquo;a permis de déprioriser parfois cette migration au profit d&rsquo;une correction de bug / demande de feature d&rsquo;une personne utilisatrice.</p>
<h2 id="démarche">Démarche</h2>
<p>J&rsquo;ai commencé par les plus petits composants - sans IA d&rsquo;abord pour valider ma démarche. J&rsquo;exploitais parfois les types natifs React pour les handlers DOM par exemple.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">handleChange</span>(
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">event</span>: <span style="color:#66d9ef">React.ChangeEvent</span>&lt;<span style="color:#f92672">HTMLInputElement</span>&gt;,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">prop</span>: <span style="color:#66d9ef">keyof</span> <span style="color:#a6e22e">Expense</span>,
</span></span><span style="display:flex;"><span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">let</span> { <span style="color:#a6e22e">value</span> } <span style="color:#f92672">=</span> <span style="color:#a6e22e">event</span>.<span style="color:#a6e22e">target</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">prop</span> <span style="color:#f92672">===</span> <span style="color:#e6db74">&#34;amount&#34;</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">value</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">formatAmountMoney</span>(<span style="color:#a6e22e">value</span>);
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">setExpense</span>({ ...<span style="color:#a6e22e">expense</span>, [<span style="color:#a6e22e">prop</span>]<span style="color:#f92672">:</span> <span style="color:#a6e22e">value</span> });
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p><em>Exemple sur cette fonction qui traite un formulaire permettant l&rsquo;ajout d&rsquo;une dépense financière.</em></p>
<p>Petite subtilité : le pattern <code>{ ...expense, [prop]: value }</code> ne compile en mode strict que parce que toutes les propriétés de <code>Expense</code> sont des <code>string</code> — le montant est stocké sous forme de chaîne formatée, pas de <code>number</code>.</p>
<p>J&rsquo;ai hésité à mettre en place <a href="https://react-hook-form.com/">react-hook-form</a> sur ce projet mais je n&rsquo;avais pas envie de me disperser sur trop de sujets.</p>
<blockquote>
<p>Si tu as des retours d&rsquo;expérience sur react-hook-form, n&rsquo;hésite pas à m&rsquo;en faire part dans les commentaires !</p>
</blockquote>
<p>Une fois que j&rsquo;ai réussi à migrer quelques petits composants, j&rsquo;ai commencé à utiliser un agent Cursor pour itérer - tout en relisant ce qu&rsquo;il faisait. J&rsquo;avais besoin de d&rsquo;abord mettre les mains dans le cambouis pour savoir quoi demander dans mon prompt ^^'</p>
<h2 id="utilisation-dagents">Utilisation d&rsquo;agents</h2>
<p>J&rsquo;utilise Cursor comme IDE. Il a une fenêtre dédiée à la gestion d&rsquo;agents. J&rsquo;ouvrais un agent, voici le prompt que je lui donnais initialement - avec un exemple sur un composant qui affiche le détail d&rsquo;une séance d&rsquo;acupuncture.</p>
<blockquote>
<p>Migre ce composant SessionLine.jsx vers <code>.tsx</code>. Je veux un typage strict des props (type dédié, pas de <code>any</code>), typage des retours de hooks, et des handlers d&rsquo;événements avec les types React natifs (<code>React.ChangeEvent&lt;HTMLInputElement&gt;</code> etc.).
Crée un test unitaire associé à ce composant couvrant les scénarios suivants :</p>
<ol>
<li>La sauvegarde d&rsquo;une séance</li>
<li>L&rsquo;affichage de la dernière séance</li>
<li>L&rsquo;affichage d&rsquo;une séance</li>
</ol>
<p>Explique chaque choix de type non trivial.</p>
</blockquote>
<p>J&rsquo;ai remarqué que l&rsquo;agent créait parfois des types en double : j&rsquo;ai donc ajouté dans mes instructions de ne créer un type que si c&rsquo;était nécessaire et qu&rsquo;il ne trouvait pas un type exploitable dans le dossier <code>types</code> (où je place tous mes types pour l&rsquo;instant).</p>
<p>Tous mes types sont isolés dans un même dossier. C&rsquo;est là l&rsquo;intérêt des fichiers comme <code>AGENTS.md</code> (ou <code>Claude.md</code>)- cette documentation liée aux agents spécifie de privilégier des types existants lorsque je les mets sur une tâche. On évite ainsi de le répéter à chaque prompt.</p>
<p>Je l&rsquo;exécutais d&rsquo;abord en mode &ldquo;Plan&rdquo; pour analyser ce qu&rsquo;il allait faire puis le lançais en mode Agent et je faisais ensuite une review de son code.</p>
<p>L&rsquo;interface de Cursor simplifie la relecture via l&rsquo;IDE, on peut aussi y installer des skills et accéder à différents modèles (Composer, Grok, GPT5.6, Fable, Codex &hellip;).</p>
<p>Je n&rsquo;ai pas exploité de skills particuliers dans le cadre de cette migration.</p>
<h3 id="les-tests-unitaires-à-lère-des-agents-ia">Les tests unitaires à l&rsquo;ère des agents IA</h3>
<p>Le projet était initialement très peu testé - en utilisant des agents, j&rsquo;ai compris que j&rsquo;allais devoir très vite en mettre en place.</p>
<p>Les tests sont encore plus primordiaux quand on commence à utiliser un agent IA pour coder : <strong>l&rsquo;agent a besoin d&rsquo;exécuter une commande pour vérifier la validité de son travail</strong>, c&rsquo;est ce qui va lui permettre de détecter une potentielle erreur qu&rsquo;il commet et la corriger en conséquence.</p>
<p>C&rsquo;est une des choses qui m&rsquo;enthousiasme le plus avec l&rsquo;ère de l&rsquo;IA : un argument de plus pour l&rsquo;ajout de tests automatisés dans une codebase !</p>
<h3 id="filets-de-sécurité">Filets de sécurité</h3>
<p>Toujours pour donner un filet de sécurité à l&rsquo;agent IA, j&rsquo;ai mis en place <a href="https://github.com/typicode/husky">des hooks de precommit</a> afin de permettre l&rsquo;exécution des tests unitaires et end-to-end (faits avec Cypress) avant chaque commit.</p>
<p>J&rsquo;avais mis ces tests Cypress en place mais sans les exécuter dans un pipeline - la question de l&rsquo;automatisation étant encore hasardeuse car la partie back du projet est sur un autre repo.</p>
<p>J&rsquo;ai inclus le lancement des tests Cypress dans mon hook de precommit, mais ça risque de devenir très lent dans le temps. C&rsquo;est quelque chose que je vais enlever une fois que j&rsquo;aurai fusionné le back de mon projet avec mon front dans un monorepo.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#e6db74">&#34;scripts&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;start&#34;</span>: <span style="color:#e6db74">&#34;vite&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;build&#34;</span>: <span style="color:#e6db74">&#34;vite build&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;serve&#34;</span>: <span style="color:#e6db74">&#34;vite preview&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;test&#34;</span>: <span style="color:#e6db74">&#34;vitest run&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;typecheck&#34;</span>: <span style="color:#e6db74">&#34;tsc --noEmit&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;cy:open&#34;</span>: <span style="color:#e6db74">&#34;cypress open&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;cy:run&#34;</span>: <span style="color:#e6db74">&#34;cypress run&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;format&#34;</span>: <span style="color:#e6db74">&#34;prettier --write ./src&#34;</span>
</span></span><span style="display:flex;"><span>}<span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;pre-commit&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> [
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;format&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;typecheck&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;test&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;cy:run&#34;</span>
</span></span><span style="display:flex;"><span>]<span style="color:#960050;background-color:#1e0010">,</span>
</span></span></code></pre></div><p><em>Extrait de mon package.json - Si simple, mais si précieux pour les agents</em></p>
<p>À noter : c&rsquo;est bien <code>vitest run</code> qu&rsquo;il faut dans un hook (par défaut, <code>vitest</code> se lance en mode watch et ne rend jamais la main). Et attention au script <code>format</code> : <code>prettier --write</code> reformate les fichiers sur le disque mais ne les re-stage pas — sans un <code>git add</code> derrière (ou un outil comme <a href="https://github.com/lint-staged/lint-staged">lint-staged</a>), le commit part avec la version non formatée.</p>
<p>Basculer sur un monorepo fait partie de ma longue todo pour ce projet 😅</p>
<h2 id="renforcement-de-la-validité-des-données">Renforcement de la validité des données</h2>
<p>TypeScript permet une validation à la compilation mais pas à l&rsquo;exécution réelle. Or, quand on communique avec un système externe comme une API &hellip; Tout est imprévisible, le format des données peut très bien changer.</p>
<p>Je ne m&rsquo;étais pas trop préoccupée du sujet, gérant moi-même l&rsquo;API exploitée par le front, mais j&rsquo;avais envie de me pencher sur le sujet pour améliorer la qualité de mon front.</p>
<p>J&rsquo;ai installé zod, chose que j&rsquo;ai longtemps procrastinée. L&rsquo;utilisation de schémas Zod me permet de vérifier la validité des réponses d&rsquo;un système externe lors du runtime. Et pas juste l&rsquo;existence d&rsquo;une propriété dans un JSON mais aussi sa bonne structure !</p>
<p>Plus j&rsquo;utilise TypeScript, moins je m&rsquo;imagine travailler dans un projet sans ! Il encourage vraiment à la rigueur dans son code, c&rsquo;est vraiment appréciable.</p>
<h2 id="mise-en-place-dadr">Mise en place d&rsquo;ADR</h2>
<p>Ce projet a vraiment commencé en 2022 avec l&rsquo;intention de monter en compétences sur React.</p>
<p>Aujourd&rsquo;hui, il est utilisé au quotidien par plusieurs personnes : sa stabilité est nécessaire. Si je n&rsquo;ai pas spécialement envie de monétiser ce projet, j&rsquo;ai quand même envie qu&rsquo;il reste utilisable et exploitable par ces praticien·ne·s en acupuncture sans que ça me prenne trop de temps.</p>
<p>Je me cherche encore sur la structure de mon ADR. Voici l&rsquo;exemple de mon ADR sur le choix de l&rsquo;architecture Atomic Design :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span># ADR : Choix de l&#39;architecture des composants et de la bibliothèque CSS
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> **Date** : 2022-07-24
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">-</span> **Contexte** : Le projet Acupio démarre sur un temps très restreint. On a besoin d&#39;une bibliothèque de composants CSS nous permettant de faire un design minimaliste mais utilisable.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Décision
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>Il a été décidé d&#39;adopter une architecture &#34;Atomic Design&#34; (organismes, molécules) pour faciliter la maintenabilité du projet dans le futur.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(...)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Conséquences
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span><span style="font-style:italic">_(Section complétée a posteriori, en 2025)_</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Cette décision a permis de faciliter la migration vers la bibliothèque Chakra v3 et a facilité la migration vers TypeScript. On a pu visualiser facilement les composants &#34;feuilles&#34; (les plus petits enfants) à migrer vers TypeScript avant de s&#39;attaquer à des composants plus gros.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Il a été envisagé de se séparer de Chakra lors de la v3 qui a introduit un nombre de changements énormes. Cette migration a cependant été facilitée par l&#39;utilisation d&#39;agents IA pour la réécriture du code.
</span></span></code></pre></div><p>J&rsquo;essaie d&rsquo;y déposer vraiment tous mes souvenirs, mes hésitations mais je me questionne sur le format et le détail d&rsquo;information à consigner dans ces ADR &hellip;</p>
<p>Bref, à voir comment ces documents vivent dans le temps ! Je pense que ça peut devenir une véritable mémoire du projet.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Même si cette migration est finalisée, j&rsquo;ai quand même des petits ajustements post mise en prod - avec par exemple l&rsquo;utilisation du type React natif <code>PropsWithChildren</code>, je suis complètement passée à côté et j&rsquo;ai dû le recréer &hellip;</p>
<p>C&rsquo;est déjà une étape très positive de ne plus avoir de code JavaScript sur mon projet.</p>
<p>TypeScript encourage à la rigueur et l&rsquo;utilisation d&rsquo;agents IA me force à redoubler de vigilance sur la présence des tests.</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 8 - Opérateur PHP, TypeScript et autres découvertes</title>
            <link>/fr/posts/2026/04/til-8-op%C3%A9rateur-php-typescript-et-autres-d%C3%A9couvertes/</link>
            <pubDate>Wed, 29 Apr 2026 15:21:00 +0000</pubDate>
            
            <guid>/fr/posts/2026/04/til-8-op%C3%A9rateur-php-typescript-et-autres-d%C3%A9couvertes/</guid>
            <description>&lt;p&gt;Voici quelques découvertes du mois que j&amp;rsquo;ai pris le temps de compiler dans un article !&lt;/p&gt;
&lt;h2 id=&#34;php&#34;&gt;PHP&lt;/h2&gt;
&lt;h3 id=&#34;match&#34;&gt;match&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;match&lt;/code&gt;, un opérateur qui n&amp;rsquo;existe que depuis PHP 8.1 et que je n&amp;rsquo;avais encore jamais utilisé. Il sert à évaluer une valeur et à retourner directement un résultat, comme un &lt;code&gt;switch&lt;/code&gt; mais en plus concis.&lt;/p&gt;
&lt;p&gt;Avant, avec un &lt;code&gt;switch&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;switch&lt;/span&gt; ($invoice&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getPaymentMode&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PaymentMode&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CB&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $payment_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Carte bancaire&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PaymentMode&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;CHEQUE&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $payment_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Chèque&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PaymentMode&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ESPECES&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $payment_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Espèces&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PaymentMode&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;VIREMENT&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $payment_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Virement&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PaymentMode&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LYDIA&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        $payment_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Lydia&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Après, avec &lt;code&gt;match&lt;/code&gt; :&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Voici quelques découvertes du mois que j&rsquo;ai pris le temps de compiler dans un article !</p>
<h2 id="php">PHP</h2>
<h3 id="match">match</h3>
<p><code>match</code>, un opérateur qui n&rsquo;existe que depuis PHP 8.1 et que je n&rsquo;avais encore jamais utilisé. Il sert à évaluer une valeur et à retourner directement un résultat, comme un <code>switch</code> mais en plus concis.</p>
<p>Avant, avec un <code>switch</code> :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">switch</span> ($invoice<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getPaymentMode</span>()) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">CB</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        $payment_mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Carte bancaire&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">CHEQUE</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        $payment_mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Chèque&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">ESPECES</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        $payment_mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Espèces&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">VIREMENT</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        $payment_mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Virement&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">case</span> <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">LYDIA</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>        $payment_mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Lydia&#34;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Après, avec <code>match</code> :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$payment_mode <span style="color:#f92672">=</span> <span style="color:#a6e22e">match</span> (<span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">tryFrom</span>($invoice<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getPaymentMode</span>())) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">CB</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;Carte bancaire&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">CHEQUE</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;Chèque&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">ESPECES</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;Espèces&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">LYDIA</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;Lydia&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">PaymentMode</span><span style="color:#f92672">::</span><span style="color:#a6e22e">VIREMENT</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;Virement&#34;</span>,
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><p>Je trouve ça beaucoup plus lisible, surtout quand on veut juste faire une correspondance valeur -&gt; label.</p>
<h2 id="typescript">TypeScript</h2>
<p>La différence entre <code>as</code> et <code>satisfies</code>, découverte au travers d&rsquo;un post LinkedIn.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ts" data-lang="ts"><span style="display:flex;"><span><span style="color:#66d9ef">type</span> <span style="color:#a6e22e">Colors</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;red&#34;</span> <span style="color:#f92672">|</span> <span style="color:#e6db74">&#34;green&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">favoriteColors</span> <span style="color:#f92672">=</span> { <span style="color:#a6e22e">red</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;yes&#34;</span>, <span style="color:#a6e22e">green</span>: <span style="color:#66d9ef">false</span>, <span style="color:#a6e22e">platypus</span>: <span style="color:#66d9ef">false</span> } <span style="color:#66d9ef">as</span> <span style="color:#a6e22e">Record</span><span style="color:#f92672">&lt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">Colors</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">unknown</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&gt;</span>;
</span></span></code></pre></div><p>Ici, on force le typage avec <code>as</code> sans que le compilateur TypeScript vérifie vraiment la cohérence de l&rsquo;objet.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ts" data-lang="ts"><span style="display:flex;"><span><span style="color:#66d9ef">type</span> <span style="color:#a6e22e">Colors</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;red&#34;</span> <span style="color:#f92672">|</span> <span style="color:#e6db74">&#34;green&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">favoriteColors</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">red</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;yes&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">green</span>: <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">platypus</span>: <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>} <span style="color:#a6e22e">satisfies</span> <span style="color:#a6e22e">Record</span>&lt;<span style="color:#f92672">Colors</span><span style="color:#960050;background-color:#1e0010">,</span> <span style="color:#a6e22e">unknown</span>&gt;;
</span></span></code></pre></div><p>Avec <code>satisfies</code>, le compilateur TypeScript peut lever une erreur.</p>
<p>J&rsquo;ai aussi découvert le blog de Christian Ekrem, et surtout ces deux articles :</p>
<ul>
<li><a href="https://cekrem.github.io/posts/why-typescript-wont-save-you/">Why TypeScript won&rsquo;t save you</a></li>
<li><a href="https://cekrem.github.io/posts/parse-dont-validate-typescript/">Parse, don&rsquo;t validate TypeScript</a></li>
</ul>
<h3 id="why-typescript-wont-save-you---ce-que-jen-retiens">Why TypeScript won&rsquo;t save you - Ce que j&rsquo;en retiens</h3>
<ul>
<li>TypeScript peut donner l&rsquo;illusion d&rsquo;une codebase plus sécurisée alors qu&rsquo;il garantit surtout que le code est cohérent avec les types créés.</li>
<li>Il existe des moyens de contourner TypeScript (<code>as</code>, <code>any</code>, <code>ts-ignore</code>) qui peuvent créer des failles potentielles.</li>
<li>Les systèmes externes avec lesquels on interagit (API, etc.) restent hors de portée de TypeScript.</li>
<li>TypeScript disparaît à l&rsquo;exécution.</li>
<li>D&rsquo;où l&rsquo;importance de la validation des données au runtime.</li>
</ul>
<p>Ce point m&rsquo;amène au second article.</p>
<h3 id="parse-dont-validate---ce-que-jen-retiens">Parse, don&rsquo;t validate - Ce que j&rsquo;en retiens</h3>
<ul>
<li>La différence entre parsing et validation.</li>
<li>On valide souvent une donnée en entrée d&rsquo;un contrôleur puis on passe à autre chose.</li>
<li>Plutôt que de faire transiter un <code>User</code> brut, il vaut mieux créer un type dédié (<code>ValidUser</code>) avec des propriétés métier explicites.</li>
<li>Le parsing permet à TypeScript de retenir le type valide de la donnée et de propager cette garantie dans le reste du programme.</li>
</ul>
<p>Citation clé de l&rsquo;article :</p>
<blockquote>
<p>If I had to compress King&rsquo;s idea into a sentence I&rsquo;d actually remember at 11pm before a release: <em>make the type system carry the proof, not your memory</em>. Every time you check something and don&rsquo;t encode the result in a type, you&rsquo;re asking your future self to remember. Future you will not remember.</p>
</blockquote>
<h3 id="activer-un-debugger-typescript-sur-cursor">Activer un debugger TypeScript sur Cursor</h3>
<p>J&rsquo;ai dû débugger quelques scripts Node. Plutôt que de jongler avec les <code>console.log</code>, j&rsquo;avais envie de tester un debugger plus efficace.</p>
<ul>
<li>Ajouter dans le fichier <code>tsconfig</code> l&rsquo;option <code>&quot;sourceMap&quot;: true</code></li>
<li>Lancer la commande avec l&rsquo;option <code>--inspect-brk</code>
<ul>
<li><code>node --inspect-brk ./node_modules/.bin/tsx leetcode/linkedlist/mergeLinkedList.ts</code></li>
</ul>
</li>
<li>Placer un point d&rsquo;arrêt</li>
<li>Menu <code>Run</code> &gt; <code>Start debugging</code></li>
</ul>
<h2 id="images-responsives">Images responsives</h2>
<p>C&rsquo;est la fin d&rsquo;une époque !</p>
<p>Historiquement, on gérait les images responsives avec les attributs <code>srcset</code> et <code>sizes</code> : pour chaque breakpoint, il fallait spécifier quelle image utiliser.</p>
<p>Désormais, grâce à l&rsquo;attribut <code>sizes=auto</code>, le navigateur va sélectionner la bonne image automatiquement à partir de celles définies dans l&rsquo;attribut <code>srcset</code> !</p>
<p>Les images responsives ne disparaissent pas mais seront plus simplement maintenables. Cette valeur est encore expérimentale mais devrait être déployée d&rsquo;ici quelques mois.</p>
<p><a href="https://piccalil.li/blog/the-end-of-responsive-images/">The End of Responsive Images par Mat Marquis</a></p>
<h2 id="le-sélecteur-css-du-jour-search-text">Le sélecteur CSS du jour ::search-text</h2>
<p>Ce sélecteur permet de personnaliser l&rsquo;occurence de texte trouvée à partir d&rsquo;une recherche sur la page du navigateur (le bon vieux &ldquo;Ctrl+F&rdquo; / &ldquo;Command+F&rdquo;).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-css" data-lang="css"><span style="display:flex;"><span>::<span style="color:#a6e22e">search-text</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">background-color</span>: <span style="color:#66d9ef">purple</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">color</span>: <span style="color:#66d9ef">white</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p><a href="https://caniuse.com/?search=%3A%3Asearch-text">Si tu lis cet article depuis une version récente de Chrome/Edge/Opéra</a>, tu peux le tester en action :)</p>
<p>C&rsquo;est disponible sur le mode expérimental (sur Chromium), il faudra surveiller le support sur tous les navigateurs.</p>
<h2 id="devtools">DevTools</h2>
<p>Il est possible de débugger avec l&rsquo;IA via les DevTools, désormais intégré dans Chrome !</p>
<p><img alt="DevTools - Debug with AI" src="/img/debug-ai.png"></p>
<p>On peut cibler un élément HTML et démarrer un chat pour débugger son comportement.</p>
<h2 id="google-sheets-api">Google Sheets API</h2>
<p>À partir d&rsquo;une URL d&rsquo;un Google Sheet public, il est possible d&rsquo;extraire du JSON ou du CSV en changeant l&rsquo;URL.</p>
<p>Pour du CSV :</p>
<p><code>.../pubhtml?gid=1877378934</code> -&gt; <code>.../pub?gid=ID_GOOGLE_SHEET&amp;single=true&amp;output=csv</code></p>
<p>Pour du JSON :</p>
<p><code>https://docs.google.com/spreadsheets/d/e/.../gviz/tq?tqx=out:json&amp;gid=ID_GOOGLE_SHEET</code></p>
<h2 id="productivité">Productivité</h2>
<p>Entre mes différentes activités, je me suis longtemps cherchée sur la gestion de mes tâches.</p>
<p>J&rsquo;ai découvert l&rsquo;application <a href="https://ticktick.com/?language=fr">TickTick</a> : une app installable sur Mac qui permet d&rsquo;avoir une vision de ses tâches sous la forme d&rsquo;une matrice d&rsquo;Eisenhower.</p>
<p><img alt="Matrice d&rsquo;Eisenhower - Ticktick" src="/img/ticktick-demo.png"></p>
<p>Cette représentation des tâches a été un GameChanger de mon côté. Il y a aussi un petit timer Pomodoro intégré.</p>
]]></content>
        </item>
        
        <item>
            <title>Retour d&#39;expérience - Montée de version vers Chakra v3</title>
            <link>/fr/posts/2026/03/retour-dexp%C3%A9rience-mont%C3%A9e-de-version-vers-chakra-v3/</link>
            <pubDate>Wed, 25 Mar 2026 10:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2026/03/retour-dexp%C3%A9rience-mont%C3%A9e-de-version-vers-chakra-v3/</guid>
            <description>La migration vers Chakra v3 était une montée de version assez costaud à mettre en place.</description>
            <content type="html"><![CDATA[<h2 id="contexte">Contexte</h2>
<p>Chakra est une bibliothèque de composants React, avec un focus particulier sur l&rsquo;accessibilité.</p>
<p>Je l&rsquo;utilise depuis 2022 pour <em>Acupio</em>, mon side project de gestion de clientèle pour acupuncteurs dont je vous ai déjà parlé <a href="https://leiluspocus.netlify.app/fr/posts/2025/05/retour-dexp%C3%A9rience-migration-vers-vite-et-suppression-de-create-react-app/">ici</a>.</p>
<p>Toutes les personnes suivies par un praticien s&rsquo;affichaient sur une page, avec la possibilité de filtrer par nom/prénom. Toutes les personnes apparaissent sur la page quand aucun nom n&rsquo;est saisi dans la recherche.</p>
<p>Je viens de dépasser les 500 patient·e·s suivis pour un des praticiens sur l&rsquo;application &hellip; Le sujet commençait à devenir urgent ! J&rsquo;ai découvert un <a href="https://chakra-ui.com/docs/components/pagination">composant de pagination Chakra</a> très pratique pour gérer ça.</p>
<p>Problème : Il n&rsquo;était utilisable que sur la version 3 du framework! Il devenait donc grand temps que je m&rsquo;attaque à cette mise à jour.</p>
<h2 id="quintroduit-cette-mise-à-jour-vers-chakra-v3-">Qu&rsquo;introduit cette mise à jour vers Chakra v3 ?</h2>
<p><a href="https://www.chakra-ui.com/docs/get-started/migration#improvements">Le guide de migration disponible</a> est très exhaustif, on voit qu&rsquo;énormément de changements ont été introduits.</p>
<ul>
<li>Amélioration de la performance lors du render de composants React (grâce à une nouvelle gestion des styles)</li>
<li>Amélioration de l&rsquo;inférence de types sur TypeScript</li>
<li>Polymorphisme : Utilisation du pattern <code>asChild</code></li>
</ul>
<p>Je ne vais parler dans cet article que des changements qui ont été le plus difficiles à suivre pour moi sur mon projet : la mise en place du <em>Compound Pattern</em>.</p>
<h2 id="changements-de-paradigme---compound-pattern">Changements de paradigme - Compound Pattern</h2>
<p>Chakra v3 généralise l&rsquo;utilisation du <a href="https://www.patterns.dev/react/compound-pattern/">Compound Pattern</a> pour la plupart des composants m&rsquo;a forcé à revoir la structure de presque tous mes composants.</p>
<blockquote>
<p>Il existe souvent des composants fortement couplés dans une application. Par exemple, un composant <!-- raw HTML omitted --> utilisable forcément au sein d&rsquo;un composant <!-- raw HTML omitted --> : ce sont deux composants à part mais l&rsquo;un va de pair avec un autre. Ce Compound pattern permet de créer des composants séparés mais fortement couplés.</p>
</blockquote>
<p>J&rsquo;utilisais des composants comme les Drawer, les Modal, des tableaux qui ont tous été impactés par ce changement de paradigme : il a fallu les revoir.</p>
<p><img alt="Git Diff sur un tableau" src="/img/git-diff-table-chakra-v2-v3.png">
<em>Avant / après sur un tableau - Les Td deviennent des Table.Cell, les Tr deviennent des Table.Row</em></p>
<p>Face à cette petite montagne de refactoring, j&rsquo;ai eu envie d&rsquo;utiliser l&rsquo;IA pour m&rsquo;aider dans cette tâche un peu ingrate.  N&rsquo;était-ce pas une des cas d&rsquo;usages qu&rsquo;était censé faciliter l&rsquo;IA ?</p>
<p><img alt="Sweet summer child GIF" src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZXc3cnJ4NTRzaGhzOWp6N3k1NmYwbmY2aTM4dWR3Y2EwMHRpNjZ0ciZlcD12MV9naWZzX3NlYXJjaCZjdD1n/D2kFkQwMzFcVq/giphy.gif"></p>
<h2 id="utiliser-lia-pour-faire-du-refactoring">Utiliser l&rsquo;IA pour faire du refactoring</h2>
<p>Mon rapport à l&rsquo;IA est très&hellip; frileux.</p>
<p>En 2023, j&rsquo;ai utilisé ChatGPT comme beaucoup de personnes, je me suis renseignée sur comment ça fonctionnait mais sans aller plus loin dans l&rsquo;utilisation de l&rsquo;IA au quotidien.</p>
<h3 id="refactoring-with-ai-the-wrong-way--jongler-entre-ide-et-onglet-navigateur-claude">Refactoring with AI the wrong way : Jongler entre IDE et onglet navigateur Claude</h3>
<p>J&rsquo;ai d&rsquo;abord commencé en tentant de copier-coller un de mes templates dans une conversation Claude en demandant de migrer ce composant vers Chakra 3. Les suggestions de Claude ne compilaient pas, ce qui est assez logique puisqu&rsquo;il n&rsquo;avait pas accès à l&rsquo;intégralité de ma codebase.</p>
<p>J&rsquo;en ai discuté au sein du Slack de la communauté Ladies of Code Paris et une de nos membres (coucou Sara !) me disait qu&rsquo;il serait préférable de commencer par des composants plus petits qu&rsquo;une page entière.</p>
<p>Ayant une approche Atomic Design sur le projet, c&rsquo;était un conseil facilement applicable. Ça me permettait d&rsquo;être plus en contrôle sur les changements introduits. Cela fonctionnait un peu mieux mais jongler entre mon navigateur (avec Claude) et mon IDE était frustrant. J&rsquo;oubliais régulièrement de lui donner certains fichiers dont il avait besoin.</p>
<h3 id="utilisation-dagents-cursor-pour-faire-du-refactoring">Utilisation d&rsquo;agents Cursor pour faire du refactoring</h3>
<p>Les agents rendent ces allers-retours obsolètes : l&rsquo;agent met en place ce que l&rsquo;on ce qu&rsquo;on lui demande de faire via l&rsquo;interface de discussion intégré à l&rsquo;IDE, y compris sur le plan gratuit de Cursor.</p>
<p>J&rsquo;avais notamment de vues qui faisait un filtre par date (sur différentes pages de l&rsquo;application).</p>
<p><img alt="Composant Period Picker" src="/img/period-picker.png"></p>
<p>Plutôt que de dupliquer cette gestion de date, j&rsquo;ai décidé d&rsquo;en faire un composant réutilisable en utilisant mon agent Cursor en lui donnant ce prompt.</p>
<blockquote>
<p>J&rsquo;aimerais que tu sortes ce filtre par date dans un composant qui se nommerait PeriodPicker. Place le dans le dossier components &gt; organisms. Le composant PeriodPicker doit permettre de sélectionner une période donnée. Il doit être exploité dans les composants StatsScreen et UrssafDeclaration. Merci</p>
</blockquote>
<p>L&rsquo;avantage d&rsquo;un agent, c&rsquo;est de pouvoir review les fichiers, comme si c&rsquo;était une PR faite par un·e autre collègue. La précision dans le prompt est importante, y aller de manière atomique évite de se lancer dans des changements trop compliqués et durs à débugger par la suite.</p>
<h2 id="durée-dune-migration-de-chakra-2-à-chakra-3">Durée d&rsquo;une migration de Chakra 2 à Chakra 3</h2>
<p>Cette migration s&rsquo;est passée plus facilement que je ne le pensais. Je n&rsquo;y ai mis que quelques jours là où je pensais en voyant la montagne y passer plusieurs semaines. J&rsquo;hésitais même à changer de bibliothèque - quitte à y passer un temps aussi long.</p>
<p>Je n&rsquo;ai utilisé des agents IA que sur la fin : je pense que j&rsquo;aurais pu gagner du temps en les utilisant dès le début de ce projet (en commençant par les atoms du projet). Les agents IA sont très efficaces sur des tâches locales et bien définies que sur des refactorings globaux.</p>
<p>De nombreuses personnes dans la communauté ont arrêté d&rsquo;utiliser Chakra en raison de cette montée de version de ce que je vois sur <a href="https://www.reddit.com/r/reactjs/comments/1j2f1i0/is_chakra_ui_v3_still_relevant_migration_from/">Reddit</a>.</p>
<h2 id="bien-préparer-sa-migration-vers-chakra-3">Bien préparer sa migration vers Chakra 3</h2>
<p>La construction du projet en suivant les principes d&rsquo;Atomic Design m&rsquo;a encore une fois été très précieuse. J&rsquo;ai pu commencer par les plus petites molécules en allant ensuite vers les écrans plus grands.</p>
<p>Cette migration m&rsquo;aura pris au final quelques jours.</p>
<p>Si je devais conseiller une personne qui hésiterait à se lancer dans cette mise à jour</p>
<ul>
<li>Voir dans le guide de migration quels sont les composants supprimés qu&rsquo;il va potentiellement falloir migrer pour estimer la charge de travail</li>
<li>Faire ça à plusieurs si possible</li>
<li>Utiliser des agents pour faciliter le travail en commençant par de petits composants d&rsquo;abord puis en visant plus haut.</li>
</ul>
<p>Bonne chance :) Et au plaisir d&rsquo;avoir vos retours sur l&rsquo;expérience de refactoring avec des agents Cursor !</p>
]]></content>
        </item>
        
        <item>
            <title>Retour d&#39;expérience - Migration vers Vite et suppression de Create React App</title>
            <link>/fr/posts/2025/05/retour-dexp%C3%A9rience-migration-vers-vite-et-suppression-de-create-react-app/</link>
            <pubDate>Thu, 01 May 2025 10:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2025/05/retour-dexp%C3%A9rience-migration-vers-vite-et-suppression-de-create-react-app/</guid>
            <description>Create React App est devenu déprécié en février 2025. J&#39;avais crée mon application React il y a 3 ans grâce à cette dépendance. Aujourd&#39;hui, je te raconte comment j&#39;ai pu migrer vers Vite.</description>
            <content type="html"><![CDATA[<p>L&rsquo;annonce est tombée en février 2025 : <a href="https://react.dev/blog/2025/02/14/sunsetting-create-react-app">Create React App est dépréciée</a>.</p>
<p>Je ne m&rsquo;étais pas trop penchée sur le sujet jusqu&rsquo;à ce que la mise à jour de TypeScript soit rendue impossible par les packages <code>react-scripts</code> présents dans mon application qui n&rsquo;arrivaient plus à suivre.</p>
<p>Il est temps d&rsquo;enlever ce package déprécié de mon application !</p>
<h2 id="mais-à-quoi-sert-create-react-app-">Mais&hellip; À quoi sert Create React App ?</h2>
<p>La promesse de Create React App était de &ldquo;masquer&rdquo; tout le nécessaire à la création d&rsquo;une application React – compilation du JSX, linting – pour qu&rsquo;on puisse se concentrer sur l&rsquo;écriture du code uniquement.</p>
<p>C&rsquo;était magique : tu installes une bibliothèque, tu donnes le nom de ton projet en prompt et voilà : tu as une application qui démarre sur le port 3000 sans trop d&rsquo;efforts. Et sans vraiment comprendre aussi ce qui s&rsquo;était passé sous le capot&hellip;</p>
<p>Si Create React App permettait de démarrer une application React facilement, il manquait certains éléments essentiels à toute application : le routing, le code splitting, la récupération de données, entre autres.</p>
<p>Faute de mainteneurs actifs et de par les alternatives pérennes en place aujourd&rsquo;hui, il a été décidé de déprécier <code>create-react-app</code> et d&rsquo;encourager la communauté à migrer vers d&rsquo;autres outils.</p>
<p>L&rsquo;article suggère deux options : <strong>migrer vers un framework</strong> ou vers un <strong>outil de compilation</strong>.</p>
<p>J&rsquo;ai décidé de tester les deux options sur un side-project pour voir laquelle était la plus rapide à mettre en place, en me fixant un maximum d&rsquo;une journée par option.</p>
<h2 id="contexte-du-side-project">Contexte du side-project</h2>
<p>J&rsquo;en ai déjà parlé rapidement <a href="https://leiluspocus.netlify.app/fr/posts/2024/04/passer-un-projet-react-sur-typescript/">ici</a> mais sans entrer trop dans le détail de la stack technique !</p>
<p>Il s&rsquo;agit d&rsquo;une application que j&rsquo;ai faite pour un proche, praticien en médecine traditionnelle chinoise. Cette application lui permet de suivre ses patients, d’enregistrer les séances qu&rsquo;il fait avec eux, de suivre ses dépenses et d’avoir des statistiques de performance. Cette application existe depuis maintenant 3 ans et est utilisée quotidiennement.</p>
<p><strong>Stack technique</strong> :</p>
<ul>
<li>Front
<ul>
<li>React, Chakra</li>
<li>Gestion des routes : React Router Dom</li>
<li>Gestion de l&rsquo;état : TanStack Query</li>
</ul>
</li>
<li>Back
<ul>
<li>Symfony</li>
<li>BDD : MySQL</li>
</ul>
</li>
<li>Tests
<ul>
<li>PHPUnit côté back</li>
<li>Vitest côté front</li>
<li>Cypress pour les tests E2E</li>
</ul>
</li>
<li>Déploiement et CI/CD : GitHub Actions</li>
</ul>
<p>Maintenant que vous en savez plus sur le projet, voici comment se sont passées les explorations des deux options suggérées par l&rsquo;article.</p>
<h2 id="passer-par-un-build-tool-vite-parcel--migrer-de-create-react-app-cra-vers-vite">Passer par un build tool (Vite, Parcel&hellip;) : Migrer de Create React App (CRA) vers Vite</h2>
<p>Les étapes vont très&hellip; <em>vite</em> (<em>pun intended</em> 🥁 ).</p>
<ul>
<li>J&rsquo;ai renommé tous les fichiers <code>.ts</code> qui retournent un composant en <code>.tsx</code> (ou en <code>.jsx</code>, <a href="https://leiluspocus.netlify.app/fr/posts/2024/04/passer-un-projet-react-sur-typescript/">ma migration vers TypeScript</a> n&rsquo;est pas complètement terminée 🫣)</li>
<li>Il faut enlever toutes les références à <code>process.env</code> : <a href="https://vite.dev/guide/env-and-mode">Vite passe par <code>import.meta.env</code> pour la lecture des variables d&rsquo;environnement</a></li>
<li>Le numéro de port changeant de 3000 (CRA) vers 5173 pour Vite, il a fallu que j&rsquo;adapte mes tests pour qu&rsquo;ils pointent vers le nouveau port.</li>
<li>J&rsquo;ai adapté le fichier <code>package.json</code> pour que l&rsquo;environnement de développement et le déploiement se fassent avec <code>vite</code> plutôt que <code>react-scripts</code>.</li>
<li>J&rsquo;ai dû ajuster aussi mon fichier <code>tsconfig.json</code> pour qu&rsquo;il reconnaisse les types liés à Vite et éviter les erreurs de typage sur mes fichiers JSX.</li>
</ul>
<p>Et la migration était finie. Je plaisante à peine !</p>
<p><img alt="/img/vite-migration.png" src="/img/vite-migration.png"></p>
<p>La documentation fournie <a href="https://www.robinwieruch.de/vite-create-react-app/">dans cet article</a> est super exhaustive.</p>
<p>Même si le nombre de fichiers de ma PR est grand, j&rsquo;aboutis à un POC stable rapidement.</p>
<p>Ayant un peu de temps devant moi, j&rsquo;hésite quand même à migrer ce side-project vers Next.</p>
<p>Mon side-project utilise aujourd&rsquo;hui :</p>
<ul>
<li>Tanstack Query pour la gestion d&rsquo;état</li>
<li>React Router pour les routes</li>
<li>React Testing Library pour les tests</li>
</ul>
<p>Next a l&rsquo;avantage de gérer à minima les routes, ce qui aurait réduit le nombre de dépendances. De plus, la partie SSR est séduisante, je l&rsquo;aurais bien exploitée pour un éventuel blog ou des landing pages &hellip;</p>
<p>Je décide donc de me donner 1 jour supplémentaire pour défricher une éventuelle migration Next.</p>
<h2 id="migrer-vers-next---comment-remplacer-create-react-app-par-nextjs-">Migrer vers Next - Comment remplacer Create React App par Next.js ?</h2>
<p>Là aussi, j&rsquo;ai suivi <a href="https://nextjs.org/docs/app/guides/migrating/from-create-react-app">la documentation</a> de migration sans trop d&rsquo;encombres.</p>
<p>J&rsquo;ai réussi à avoir mon premier écran de login en place assez rapidement et à configurer Chakra, mais j&rsquo;ai vite réalisé que la suite allait demander bien plus de travail.</p>
<p>Pas plus complexe spécialement mais, une réécriture complète de l&rsquo;application allait être nécessaire.</p>
<p>J&rsquo;ai identifié les étapes suivantes sur la route :</p>
<ul>
<li>Revoir l&rsquo;ancien fichier <code>App.js</code> pour le migrer vers le layout principal de l&rsquo;application</li>
<li>Se débarrasser de React Router pour utiliser le système de routing intégré de Next
<ul>
<li>Donc retirer tous les <code>&lt;Link&gt;</code> ainsi que le fichier <code>router.js</code> pour utiliser uniquement la logique de Next</li>
</ul>
</li>
<li>Revoir le système d&rsquo;authentification
<ul>
<li>Appeler Symfony depuis les Server Actions de Next ?</li>
<li>Mais ai-je même encore besoin d&rsquo;un back-end en Symfony ? J&rsquo;aurais très bien pu mettre en place Prisma avec Next (<a href="https://github.com/prisma/nextjs-prisma-postgres-demo">https://github.com/prisma/nextjs-prisma-postgres-demo</a>) et interroger directement ma base de données depuis mon application Next.</li>
</ul>
</li>
</ul>
<p>L&rsquo;utilité de mon back-end Symfony était remise en question par les Server Actions de Next.</p>
<p>Des composants Next (SSR) auraient pu directement interroger une base de données avec un ORM comme Prisma.</p>
<p><strong>L&rsquo;architecture complète de mon projet était remise en question</strong>.</p>
<p>Mon back-end Symfony devenait inutile. Cependant, il y a un contributeur PHP sur le projet&hellip; qui est en plein apprentissage de cette techno. Migrer vers Next m&rsquo;aurait fait réécrire l&rsquo;entièreté de l&rsquo;application. C&rsquo;était faisable mais la valeur ajoutée était assez réduite et je ne souhaitais pas allouer autant de temps à refaire quelque chose de déjà fonctionnel.</p>
<p>J&rsquo;ai donc préféré rester sur l&rsquo;option 1 en utilisant Vite : j&rsquo;ai pu avoir un état fonctionnel de mon application très rapidement. Au bout de quelques heures, le setup était finalisé.</p>
<p>J&rsquo;ai créé un environnement de test rapidement sur Vercel, histoire de vérifier le bon fonctionnement du déploiement avant d&rsquo;envoyer la migration en production.</p>
<p>Et là, c&rsquo;est le drame.</p>
<h2 id="migration-create-react-app-cra--problèmes-et-solutions">Migration Create React App (CRA) : problèmes et solutions</h2>
<p>J&rsquo;ai trois tests front sur l&rsquo;application, j&rsquo;aurais pu ne pas les migrer&hellip; Mais même chose, c&rsquo;est au moment du merge que j&rsquo;ai réalisé que mes tests ne passaient plus 🤡</p>
<p>Cet article me fut d&rsquo;une grande utilité pour la mise en place de <a href="https://www.robinwieruch.de/vitest-react-testing-library/">vitest</a>.</p>
<p>Il me manquait l&rsquo;installation de la bibliothèque <a href="https://github.com/jsdom/jsdom">js-dom</a>, j&rsquo;ai installé Vitest qui a fonctionné presque <em>right away</em>.</p>
<p>J&rsquo;en ai profité pour déplacer mes tests dans un dossier dédié. Je réalise que j&rsquo;ai une tâche &ldquo;Lancer les tests en pre-commit&rdquo; que j&rsquo;ai procrastinée trop longtemps&hellip; et qui m&rsquo;aurait pourtant pu voir ce problème bien plus tôt dans le parcours 🤦🏽‍♀️</p>
<p>Faire ce déploiement m&rsquo;a permis de réaliser que mes variables d&rsquo;environnement étaient mal nommées (<code>REACT_APP_</code> comme l&rsquo;exigeait le préfixage du package create-react-app).</p>
<p>Je décide de rendre les noms de variable agnostiques côté GitHub Actions pour ne pas avoir à les renommer à nouveau si jamais un jour Vite devient déprécié&hellip;</p>
<h2 id="autre-étape--le-ménage">Autre étape : le ménage</h2>
<p><img alt="https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcmx1cnd1eWhscXdkYWJqN3VwamMxajFlNm1hOW1qanh1azdrb2kyYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fCUCbWXe9JONVsJSUd/giphy.gif" src="https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExcmx1cnd1eWhscXdkYWJqN3VwamMxajFlNm1hOW1qanh1azdrb2kyYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fCUCbWXe9JONVsJSUd/giphy.gif"></p>
<p>Autre étape à ne pas oublier : la suppression des fichiers générés automatiquement par <code>create-react-app</code> et devenus obsolètes !</p>
<pre tabindex="0"><code>        deleted:    src/reportWebVitals.js
        deleted:    src/service-worker.js
        deleted:    src/serviceWorkerRegistration.js
        deleted:    logo192.png
        deleted:    logo512.png
        deleted:    manifest.json
        deleted:    robots.txt
        deleted:    setupTests.js
</code></pre><p>J&rsquo;ai supprimé les références au serviceWorker dans mon <code>index</code>. Je ne me suis pas penchée sur comment CRA l&rsquo;utilisait.</p>
<p>A voir si je reprends son utilisation pour optimiser le cache de mon application mais je préfère l&rsquo;occulter pour l&rsquo;instant.</p>
<h2 id="le-bilan">Le bilan</h2>
<p>Pour mon side project, migrer de Create React App vers Vite a été rapide et fluide. Si tu cherches une alternative moderne à CRA, Vite est aujourd’hui l’option la plus simple à mettre en place de ce que j&rsquo;ai pu voir.</p>
<p>Quel soit l&rsquo;outil choisi, je suis très impressionnée par l&rsquo;effort de documentation fourni par le blog de Robin Wieruch et par la documentation de Next/React. Ces différents articles se lisent très facilement et fonctionnent presque sans encombres.</p>
<p>Migrer de Create React App vers Vite m&rsquo;a aussi permis de conscientiser les petits éléments manquants dans mon expérience de développement (comme les hooks de pre-commit).</p>
<p>Une migration peut être l&rsquo;occasion de ne pas uniquement se débarrasser d&rsquo;une dépendance dépréciée mais aussi d&rsquo;améliorer des points dans l&rsquo;expérience de développement &ldquo;en passant&rdquo;.</p>
<p>Accueillir un nouveau contributeur aide aussi à améliorer l&rsquo;expérience mais ça sera sûrement le sujet d&rsquo;un article à part entière !</p>
<p>Et toi ? <code>react-scripts</code> fait toujours partie de tes dépendances ? Tu t&rsquo;en sépares quand ? 👀</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 7 - Golang, astuces devtools et balise HTML insoupçonnée</title>
            <link>/fr/posts/2024/06/til-7-golang-astuces-devtools-et-balise-html-insoup%C3%A7onn%C3%A9e/</link>
            <pubDate>Thu, 06 Jun 2024 10:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2024/06/til-7-golang-astuces-devtools-et-balise-html-insoup%C3%A7onn%C3%A9e/</guid>
            <description>J&#39;ai un peu délaissé ce format de partage de veille technique! Je reviens avec du HTML, des ressources Golang et devtools</description>
            <content type="html"><![CDATA[<p>Photo de <a href="https://unsplash.com/fr/@geekgunda?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Chinmay B</a> sur <a href="https://unsplash.com/fr/photos/une-image-dun-personnage-de-dessin-anime-sur-un-mur-fd9mIBluHkA?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></p>
<p>Hello !</p>
<p>Un peu triste d&rsquo;avoir abandonné ce format d&rsquo;articles que j&rsquo;affectionne pourtant beaucoup, je me remotive ce mois-ci pour remettre le pied à l&rsquo;étrier !</p>
<p>L&rsquo;idée des TIL, c&rsquo;est de partager mes apprentissages et découvertes du mois écoulé. C&rsquo;est parti !</p>
<h2 id="html">HTML</h2>
<p>J&rsquo;ai découvert l&rsquo;existence <code>&lt;input type=&quot;month&quot; /&gt;</code> qui fournit un datepicker pour récupérer le mois/année. Attention cependant, il n&rsquo;est pas encore bien supporté par Firefox &hellip;</p>
<h2 id="node">Node</h2>
<p>J&rsquo;ai découvert <a href="https://github.com/SBoudrias/Inquirer.js">une chouette bibliothèque Node </a>pour gérer de l&rsquo;interaction avec l&rsquo;utilisateur sur une application accessible via ligne de commande. Elle permet de créer des menus interactifs assez satisfaisants visuellement et avec un minimum d&rsquo;efforts !</p>
<h2 id="golang">Golang</h2>
<p>J&rsquo;ai découvert sur le tard <a href="https://dev.to/aurelievache/learning-go-by-examples-introduction-448n">la série d&rsquo;Aurélie Vache d&rsquo;articles sur l&rsquo;apprentissage de Go</a> à travers des cas d&rsquo;usages très concrets.</p>
<p>Un groupe d&rsquo;apprenants et d&rsquo;apprenantes chez Ada m&rsquo;ont fait découvrir <a href="https://github.com/gin-gonic/gin">le framework web Gin</a>, écrit en Go.</p>
<h2 id="terminal">Terminal</h2>
<p>Il est possible d&rsquo;exécuter une commande en se faisant passer pour un autre user 👀
<code>sudo -u www-data bin/console c:c</code> par exemple (coucou les symfonoss)</p>
<p>Comme quoi, on ne cesse jamais d&rsquo;apprendre, même avec les commandes qu&rsquo;on utilise régulièrement.</p>
<h2 id="cloud">Cloud</h2>
<h3 id="hébergements">Hébergements</h3>
<p>J&rsquo;ai découvert <a href="https://cloud.appwrite.io/register">Appwrite</a>, qui permet de déployer facilement des projets PHP !
J&rsquo;ai enfin testé <a href="https://www.koyeb.com/">Koyeb</a> sur un projet perso, une autre solution de déploiement sur le nuage qui m&rsquo;a été recommandée par un apprenant Ada (coucou Jérémie 👋). Il y a même la possibilité de déployer des projets dockerisés !</p>
<h3 id="reconversion-devops">Reconversion Devops</h3>
<p>Suite à des questions récurrentes chez Ada Tech School sur les principes devops et les éventuels métiers existants, j&rsquo;ai demandé sur Twitter quelles étaient les bonnes ressources pour débuter et des idées de projets personnels.</p>
<p>Je suis très reconnaissante des personnes qui m&rsquo;ont répondu, je transmettrai ces ressources. <a href="https://x.com/leiluspocus/status/1797941363662860344">Vous pouvez voir les réponses par ici</a>.</p>
<p>Si vous n&rsquo;êtes plus sur ce réseau, voici les ressources qui m&rsquo;ont été recommandées :</p>
<ul>
<li>L&rsquo;excellent <a href="https://t.co/C1MpZoUI25">blog de Stéphane Robert</a> (et effectivement, quelle mine d&rsquo;or)</li>
<li>La chaîne Youtube des <a href="https://www.youtube.com/@MentorDevOps">Compagnons du Devops</a> et <a href="https://cloud.lydra.fr/s/z8AMZbqs6mxd5CH#mindmap">leur mindmap autour du devops</a></li>
<li><a href="https://roadmap.sh/devops">La roadmap Devops</a> (dense mais a le mérite de donner une vue sur les technos existantes)</li>
<li>La chaîne Youtube de <a href="https://www.youtube.com/@techworldwithnana?si=UvXBNbnA_IovoU_e">TechWorld with Nana</a> 🇺🇸</li>
<li>La chaîne <a href="https://www.youtube.com/@xavki">Youtube de Xavki</a> 🇫🇷</li>
<li>La chaîne Twitch <a href="https://www.twitch.tv/cuistops">Cuistops</a></li>
<li>Le blog <a href="https://une-tasse-de.cafe/">Une tasse de café</a></li>
<li><a href="https://t.co/ULcpcAh71o">Les bouquins O&rsquo;Reilly de Google</a></li>
<li><a href="https://t.co/2mdrkCC7Q0">Témoignage de la formation Devops de O&rsquo;Clock</a></li>
<li><a href="https://sadservers.com/">SadServers</a> (un équivalent de Leetcode pour ops!)</li>
<li>Le talk de Denis Germain sur <a href="https://blog.zwindler.fr/talks/2022-sre-sre-partout/index.html#34">le métier SRE</a></li>
<li>Le repository <a href="https://github.com/bregman-arie/devops-exercises">Devops-Exercises</a> pour se préparer à des entretiens techniques ops.</li>
</ul>
<p>Et enfin <a href="https://www.myjobglasses.com/">MyJobGlasses</a> pour entrer en contact avec des SRE/Devops en poste.</p>
<h2 id="chrome-devtools">Chrome Devtools</h2>
<p><a href="https://css-tricks.com/some-cross-browser-devtools-features-you-might-not-know/#comment-1807847">Prendre un screenshot d&rsquo;un bout de votre page web grâce à la console, c&rsquo;est désormais possible</a> ! Merci à la newsletter DoctoTechLife pour cette découverte !</p>
<p>Il suffit d&rsquo;inspecter l&rsquo;élément que l&rsquo;on souhaite capturer et cliquer sur &ldquo;Capture Node Screenshot&rdquo; pour obtenir sa capture d&rsquo;écran.</p>
<p><img alt="capture d&rsquo;écran d&rsquo;un noeud HTML via les devtools" src="/img/node-screenshot.png"></p>
<h2 id="hors-tech">Hors tech</h2>
<p>Parce qu&rsquo;il n&rsquo;y a pas que le code dans la vie, je partage quelques musiques et podcasts qui m&rsquo;ont touchée dernièremen.</p>
<h3 id="sons-du-moment">Sons du moment</h3>
<ul>
<li>Passion pop japonaise des années 80 avec Miki Matsubara et son très célèbre <a href="https://open.spotify.com/intl-fr/track/2BHj31ufdEqVK5CkYDp9mA?si=a6e29abf6838410a">Stay with me</a> !</li>
<li>Ces deux artistes (merci Ségolène !) qui me détendent bien : <a href="https://open.spotify.com/intl-fr/track/2aGnLGpb72GWRcAHRlM2BT?si=3366e41bb4bd4294">Eda Diaz</a> et <a href="https://open.spotify.com/intl-fr/track/738QCDbfGEpxVoYL0erJqR?si=33ce4e9923c349a5">Mazalda</a></li>
</ul>
<h3 id="podcast-du-moment">Podcast du moment</h3>
<ul>
<li>Le podcast <a href="https://open.spotify.com/show/7sDjj2XY0AYHynP7G3m8rA?si=9493133443c84f06">&ldquo;Attendre d&rsquo;attendre un enfant&rdquo;</a> où Sophie Riche raconte son parcours de PMA avec sa compagne. C&rsquo;est drôle, ça donne envie de frapper son poing contre un mur, de pleurer, de rire &hellip; et c&rsquo;est riche en enseignements sur l&rsquo;état des droits à la PMA en France.</li>
</ul>
<p>C&rsquo;est tout pour ce délicieux mois de mai ! Quels furent vos découvertes ?</p>
]]></content>
        </item>
        
        <item>
            <title>Passer un projet React sur Typescript</title>
            <link>/fr/posts/2024/04/passer-un-projet-react-sur-typescript/</link>
            <pubDate>Wed, 03 Apr 2024 10:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2024/04/passer-un-projet-react-sur-typescript/</guid>
            <description>J&amp;rsquo;ai un side-project en React actif depuis 2 ans. M&amp;rsquo;intéressant de plus en plus à Typescript,  j&amp;rsquo;ai décidé de migrer ce projet React vers Typescript plutôt que de le recommencer from scratch. La suite pourrait vous surprendre &amp;hellip; !</description>
            <content type="html"><![CDATA[<p><strong>Photo</strong> de <a href="https://unsplash.com/fr/@timothycuenat?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Timothy Cuenat</a> sur <a href="https://unsplash.com/fr/photos/un-gros-plan-dun-ecran-dordinateur-avec-de-nombreuses-lignes-de-code-dessus-NH0pmKaZeuk?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></p>
<p>J&rsquo;ai un side-projet en React qui fête ses 2 ans en ce joyeux 26 mars 2024 ! (<em>ça grandit si vite!</em>)</p>
<p>Je l&rsquo;avais démarré dans le but d&rsquo;appliquer les riches enseignements vus <a href="https://delicious-insights.com/fr/formations/react-pwa/">lors de la formation Progressive Web Apps en React</a> suivie chez Delicious Insights.</p>
<p>J&rsquo;ai eu envie de me lancer dans l&rsquo;apprentissage de TypeScript cette année et souhaitais l&rsquo;appliquer à ce projet.</p>
<p>Ce projet étant utilisé aujourd&rsquo;hui et ayant une certaine quantité de fonctionnalités, il était exclu de le refaire from scratch. Je me suis motivée en me disant que l&rsquo;exercice de migration serait plus riche qu&rsquo;une refonte.</p>
<p>Voici donc l&rsquo;histoire de comment j&rsquo;ai commencé à migrer un side-project React sur Typescript.</p>
<h2 id="typescript-">TypeScript ?</h2>
<p>Pour la faire courte, c&rsquo;est une couche qu&rsquo;on peut appliquer sur tout projet Javascript afin de renforcer le typage des variables et de faire de la vérification statique des types (c&rsquo;est-à-dire avant que le code soit exécuté par le client).</p>
<p>Cela peut permettre d&rsquo;anticiper des bugs et comportements inattendus non souhaités, dès le développement !</p>
<p>Il y a plein de comportements un peu tristes en Javascript (possibilité d&rsquo;accéder à une propriété qui n&rsquo;existe pas &hellip;) qui conduisent à des bugs, <a href="https://www.typescriptlang.org/fr/docs/handbook/typescript-from-scratch.html#bref-historique-de-javascript">leur documentation liste des exemples de cas problématiques</a>. Typescript prévient ce genre de comportements.</p>
<h2 id="la-démarche">La démarche</h2>
<ul>
<li>Installation de Typescript dans le projet <code>npm i typescript</code></li>
<li>Ajout du fichier de configuration Typescript <code>tsconfig.json</code></li>
<li>Création d&rsquo;un nouveau composant en Typescript pour se familiariser doucement avec la syntaxe</li>
<li>Reprise d&rsquo;un petit composant (login) existant dont l&rsquo;extension a été renommée en <code>.tsx</code></li>
<li>Collecte des problèmes &hellip; Correction des problèmes &hellip;</li>
<li>Configuration d&rsquo;Eslint pour Typescript (sinon ça passait pas)</li>
<li>Et on passe au composant suivant ! ⛏</li>
</ul>
<p>Le point fort de cette migration est que j&rsquo;ai pu envoyer en production un premier lot de composants sous Typescript qui continuaient à vivre leur vie avec d&rsquo;autres composants JS, pas encore ré-écrits.</p>
<p>Vous n&rsquo;êtes pas obligés de tout migrer d&rsquo;un coup, ce qui facilite grandement une démarche <em>itérative</em> !</p>
<h2 id="enseignements">Enseignements</h2>
<ul>
<li>Commencer du plus petit composant au plus gros !</li>
</ul>
<p>J&rsquo;ai commencé par typescriptiser (<em>est-ce un verbe?</em>) tous mes fichiers qui requêtaient des API par ex. pour ensuite aller vers les composants qui exploitaient les fichiers.</p>
<ul>
<li>Je me suis remerciée d&rsquo;avoir adopté une approche Atomic Design dans le projet</li>
</ul>
<p>J&rsquo;ai pu m&rsquo;attaquer aux atomes, puis aux molécules, aux organismes pour finir avec les pages.</p>
<ul>
<li>Tout ce qui retourne un composant doit être dans un fichier <code>tsx</code></li>
</ul>
<p>Y compris les contextes qui même s&rsquo;ils fournissent des méthodes, restent des composants &hellip;</p>
<h2 id="interrogations">Interrogations</h2>
<h3 id="quelle-est-la-différence-entre-type-et-interface-">Quelle est la différence entre type et interface ?</h3>
<p>Une interface reste ouverte à la différence d&rsquo;un type. De ma compréhension, ça s&rsquo;utilise plus quand on veut entrer dans une logique de composition. Les types peuvent utiliser les types primaires (booléen, number) et ne peuvent pas être modifiés après déclaration.</p>
<p>C&rsquo;est encore flou pour moi le &ldquo;quand utiliser l&rsquo;un ou l&rsquo;autre&rdquo;, je n&rsquo;ai pas encore eu de besoin où l&rsquo;un s&rsquo;appliquait mieux que l&rsquo;autre mais j&rsquo;ai préféré garder une consistence sur le projet. Je suis preneuse de vos retours sur le sujet :)</p>
<h2 id="pièges">Pièges</h2>
<h3 id="configuration-de-eslint">Configuration de Eslint</h3>
<p>J&rsquo;avais Eslint en place sur mon projet. J&rsquo;ai oublié d&rsquo;installer une dépendance <code>typescript-eslint</code>, j&rsquo;avais des erreurs liées à mes déclarations de type très obscures, je pensais que la syntaxe était incorrecte alors que le problème venait de Eslint qui n&rsquo;était simplement pas configuré pour comprendre du Typescript&hellip;</p>
<p>En réaction à chaud, j&rsquo;ai quand même beaucoup de mal avec la syntaxe Typescript mélangée aux concepts React comme le <code>useState</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span> <span style="color:#66d9ef">const</span> [<span style="color:#a6e22e">sessions</span>, <span style="color:#a6e22e">setSessions</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">useState</span><span style="color:#f92672">&lt;</span>Array<span style="color:#f92672">&lt;</span><span style="color:#a6e22e">Session</span><span style="color:#f92672">&gt;&gt;</span>([]);
</span></span></code></pre></div><p>Je trouve qu&rsquo;à la lecture, ce n&rsquo;est pas du tout &ldquo;intuitif&rdquo;&hellip; J&rsquo;imagine qu&rsquo;il faut se laisser le temps de s&rsquo;y habituer ! 😅</p>
<h2 id="appréciations">Appréciations</h2>
<p>Le code produit est plus lisible, on gagne en rigueur aussi sur les objets qu&rsquo;on manipule.</p>
<p>La démarche itérative qu&rsquo;on peut avoir ! Les fichiers <code>.ts</code>, <code>.tsx</code> et <code>.js</code> peuvent cohabiter dans le même projet, c&rsquo;est un travail de fond qui peut se faire au fur et à mesure qu&rsquo;un projet vit.</p>
<h2 id="ressources-utiles">Ressources utiles</h2>
<p>Je finis cet article sur cette liste de ressources qui m&rsquo;a été utile pour le premier lot envoyé en production !</p>
<ul>
<li><a href="https://www.nodeteam.onix-systems.com/blog/how-to-organize-typescript/">Comment organiser son projet et où mettre les types / interfaces ?</a></li>
<li><a href="https://fr.react.dev/learn/typescript#typescript-with-react-components">Migrer des contextes React sur Typescript</a></li>
<li><a href="https://www.sitepoint.com/how-to-migrate-a-react-app-to-typescript/">Tuto React Typescript</a></li>
<li><a href="https://hackernoon.com/how-to-migrate-a-react-project-from-javascript-to-typescript">Cet article</a> m&rsquo;a l&rsquo;air plus complet car il aborde également l&rsquo;angle des <code>Context</code></li>
<li><a href="https://grafikart.fr/tutoriels/typescript-type-vs-interface-1955">Un autre cours de Grafikart qui a l&rsquo;avantage d&rsquo;être en français</a></li>
</ul>
<p>Et vous ? Comment se sont passées vos migrations vers Typescript ? Des traumas à me partager ? 😅</p>
]]></content>
        </item>
        
        <item>
            <title>Automatiser la création d&#39;un nouveau fichier markdown</title>
            <link>/fr/posts/2024/02/automatiser-la-cr%C3%A9ation-dun-nouveau-fichier-markdown/</link>
            <pubDate>Fri, 23 Feb 2024 04:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2024/02/automatiser-la-cr%C3%A9ation-dun-nouveau-fichier-markdown/</guid>
            <description>J&amp;rsquo;adore automatiser les tâches répétitives un peu fastidieuses comme la création d&amp;rsquo;un nouvel article sur mon blog. Je ne connais pas la syntaxe par coeur, et n&amp;rsquo;ai pas vocation à la connaître grâce à Plop, un utilitaire permettant d&amp;rsquo;automatiser la création de fichiers via le terminal (en utilisant un prompt &amp;hellip; ou pas)</description>
            <content type="html"><![CDATA[<p><em>Photo de <a href="https://unsplash.com/fr/@neonbrand?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Kenny Eliason</a> sur <a href="https://unsplash.com/fr/photos/star-wars-bb-8-5afenxnLDjs?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></em></p>
<hr>
<p>J&rsquo;ai lu <a href="https://github.com/readme/guides/code-as-documentation">cet excellent article</a> via la newsletter de Doctolib, qui parle de comment documenter &ldquo;par le code&rdquo;.</p>
<p>L&rsquo;idée de cet article est d&rsquo;encourager à automatiser les tâches répétitives de créations de fichiers, plutôt que de documenter comment faire cette tâche.</p>
<p>Qui n&rsquo;a jamais crée un composant en copiant/collant le contenu d&rsquo;un autre fichier pour ensuite écrire son code ?</p>
<p>L&rsquo;objectif de l&rsquo;automatisation est non seulement <em>d&rsquo;éviter ce copier/coller</em> mais aussi de diffuser la connaissance sur les standards exigés par l&rsquo;équipe pour la création d&rsquo;un composant.</p>
<p>Pour tester ce concept, j&rsquo;ai décidé de l&rsquo;appliquer sur la création d&rsquo;articles sur mon blog.</p>
<p>La création d&rsquo;articles sur Hugo passe par la création d&rsquo;un fichier markdown. Ne retenant ✨ <em>jamais</em> ✨ la syntaxe précise, je copiais/collais systématiquement l&rsquo;en-tête d&rsquo;un article d&rsquo;avant.</p>
<p>L&rsquo;automatisation passe par la <a href="https://plopjs.com/">bibliothèque Plop</a>, qui permet de créer des fichiers automatiquement à partir d&rsquo;un template.</p>
<h2 id="installation-de-la-bibliothèque-plop">Installation de la bibliothèque Plop</h2>
<p>Comme toute bonne vieille dépendance, on peut l&rsquo;installer via <code>npm</code> (ou <code>yarn</code>, faites comme voulvoul, je ne suis pas sectaire!)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>npm i plop --save-dev
</span></span></code></pre></div><blockquote>
<p>💡 Je l&rsquo;installe en devDependencies avec l&rsquo;option <code>--save-dev</code> car je n&rsquo;en ai pas besoin en production !</p>
</blockquote>
<h2 id="création-du-prompt">Création du prompt</h2>
<p>La bibliothèque Plop repose sur une autre dépendance <a href="https://github.com/SBoudrias/Inquirer.js">Inquirer.js</a> qui permet de gérer des prompts de terminal (du simple input à la checkbox!)</p>
<p>Vous allez donc créer un fichier <code>plopfile.js</code> à la racine de votre projet.</p>
<p>Le fichier contiendra les instructions pour créer la commande d&rsquo;automatisation et la récupération des données saisies via le terminal.</p>
<p>Voici l&rsquo;exemple du fichier <code>plopfile.js</code> pour mon besoin de création d&rsquo;un article vide.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">export</span> <span style="color:#66d9ef">default</span> <span style="color:#66d9ef">function</span> (<span style="color:#a6e22e">plop</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">today</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Date()
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">date</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">`</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">today</span>.<span style="color:#a6e22e">getFullYear</span>()<span style="color:#e6db74">}</span><span style="color:#e6db74">-</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">today</span>.<span style="color:#a6e22e">getMonth</span>()<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span><span style="color:#e6db74">}</span><span style="color:#e6db74">-</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">today</span>.<span style="color:#a6e22e">getDate</span>()<span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">plop</span>.<span style="color:#a6e22e">setGenerator</span>(<span style="color:#e6db74">&#39;article&#39;</span>, {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">description</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Créer un nouvel article&#39;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">prompts</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>          {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;input&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;name&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">message</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Nom ?&#39;</span>
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>          {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;input&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;metadescription&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">message</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Méta-description ?&#39;</span>,
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>          {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;input&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;cover&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">message</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Cover ?&#39;</span>,
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>          {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;checkbox&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;language&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">message</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Langue ?&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">choices</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>              {<span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;fr&#39;</span>, <span style="color:#a6e22e">value</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;fr&#39;</span>},
</span></span><span style="display:flex;"><span>              {<span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;en&#39;</span>, <span style="color:#a6e22e">value</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;en&#39;</span>}
</span></span><span style="display:flex;"><span>            ]
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>          {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;input&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;slug&#39;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">message</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;Slug ?&#39;</span>,
</span></span><span style="display:flex;"><span>          }
</span></span><span style="display:flex;"><span>        ],
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">actions</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>            {
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;add&#39;</span>,
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">path</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`content/posts/</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">date</span><span style="color:#e6db74">}</span><span style="color:#e6db74">--{{slug}}.{{language}}.md`</span>,
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">templateFile</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;templates/plop-article.md&#39;</span>
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        ]
</span></span><span style="display:flex;"><span>	});
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><h2 id="création-du-fichier-template">Création du fichier template</h2>
<p>J&rsquo;ai choisi de mettre mon template dans un dossier dédié. Toutes les variables récupérées via le prompt seront exploitées par le template.</p>
<p>Mon fichier <code>plop-article.md</code> (mentionné dans mon <code>plopfile.js</code>) ressemble à ceci 👇</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span>title: {{ name }}
</span></span><span style="display:flex;"><span>slug: /{{ language }}/{{ slug }}/
</span></span><span style="display:flex;"><span>summary: &#34;{{ metadescription }}&#34;
</span></span><span style="display:flex;"><span>cover: &#34;img/{{cover}}&#34;
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><p>Les noms de variables réferrent aux variables mentionnées dans le prompt crée par le fichier <code>plopfile.js</code> !</p>
<h2 id="déclaration-du-script">Déclaration du script</h2>
<p>Je définis une commande pour pouvoir la lancer depuis le terminal dans mon fichier <code>package.json</code>.</p>
<p>Dans le fichier <code>package.json</code> à la racine du projet, j&rsquo;ajoute la définition d&rsquo;un script <code>new_article</code> en ajoutant ceci</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#e6db74">&#34;scripts&#34;</span> <span style="color:#960050;background-color:#1e0010">:</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;new_article&#34;</span>: <span style="color:#e6db74">&#34;plop&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>A la fin, mon fichier <code>package.json</code> ressemble à ceci 👇</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;scripts&#34;</span> : {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;new_article&#34;</span>: <span style="color:#e6db74">&#34;plop&#34;</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;devDependencies&#34;</span>: {
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#34;plop&#34;</span>: <span style="color:#e6db74">&#34;^4.0.1&#34;</span>
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;module&#34;</span> <span style="color:#75715e">// Pour pouvoir utiliser la syntaxe d&#39;export en Node dans mon fichier plopfile.js !
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}
</span></span></code></pre></div><h2 id="démonstration">Démonstration</h2>
<p>Désormais, à chaque fois que j&rsquo;écrirai un nouvel article, je n&rsquo;aurai qu&rsquo;à lancer la commande <code>npm run new_article</code> (oula, c&rsquo;est long à taper, je sens que je vais déjà raccourcir l&rsquo;alias 😅 &hellip;) ! Et je n&rsquo;aurai plus qu&rsquo;à écrire ensuite :) Ca donne ceci 👇</p>
<p><img alt="démonstration de la commande et ce qu&rsquo;elle affiche" src="/img/demo-plop.gif"></p>
<p>Dans l&rsquo;exemple de cet article, j&rsquo;ai automatisé la création d&rsquo;un article mais rien ne vous empêche de faire la même chose pour un autre &ldquo;standard&rdquo; de votre codebase :)</p>
<p>Que pensez vous de l&rsquo;automatisation ? Automate all the way ou avec parcimonie ?</p>
]]></content>
        </item>
        
        <item>
            <title>L&#39;intégration continue et le déploiement continu: c&#39;est quoi ?</title>
            <link>/fr/posts/2024/01/lint%C3%A9gration-continue-et-le-d%C3%A9ploiement-continu-cest-quoi/</link>
            <pubDate>Wed, 24 Jan 2024 10:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2024/01/lint%C3%A9gration-continue-et-le-d%C3%A9ploiement-continu-cest-quoi/</guid>
            <description>Les concepts de CI/CI peuvent être assez flou quand on commence son apprentissage du développement. Dans cet article, j&amp;rsquo;explique les concepts d&amp;rsquo;intégration et de déploiement continu (CI/CD) et comment on les utilise quand on crée une application web !</description>
            <content type="html"><![CDATA[<p><em>Photo de <a href="https://unsplash.com/fr/@angelyviviana55?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Angely Acevedo</a> sur <a href="https://unsplash.com/fr/photos/le-vert-et-le-jaune-portaient-T6BsBZdGwbg?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a></em></p>
<hr>
<p>L&rsquo;intégration continue <em>(Continuous Integration - CI en anglais)</em> et le déploiement continu (<em>Continuous Deployment - CD en anglais</em>) sont deux concepts au coeur de beaucoup de projets logiciels.</p>
<h2 id="cest-quoi-lintégration-continue-">C&rsquo;est quoi l&rsquo;intégration continue ?</h2>
<p>L&rsquo;intégration continue est un ensemble de pratiques dédiées à vérifier que les nouvelles fonctionnalités qu&rsquo;on intègre à une application ne &ldquo;cassent rien&rdquo;.</p>
<p>Prenons un petit exemple !</p>
<p><img alt="schéma présentant l&rsquo;intégration continue" src="/img/cest-quoi-l-integration-continue.png"></p>
<p>Bob et Alice sont tous les deux dev sur un site e-commerce.</p>
<p>Bob est sur une fonctionnalité de &ldquo;Wishlist&rdquo; tandis qu&rsquo;Alice implémente un paiement par Paypal.</p>
<p>Ces deux fonctionnalités seront intégrées au projet du site e-commerce. Même si on ajoute un nouveau mode de paiement &ldquo;Paypal&rdquo;, on veut pouvoir continuer à payer par carte bleue si on le souhaite sans supprimer cette fonctionnalité.</p>
<p>C&rsquo;est la raison d&rsquo;être de l&rsquo;intégration continue.</p>
<p>Cela se manifeste via l&rsquo;utilisation d&rsquo;un outil de versionning (comme Git), l&rsquo;exécution de tests unitaires, de tests fonctionnels et de tests e2e selon ce qui est mis en place dans le projet.</p>
<p>Ce fonctionnement par branches varie selon les équipes (vous entendez parler de <a href="https://www.atlassian.com/fr/git/tutorials/comparing-workflows/gitflow-workflow">git flow</a> ou de <a href="https://trunkbaseddevelopment.com/">trunk based development</a>), mais ce qui est sûr c&rsquo;est qu&rsquo;on ne commit jamais tous en même temps sur la branche principale <code>main</code> 😅</p>
<h2 id="cest-quoi-le-déploiement-continu-">C&rsquo;est quoi le déploiement continu ?</h2>
<p>Le déploiement continu est une stratégie où tout nouveau code envoyé sur un outil de versionning (comme Git) est automatiquement envoyé sur un environnement.</p>
<p>Cette stratégie se met en place via des outils et des scripts qui s&rsquo;exécutent automatiquement à chaque fois qu&rsquo;un commit est envoyé en production.</p>
<p>Selon l&rsquo;organisation de l&rsquo;équipe, les stratégies de déploiement peuvent différer.</p>
<p>Une stratégie classique est d&rsquo;avoir la branche <code>main</code> déployée systématiquement sur l&rsquo;environnement de production (l&rsquo;environnement accessible au public qui utilise l&rsquo;application!)</p>
<p><img alt="schéma présentant le déploiement continu" src="/img/cest-quoi-le-deploiement-continu.png"></p>
<h2 id="exemples-doutils">Exemples d&rsquo;outils</h2>
<p>Il existe une multitude d&rsquo;outils de déploiement continu sur le marché. Je ne vais parler dans cet article que de deux solutions que j&rsquo;ai particulièrement utilisé récemment, CircleCI et Github Actions.</p>
<p>Les deux solutions permettent d&rsquo;exécuter des scripts (permettant de déployer / exécuter des tests&hellip;) lorsque de nouveaux commits sont faits sur une ou plusieurs branches Git (en se connectant à un repository distant Github, Bitbucket, Gitlab&hellip;).</p>
<p>Les règles de déclenchement de ces jobs sont paramètrables sur le fichier de workflow (qui définit et décrit en détail les jobs à exécuter).</p>
<h3 id="circleci">CircleCI</h3>
<blockquote>
<p>👵🏼 J&rsquo;ai travaillé avec CircleCI entre 2018 et 2022. Mes retours sur cette solution se basent essentiellement sur cette expérience, il est possible que la solution ait évolué depuis !</p>
</blockquote>
<p>J&rsquo;ai apprécié travailler avec CircleCI. Il y a les Orbs, des applications réutilisables sur un workflow Circle.</p>
<p>Une marketplace d&rsquo;orbs existe avec plein de fonctionnalités (ex: mettre en place <a href="https://circleci.com/developer/orbs/orb/circleci/slack">des notifications Slack</a> à l&rsquo;issue d&rsquo;un job de déploiement)</p>
<p>Je me souviens que le dashboard qui permettait de visualiser les différents déploiements en cours était complètement bugué. L&rsquo;équipe a été assez réactive et a rollback à peine une heure après l&rsquo;incident.</p>
<p>Je garde quand même souvenir de nombreux incidents sur CircleCI, ce qui n&rsquo;indique pas une stabilité de la plateforme (du moins, à l&rsquo;époque!)</p>
<h3 id="github-actions">Github Actions</h3>
<p>Sorti plus récemment sur le marché, on retrouve sur Github Actions les mêmes possibilités que sur Circle CI (ajout de secrets, variables d&rsquo;environnement).</p>
<p>Le dashboard qui permet de visualiser l&rsquo;exécution des tests ou des déploiements par les jobs est peut-être moins user-friendly par rapport à CircleCI (<em>mais c&rsquo;est très subjectif comme avis</em> 😅)</p>
<p>Un concept similaire aux orbs de CircleCI existe aussi sur Github Actions: les actions sont disponibles sur une marketplace et vous évitent de recoder des fonctionnalités pour des besoins assez classiques (notifications Slack, installation d&rsquo;outils de code coverage&hellip;)</p>
<p>Ce que j&rsquo;apprécie particulièrement dans Github Actions, c&rsquo;est le fait d&rsquo;avoir tout au même endroit: mon code, mes jobs de déploiement, mes tests&hellip;</p>
<h2 id="bilan">Bilan</h2>
<p>Ayant déjà bossé à l&rsquo;époque dans une équipe qui avait à peine Git en place, je peux vous assurer que c&rsquo;est un état d&rsquo;esprit qui permet d&rsquo;avoir un produit logiciel plus sain et d&rsquo;être plus en confiance sur le code qu&rsquo;on produit.</p>
<p><img alt="schéma présentant l&rsquo;intégration continue et le déploiement continu" src="/img/integration-continue-deploiement-continu.png"></p>
<p>Pour aller plus loin sur le sujet, voici quelques articles que je recommande et qui m&rsquo;ont été d&rsquo;ailleurs utiles dans la rédaction de cet article (<em>le blog d&rsquo;Atlassian est très cool et en français !</em>).</p>
<ul>
<li><a href="https://www.atlassian.com/fr/continuous-delivery/continuous-integration/ci-friendly-git-repos">Cinq conseils pour vos dépôts Git permettant l&rsquo;intégration continue</a></li>
<li><a href="https://www.atlassian.com/fr/continuous-delivery/continuous-integration">Qu&rsquo;est-ce que l&rsquo;intégration continue ?</a></li>
</ul>
<p>Les schémas de cet article ont été réalisés avec <a href="https://excalidraw.com/">Excalidraw</a> !</p>
]]></content>
        </item>
        
        <item>
            <title>Ajouter du HTML dans un article Hugo avec un shortcode</title>
            <link>/fr/posts/2024/01/ajouter-du-html-dans-un-article-hugo-avec-un-shortcode/</link>
            <pubDate>Fri, 19 Jan 2024 11:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2024/01/ajouter-du-html-dans-un-article-hugo-avec-un-shortcode/</guid>
            <description>&lt;p&gt;Mes blogs ont connu multiples plateformes: Wordpress, Jekyll, Gatsby&amp;hellip; C&amp;rsquo;est plus amusant de changer de stack que de se lancer dans la rédaction régulière d&amp;rsquo;articles 🤡&lt;/p&gt;
&lt;p&gt;Ca fait plusieurs années maintenant que je suis fidèle au générateur de sites statiques &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;, et n&amp;rsquo;ai aucune envie de migrer vers autre chose.&lt;/p&gt;
&lt;p&gt;Je l&amp;rsquo;utilise pour mon blog technique (vous êtes dessus!) et &lt;a href=&#34;https://esquisses.netlify.app/&#34;&gt;mon blog de critiques culturelles&lt;/a&gt; (où je raconte mon humble avis sur des films/lectures/expos&amp;hellip;).&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Mes blogs ont connu multiples plateformes: Wordpress, Jekyll, Gatsby&hellip; C&rsquo;est plus amusant de changer de stack que de se lancer dans la rédaction régulière d&rsquo;articles 🤡</p>
<p>Ca fait plusieurs années maintenant que je suis fidèle au générateur de sites statiques <a href="https://gohugo.io/">Hugo</a>, et n&rsquo;ai aucune envie de migrer vers autre chose.</p>
<p>Je l&rsquo;utilise pour mon blog technique (vous êtes dessus!) et <a href="https://esquisses.netlify.app/">mon blog de critiques culturelles</a> (où je raconte mon humble avis sur des films/lectures/expos&hellip;).</p>
<p>Ecrire du markdown est bien plus rapide que de se connecter à un backend d&rsquo;administration à la Wordpress. Je peux écrire facilement depuis mon téléphone tout comme mon ordi.</p>
<p>Cependant on peut avoir besoin d&rsquo;écrire un contenu en HTML dans un article (post embeddé, &hellip;). Si vous avez besoin d&rsquo;ajouter du HTML dans un post en markdown avec Hugo, vous pouvez utiliser la fonctionnalité des <a href="https://gohugo.io/content-management/shortcodes/">shortcodes Hugo</a> !</p>
<h2 id="cest-quoi-un-shortcode-">C&rsquo;est quoi un shortcode ?</h2>
<p>Un shortcode est une sorte de balise que vous allez pouvoir ajouter sur vos articles pour pouvoir ajouter un certain formatage.</p>
<p>Ce concept existe également sur Wordpress !</p>
<h2 id="créer-un-shortcode-avec-hugo">Créer un shortcode avec Hugo</h2>
<p>On va créer un fichier <code>rawhtml.html</code> dans le dossier <code>layouts/shortcodes</code> qui devrait être à la racine de votre projet.</p>
<blockquote>
<p>💡 A noter, le nom de votre fichier match avec le nom de votre shortcode! (Si vous appelez le fichier patate.html, le shortcode sera appelable avec <code>{{ &lt;patate&gt; }}</code> 🥔)</p>
</blockquote>
<p>Une fois le fichier <code>rawhtml.html</code> crée, mettez le contenu suivant 👇</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>{{.Inner}}
</span></span></code></pre></div><h2 id="comment-ajouter-du-html-dans-un-article-hugo-">Comment ajouter du HTML dans un article Hugo ?</h2>
<p>Dans le corps de cet article, j&rsquo;ai ajouté le code suivant 👇</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>{{ &lt; <span style="color:#f92672">rawhtml</span> &gt;}}
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">style</span>&gt;
</span></span><span style="display:flex;"><span>    .<span style="color:#a6e22e">text</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">padding</span>: <span style="color:#ae81ff">2</span><span style="color:#66d9ef">px</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">text-align</span>: <span style="color:#66d9ef">center</span>;
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">background</span>: <span style="color:#66d9ef">yellow</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">style</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;<span style="color:#f92672">p</span> <span style="color:#a6e22e">class</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;text&#34;</span>&gt;
</span></span><span style="display:flex;"><span>    &lt;<span style="color:#f92672">mark</span>&gt;Je suis du HTML custom&lt;/<span style="color:#f92672">mark</span>&gt;
</span></span><span style="display:flex;"><span>  &lt;/<span style="color:#f92672">p</span>&gt;
</span></span><span style="display:flex;"><span>{{ &lt; /<span style="color:#f92672">rawhtml</span> &gt;}}
</span></span></code></pre></div><blockquote>
<p>💡 Il faut enlever les espaces autour de <code>rawhtml</code> pour que ça soit bien interprété !</p>
</blockquote>
<p>Ce qui devrait donner ceci 👇</p>

  <style>
    .text {
      padding: 2px;
      text-align: center;
      background: yellow;
    }
  </style>
  <p class="text">
    <mark>Je suis du HTML custom</mark>
  </p>


<p>Happy blogging ! 🫶🏽</p>
]]></content>
        </item>
        
        <item>
            <title>Conseils pour se remettre à la lecture</title>
            <link>/fr/posts/2023/11/conseils-pour-se-remettre-%C3%A0-la-lecture/</link>
            <pubDate>Thu, 23 Nov 2023 11:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2023/11/conseils-pour-se-remettre-%C3%A0-la-lecture/</guid>
            <description>&lt;p&gt;Enfant, je &lt;em&gt;dévorais&lt;/em&gt; les livres. J&amp;rsquo;étais une grande fan de Stephen King, j&amp;rsquo;ai dévoré religieusement la saga Harry Potter, j&amp;rsquo;avais adoré aussi &lt;em&gt;L&amp;rsquo;Alchimiste&lt;/em&gt; de Paulo Coelho. J&amp;rsquo;avais même initié un site listant toutes mes &amp;ldquo;critiques littéraires&amp;rdquo; &lt;a href=&#34;https://esquisses.netlify.app/&#34;&gt;que j&amp;rsquo;ai réssucité des années après&lt;/a&gt; (malheureusement sans les critiques de l&amp;rsquo;époque!)&lt;/p&gt;
&lt;p&gt;Le rythme des études et d&amp;rsquo;autres choses m&amp;rsquo;ont éloigné de la lecture. Je ne trouvais plus de temps mais n&amp;rsquo;avais surtout pas la motivation de lire. J&amp;rsquo;avais fait aussi une overdose de livres de développement personnel qui m&amp;rsquo;avait dégoûtée de la lecture en général.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Enfant, je <em>dévorais</em> les livres. J&rsquo;étais une grande fan de Stephen King, j&rsquo;ai dévoré religieusement la saga Harry Potter, j&rsquo;avais adoré aussi <em>L&rsquo;Alchimiste</em> de Paulo Coelho. J&rsquo;avais même initié un site listant toutes mes &ldquo;critiques littéraires&rdquo; <a href="https://esquisses.netlify.app/">que j&rsquo;ai réssucité des années après</a> (malheureusement sans les critiques de l&rsquo;époque!)</p>
<p>Le rythme des études et d&rsquo;autres choses m&rsquo;ont éloigné de la lecture. Je ne trouvais plus de temps mais n&rsquo;avais surtout pas la motivation de lire. J&rsquo;avais fait aussi une overdose de livres de développement personnel qui m&rsquo;avait dégoûtée de la lecture en général.</p>
<p>En 2023, je me suis fixée pour objectif de lire au moins un livre par mois. J&rsquo;ai la joie d&rsquo;atteindre mon 16è livre lu en même pas dix mois !</p>
<p><img alt="gif de dinde qui agite les ailes" src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExNTQ1YWJ4a3lzdTAzZ3RybHNwaXg5eW82dnhzd2x5aDVwd3Nma2NiOSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/X7WrPCpMpqVEtUZm7o/giphy.gif"></p>
<p><em>Disclaimer: C&rsquo;est OK de ne pas aimer lire ! Cet article n&rsquo;a pas pour but de te vanter les mérites de la lecture, c&rsquo;est surtout un guide pour les personnes qui se sont éloignées de ce plaisir et qui aimeraient y revenir !</em></p>
<p>Voici quelques astuces que je pourrais donner si toi aussi, tu aimerais te reconnecter avec la lecture.</p>
<h2 id="sautoriser-lexploration-de-nouveaux-genres">S&rsquo;autoriser l&rsquo;exploration de nouveaux genres</h2>
<p>A l&rsquo;image du <a href="https://www.madmoizelle.com/snobisme-musical-plaie-societe-231099">snobisme musical</a>, je trouve qu&rsquo;on peut être rapidement jugé sur ses goûts littéraires et sur ce qu&rsquo;on lit.</p>
<p>J&rsquo;ai recommencé à lire en commençant par du <a href="https://esquisses.netlify.app/posts/cosy-mystery-agatha-raisin-la-quiche-fatale/">&ldquo;Cosy Mystery&rdquo;</a>: C&rsquo;est un genre littéraire loin de prétendre un jour au prix Goncourt mais ce livre avait le mérite d&rsquo;être drôle et gourmand !</p>
<p><img alt="image du livre agatha raisin, la quiche fatale" src="https://m.media-amazon.com/images/I/51s6ouVSvhL.jpg"></p>
<h2 id="commencer-par-des-romans-graphiques-bd-">Commencer par des romans graphiques, BD &hellip;</h2>
<p>On perd vite l&rsquo;habitude de se poser devant un livre, surtout quand on a du mal à rester attentif.</p>
<p>Un livre avec &ldquo;des images&rdquo; mine de rien, ça aide à lire plus rapidement et ça m&rsquo;a permis de mettre le nez progressivement dans la lecture en me réhabituant déjà à l&rsquo;exercice simple de rester attentif devant un livre pendant quelques heures.</p>
<p>Je peux te recommander:</p>
<ul>
<li>L&rsquo;excellente série autobiographique de l&rsquo;Arabe du Futur de Riad Sattouf</li>
<li>The Promised Neverland, un manga où des orphelins réalisent que l&rsquo;établissement où ils ont grandi est plein de mystères et de dangers &hellip;</li>
<li>Death Note, un manga addictif où un adolescent reçoit d&rsquo;un Dieu de la Mort un cahier où il peut tuer des gens en écrivant leur nom &hellip;</li>
</ul>
<p><img alt="tome 1 de l&rsquo;arabe du futur" src="https://m.media-amazon.com/images/I/51YW8LrySZL._SY445_SX342_.jpg"></p>
<h2 id="exploiter-les-temps-morts-de-sa-journée">Exploiter les &ldquo;temps morts&rdquo; de sa journée</h2>
<p>Tu prends les transports en commun? Tu fais quoi en attendant tes temps de cuisson ? Ce sont des moments où tu peux en profiter pour avancer quelques pages sur ton roman !</p>
<h2 id="aie-toujours-un-livre-sur-toi">Aie toujours un livre sur toi</h2>
<p>Qui n&rsquo;a pas un ami qui arrive toujours en retard ? Avoir un livre à portée de main permet de profiter de n&rsquo;importe quel moment dans sa journée pour avancer un peu sur sa lecture !</p>
<h2 id="naie-pas-peur-darrêter-un-livre-qui-te-plaît-pas">N&rsquo;aie pas peur d&rsquo;arrêter un livre qui te plaît pas</h2>
<p>Ce tip peut paraître contreproductif. A se forcer à lire qui ne nous plaît pas, on se dégoûte de la lecture. C&rsquo;est ce qui m&rsquo;est arrivé quand j&rsquo;ai enchaîné trop de livres de développement personnel qui se répétaient, se ressemblaient.</p>
<p>Un autre piège auquel j&rsquo;ai pu être confrontée était de lire un bouquin qu&rsquo;une personne m&rsquo;avait recommandé alors que le pitch initial ne me plaisait pas. Si la thématique ne t&rsquo;intéresse pas, il y a peu de chances que tu arrives à aller au bout de ta lecture. Il y a de tout dans la nature et c&rsquo;est ok de ne pas aimer un livre plebiscité par tel ou tel prix littéraire !</p>
<h2 id="suivre-un-bookclub">Suivre un bookclub</h2>
<p>J&rsquo;ai découvert qu&rsquo;il existait des &ldquo;booktubeuses&rdquo;, des personnes créatrices de contenu autour des livres sur les réseaux sociaux (TikTok, Instagram, Youtube&hellip;). Je suis le bookclub d&rsquo;Isadora et Marisa qui recommandent un livre chaque mois.</p>
<p>Il m&rsquo;est arrivé de zapper quelques mois et de lire deux livres le mois d&rsquo;après mais au moins, ces bookclubs permettent de créer une &ldquo;pile de lectures&rdquo; et de ne jamais être à court d&rsquo;idées lecture !</p>
<h2 id="troquer-son-temps-réseaux-sociaux-pour-du-temps-livres">Troquer son temps &ldquo;Réseaux Sociaux&rdquo; pour du temps livres</h2>
<p>C&rsquo;est probablement un constat qui m&rsquo;a horrifié: je passe en moyenne 2h sur les réseaux sociaux dans ma journée. 2h à regarder des reels certes hilarants pour la plupart mais qui me font un peu perdre du temps. Temps qui pourrait être rentabilisé pour avancer ma lecture ^^
La mise en place de minuteurs aide à se sevrer progressivement de ces applications, mais j&rsquo;ai encore du chemin à faire sur ce sujet.</p>
<p>J&rsquo;espère que ces conseils t&rsquo;aideront à te remettre en selle ! Si tu as d&rsquo;autres conseils auxquels je n&rsquo;ai pas pensé, n&rsquo;hésite pas à les partager en commentaire.</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 6</title>
            <link>/fr/posts/2023/03/til-6/</link>
            <pubDate>Fri, 10 Mar 2023 11:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2023/03/til-6/</guid>
            <description>&lt;p&gt;Ce mois-ci, j&amp;rsquo;ai fait pas mal de découvertes kubernetes / cloud related notamment en raison de ma participation aux Kubernetes Community Days ! Vous trouverez le récap &lt;a href=&#34;/fr/posts/2023/03/notes-du-kubernetes-community-days-france/&#34;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En dehors de ça :&lt;/p&gt;
&lt;h2 id=&#34;javascript&#34;&gt;Javascript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;La refonte de &lt;a href=&#34;https://react.dev/&#34;&gt;la documentation de React&lt;/a&gt; est un bonheur. J&amp;rsquo;avais beaucoup de mal à rentrer dans l&amp;rsquo;ancienne, la présence de table de matières fait du bien.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cloud&#34;&gt;Cloud&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://dagger.io/&#34;&gt;Dagger&lt;/a&gt; est un outil permettant le développement de pipelines dans des containers 🤯&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;css&#34;&gt;CSS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Il y a une variable scroll qu&amp;rsquo;on peut exploiter en CSS : &lt;a href=&#34;https://css-tricks.com/books/greatest-css-tricks/scroll-animation/&#34;&gt;https://css-tricks.com/books/greatest-css-tricks/scroll-animation/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://locomotivemtl.github.io/locomotive-scroll/&#34;&gt;Locomotive Scroll&lt;/a&gt;, une bibliothèque faite par une agence Montréalaise !&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/AllThingsSmitty/css-protips#use-empty-to-hide-empty-html-elements&#34;&gt;Ce repository Github&lt;/a&gt; est plein de bonnes pratiques CSS avec de petits exemples concrets à côté.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;hors-tech&#34;&gt;Hors tech&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;ai lu le livre &lt;a href=&#34;https://www.babelio.com/livres/Sukegawa-Les-delices-de-Tokyo/807915&#34;&gt;Les délices de Tokyo&lt;/a&gt;, écrit par Durian Sukegawa. C&amp;rsquo;était un bonheur à lire, j&amp;rsquo;en parlerai prochainement sur &lt;a href=&#34;https://esquisses.netlify.app&#34;&gt;mon blog dédié à mes découvertes culturelles :)&lt;/a&gt;&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Ce mois-ci, j&rsquo;ai fait pas mal de découvertes kubernetes / cloud related notamment en raison de ma participation aux Kubernetes Community Days ! Vous trouverez le récap <a href="/fr/posts/2023/03/notes-du-kubernetes-community-days-france/">ici</a>.</p>
<p>En dehors de ça :</p>
<h2 id="javascript">Javascript</h2>
<ul>
<li>La refonte de <a href="https://react.dev/">la documentation de React</a> est un bonheur. J&rsquo;avais beaucoup de mal à rentrer dans l&rsquo;ancienne, la présence de table de matières fait du bien.</li>
</ul>
<h2 id="cloud">Cloud</h2>
<ul>
<li><a href="https://dagger.io/">Dagger</a> est un outil permettant le développement de pipelines dans des containers 🤯</li>
</ul>
<h2 id="css">CSS</h2>
<ul>
<li>Il y a une variable scroll qu&rsquo;on peut exploiter en CSS : <a href="https://css-tricks.com/books/greatest-css-tricks/scroll-animation/">https://css-tricks.com/books/greatest-css-tricks/scroll-animation/</a></li>
<li><a href="https://locomotivemtl.github.io/locomotive-scroll/">Locomotive Scroll</a>, une bibliothèque faite par une agence Montréalaise !</li>
<li><a href="https://github.com/AllThingsSmitty/css-protips#use-empty-to-hide-empty-html-elements">Ce repository Github</a> est plein de bonnes pratiques CSS avec de petits exemples concrets à côté.</li>
</ul>
<h2 id="hors-tech">Hors tech</h2>
<p>J&rsquo;ai lu le livre <a href="https://www.babelio.com/livres/Sukegawa-Les-delices-de-Tokyo/807915">Les délices de Tokyo</a>, écrit par Durian Sukegawa. C&rsquo;était un bonheur à lire, j&rsquo;en parlerai prochainement sur <a href="https://esquisses.netlify.app">mon blog dédié à mes découvertes culturelles :)</a></p>
]]></content>
        </item>
        
        <item>
            <title>Notes du Kubernetes Community Days France </title>
            <link>/fr/posts/2023/03/notes-du-kubernetes-community-days-france/</link>
            <pubDate>Tue, 07 Mar 2023 11:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2023/03/notes-du-kubernetes-community-days-france/</guid>
            <description>&lt;p&gt;La photo de couverture de l&amp;rsquo;article vient du compte Twitter &lt;a href=&#34;https://twitter.com/KubeDaysFrance/status/1633079094819672074/photo/2&#34;&gt;Kubernetes Community Days France&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&#34;https://ladiesofcodeparis.netlify.app/&#34;&gt;Ladies of Code Paris&lt;/a&gt; était partenaire communauté du Kubernetes Community Days qui a eu lieu le  7 mars dernier au centre Georges Pompidou à Paris.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai eu l&amp;rsquo;opportunité d&amp;rsquo;animer deux tables rondes dans l&amp;rsquo;après-midi et j&amp;rsquo;ai pu profiter de quelques conférences sur le reste de la journée.&lt;/p&gt;
&lt;p&gt;Le replay des conférences devrait être disponible mais voici ce que j&amp;rsquo;ai retenu !&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>La photo de couverture de l&rsquo;article vient du compte Twitter <a href="https://twitter.com/KubeDaysFrance/status/1633079094819672074/photo/2">Kubernetes Community Days France</a>.</p>
<hr>
<p><a href="https://ladiesofcodeparis.netlify.app/">Ladies of Code Paris</a> était partenaire communauté du Kubernetes Community Days qui a eu lieu le  7 mars dernier au centre Georges Pompidou à Paris.</p>
<p>J&rsquo;ai eu l&rsquo;opportunité d&rsquo;animer deux tables rondes dans l&rsquo;après-midi et j&rsquo;ai pu profiter de quelques conférences sur le reste de la journée.</p>
<p>Le replay des conférences devrait être disponible mais voici ce que j&rsquo;ai retenu !</p>
<h1 id="conférences">Conférences</h1>
<p>Il a fallu faire des choix: l&rsquo;inconvénient des confs par tracks, tu n&rsquo;es pas encore doté du don d&rsquo;ubiquité pour en voir plusieurs à la fois&hellip;</p>
<p>Voici celles auxquelles j&rsquo;ai assisté !</p>
<h2 id="building-container-images-in-k8s--its-been-a-journey-">Building Container Images in k8s : it&rsquo;s been a journey !</h2>
<p>J&rsquo;ai démarré la journée avec une conférence donnée par <a href="https://twitter.com/lbernail">Laurent Bernaille</a> et Mayeul Blanzat de chez Datadog qui ont fait un retour d&rsquo;expérience sur leur manière de builder leurs containers sur kubernetes.</p>
<p>Les containers ne devraient jamais se lancer en tant que root.</p>
<p><code>buildkit</code> exploite la notion de <em>rootless build</em> où on crée un user namespace avec des &ldquo;faux root&rdquo; (user root dans le container est différent du root de la machine hôte).C&rsquo;est une fonctionnalité interne au kernel Linux. <a href="https://www.youtube.com/watch?v=JKbPzUnAZ1Y">Plus d&rsquo;informations sur le mode rootless</a>.</p>
<p>Le mode <em>rootless</em> affecte le montage du système de fichiers qui occasionne des problèmes parfois difficiles à débugger (ils ont montré notamment un souci de &ldquo;fichiers fantôme&rdquo; qui pouvaient perdurer dans leurs builds et causer des problèmes de compilation: derrière un simple <code>git checkout</code> se cache d&rsquo;autres manipulations sur le système de fichiers!)</p>
<p>Ce qui m&rsquo;a marqué dans cette conférence, c&rsquo;est les détails donnés sur la manière dont ils ont débuggé leurs problèmes de build avec deux commandes que je ne connaissais pas 👇</p>
<ul>
<li><code>strace</code> pour surveiller les appels reçus par un processus ainsi que les signaux reçus.</li>
<li><code>netstat -tulnp</code> pour voir les ports utilisés du début à la fin du process de build.</li>
</ul>
<p>De ces cas concrets se dégage une bonne pratique liée aux images Docker: on évite de démarrer un démon au démarrage d&rsquo;une image docker (ou on les kill en sortant).</p>
<h2 id="a-case-for-a-developer-portal">A case for a developer portal</h2>
<p>Contexte: Une architecture avec un monolith qu&rsquo;on souhaite exploser. On a du mal à visualiser les dépendances, qui est responsable d&rsquo;une brique, monter l&rsquo;infrastructure liée à chaque microservice prend du temps&hellip; Sounds familiar ? 😄</p>
<p>Backmarket avait une architecture monolithique qu&rsquo;ils ont explosé en une trentaine de microservices. Avec cette nouvelle architecture, l&rsquo;équipe &ldquo;Infrastructure&rdquo; devenait le bottleneck de leur organisation.</p>
<p>Est venue alors la nécessité d&rsquo;avoir un &ldquo;Developer Portal&rdquo;: c&rsquo;est un outil pour permettre de mieux visualiser les différences briques et faciliter la création de nouveaux microservices. Sami Farhat de Back Market a présenté leur utilisation de <a href="https://backstage.io/">backstage.io</a> en interne, un outil pour fournir un <em>developer portal</em>.</p>
<p>Le <em>Central Hub</em> permet de visualiser la stack technique. On peut déclarer une nouvelle &ldquo;entité&rdquo; (API, SDK&hellip;) aux moyens de YAML. Il existe des extensions permettant de se brancher à Github, CircleCI&hellip;</p>
<p>Le <em>Service Bootstrap</em> était la première fonctionnalité la plus demandée pour faciliter la création de microservices. La team Dev n&rsquo;a qu&rsquo;à décrire la stack souhaitée, indiquer le dépôt Git, les outils dont ils ont besoin (dashboard qualité, etc.) et tada 🧙🏻 Grâce à Terraform et <em>Chassis</em> (un outil maison qui fournit un skeleton d&rsquo;application), le microservice est crée au bout d&rsquo;une heure. Ils travaillaient encore sur l&rsquo;accélération du process mais déjà, l&rsquo;automatisation fait gagner du temps à l&rsquo;équipe infrastructure qui est moins sollicitée par les équipes de développement.</p>
<p>Des <em>Coupling Scores</em> sont donnés pour chaque service grâce à un outil qui crawle le code source des différents microservices. Les sources à optimiser sont ainsi détectées plus facilement par les équipes dev.</p>
<p>La mise en place du dev portal est longue, il faut y aller par itérations. Vendre cette solution n&rsquo;est pas facile mais met en lumière toutes les inconsistances du projet et apporte beaucoup sur le long terme. Ca encourage aussi à être rigoureux sur les RBAC du projet.</p>
<p>En ayant un Developer Portal fiable, cela inspire la confiance des utilisateurs et encourage l&rsquo;adoption de l&rsquo;outil.</p>
<h2 id="comment-créer-un-plugin-kubectl">Comment créer un plugin kubectl?</h2>
<p><code>k8s</code> est fait pour être étendu: on le voit avec les opérateurs mais aussi avec les plugins.</p>
<p>Les plugins peuvent être un moyen d&rsquo;enrichir son utilisation de kubernetes en encapsulant des commandes qu&rsquo;on a tendance à répéter.</p>
<p>Il est possible de créer simplement un plugin, il faut juste lui passer un binaire à exécuter (codé en Rust, Quarkus, Python, Go&hellip;).</p>
<p>La <a href="https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/">recette</a> est simple :</p>
<ul>
<li>On crée un fichier <code>touch kubectl-monsuperplugin</code></li>
<li>On lui donne les droits d&rsquo;exécution <code>chmod +x kubectl-monsuperplugin</code></li>
<li>Mets le DTP (Dans Ton Path) <code>mv ./kubectl-monsuperplugin /usr/local/bin/</code></li>
<li>Run <code>kubectl monsuperplugin</code> et ça devrait marcher.</li>
</ul>
<p>Il est possible de déployer le plugin sur un index privé pour le rendre utilisable par ses collègues (pour des plugins relatifs à de la tambouille interne à une entreprise, par exemple!).</p>
<p>Des plugins sont trouvables d&rsquo;autres gens sur Internet sont trouvables via <code>krew</code> (c&rsquo;est comme <code>brew</code> mais pour des plugins <code>kubectl</code>)</p>
<p>Quelques plugins cools partagés par les speakers:</p>
<ul>
<li><code>kubectl view-secret monsecret -a</code></li>
<li><code>kubectl pod-inspect</code> pour une inspection moins verbeuse</li>
<li><code>kubectl neat</code> qui nettoie le YAML</li>
</ul>
<p>Quelques bonnes pratiques pour le développement de plugins k8s :</p>
<ul>
<li>Le Go est à privilégier</li>
<li>Attention au naming et aux mots clés réservés à kubectl</li>
<li>krew-release-bot et GoReleaser pour générer des versions du plugin.</li>
</ul>
<p>Mention spéciale au binôme <a href="https://twitter.com/aurelievache">Aurélie Vache</a> et <a href="https://twitter.com/sebi2706">Sébastien Blanc</a> pour leur énergie et qui transmettent leur savoir avec beaucoup de pédagogie et des exemples simples mais concrets 💕</p>
<p>J&rsquo;ai découvert lors de cette conf l&rsquo;existence des outils suivants:</p>
<ul>
<li><a href="https://github.com/stern/stern">stern</a> pour tail les logs de plusieurs pods à la fois</li>
<li><a href="https://github.com/atombender/ktail">ktail</a> pour observer plus joliment les logs d&rsquo;un pod</li>
</ul>
<h2 id="comment-rendre-les-secrets-kubernetes-vraiment-secrets">Comment rendre les secrets Kubernetes vraiment… secrets?</h2>
<p>La conférence a été donnée par <a href="https://louhde.tech/">Julie Hourcade, Ingénieure Devops chez Formance</a>. Les secrets sur Kubernetes ne sont que des données encodées en base64. Ce n&rsquo;est pas du chiffrement et ça n&rsquo;assure pas vraiment la sécurité des secrets.</p>
<p>On peut utiliser un Secret Vault Manager (je découvre leur existence !) et déporter ainsi ça côté tiers (AWS, Google Cloud Platform, HashiCorp Vault). Vault s&rsquo;utilise en CLI avec <code>curl</code>.</p>
<p>Le manager s&rsquo;installe via un Secret Store DSI Driver, une interface qui s&rsquo;installe au niveau du cluster kubernetes.</p>
<p>On peut définir des politiques d&rsquo;accès plus restreintes d&rsquo;un pod à une liste de secrets.</p>
<p>Il est possible aussi d&rsquo;utiliser un SDK pour la gestion des secrets et complétement externaliser cette problématique.</p>
<p>Quelque soit la solution choisie, il faut avoir conscience de la complexité introduite et s&rsquo;assurer que cette complexité est raisonnable pour nos besoins.</p>
<h2 id="chaos-engineering-journey---injecting-harms">Chaos Engineering Journey - Injecting harms</h2>
<p>La conférence a été donnée par <a href="https://www.linkedin.com/in/lisi2016/">Si Li</a>, développeuse et SRE chez Carrefour.</p>
<p>Le concept a été propulsé par Netflix. L&rsquo;objectif était de générer des problèmes sur leur infrastructure pour l&rsquo;éprouver dans un contexte sécurisé et ne pas attendre de faire face à ces problèmes en production.</p>
<p><a href="https://github.com/linki/chaoskube">chaoskube</a> est un outil permettant de tuer des pods de manière aléatoire (selon des annotations, labels ou âge) dans un cluster donné. Il s&rsquo;installe facilement via helm.</p>
<p>Un process de chaos engineering va de pair avec un bon monitoring pour pouvoir voir les points d&rsquo;amélioration sur une infrastructure: <a href="https://litmuschaos.io/">litmuschaos</a> permet de metttre en lumière les défaillances sur une infrastructure. On peut générer un chaos sur un node, des pods ou sur un network entier avec <a href="https://hub.litmuschaos.io/">des scénarios installables</a>.</p>
<h1 id="tables-rondes">Tables rondes</h1>
<p>J&rsquo;ai eu l&rsquo;opportunité d&rsquo;être la modératrice de deux tables rondes. Il n&rsquo;y avait malheureusement pas d&rsquo;audience en raison du lieu qui ne s&rsquo;y prêtait pas mais elles étaient enregistrées. C&rsquo;était des vastes sujets mais nous n&rsquo;avions que 30 minutes pour en parler !</p>
<h2 id="ops--dev--devops">Ops / Dev / DevOps</h2>
<p>Avec <a href="https://twitter.com/ajuliettedev">Juliette Audema</a>, <a href="https://twitter.com/aHenryJard">Angélique Jard</a> et <a href="https://twitter.com/hugolassiege">Hugo Lassiège</a>, nous avons pu discuter autour des pratiques ops.</p>
<p>Ce que je retiens surtout de cet échange, c&rsquo;est à quel point la notion de &ldquo;DevOps&rdquo; a des définitions variantes: pour certains, c&rsquo;est un ensemble de pratiques, une philosophie pour d&rsquo;autres, c&rsquo;est devenu un métier &ldquo;Un dev qui fait aussi de l&rsquo;ops&rdquo;.</p>
<p>Je retiens aussi l&rsquo;importance quand on est dev d&rsquo;être responsable de son code du début à la mise en production et donc de s&rsquo;intéresser à l&rsquo;infrastructure.</p>
<p>En tant que dev, on peut souvent galérer sur des problématiques d&rsquo;infra car ce n&rsquo;est pas notre spécialité: Les pratiques DevOps augmente notre charge cognitive déjà élevée juste sur le métier de dev.</p>
<p>Accorder du temps et de l&rsquo;énergie à la &ldquo;Developer Experience&rdquo; fluidifie le rapport à l&rsquo;infrastructure pour un dev, et fournit aux équipes de développement les connaissances nécessaires en infra.</p>
<h2 id="open-source-comment-contribuer-">Open-source: Comment contribuer ?</h2>
<p>Avec <a href="https://twitter.com/ZinebBendhiba">Zineb Benhiba</a>, <a href="https://twitter.com/c_chaudier">Christophe Chaudier</a> et <a href="https://twitter.com/rverchere">Rémi Verchère</a>, nous avons discuté open source et les freins aux contributions.</p>
<p>Ce que je retiens de cette table ronde, c&rsquo;est qu&rsquo;il y a plein de manières de contribuer à un projet open source qui ne sont pas nécessairement liées au code: une bonne manière de débuter sont bien sûr les &ldquo;good first issue&rdquo; identifiées par le maintainer, il y a aussi communiquer sur les projets open-source (via Youtube, Linkedin, Twitter ou autre réseau social). Contribuer à un projet qu&rsquo;on utilise est aussi une manière simple de se lancer: on est plus à l&rsquo;aise de &ldquo;tester&rdquo; notre contribution.</p>
<p>En tant que maintainer d&rsquo;un projet open source, il est important de veiller à l&rsquo;inclusivité dans son projet: accueillir en ayant un processus bien clair dans le README, avoir un code of conduct, faire preuve de bienveillance envers les membres. Zineb s&rsquo;est lancée dans sa première contribution lors d&rsquo;un meetup, organiser une rencontre &ldquo;dans la vraie vie&rdquo; peut être un moyen efficace d&rsquo;attirer de nouvelles personnes contributrices.</p>
<p>Si on est perdu devant la license à choisir pour créer son projet, <a href="https://choosealicense.com/">choosealicense</a> (pour un projet code) et <a href="https://creativecommons.org/choose/">creative commons</a> (pour du contenu vidéo ou écrit) peut nous guider vers la license la plus adéquate selon nos besoins.</p>
<p>Cette discussion a germé des graines en moi 🌱 En rentrant, j&rsquo;ai réalisé qu&rsquo;une PR traînait sur le welcome kit de la communauté Ladies of Code sans que j&rsquo;y prête attention &hellip; Je visualise le chemin à parcourir, que ce soit en tant que maintainer et contributrice ! :)</p>
<h1 id="bilan">Bilan</h1>
<p>La journée est passée très vite, le lieu était vraiment canon aussi, mêlant art et tech. J&rsquo;ai passé un super moment et ressors de là énergisée et inspirée pour la suite !</p>
<p>Un grand grand merci aux speakers pour leur partage de connaissances, à la communauté Duchess France et Ladies of Code Paris: c&rsquo;est sincèrement toujours un plaisir de vous voir à ces événements ! Et last but not least, merci à <a href="https://www.linkedin.com/in/aur%C3%A9lien-violet-bb97445/?originalSubdomain=fr">Aurélien Violet</a>, <a href="https://twitter.com/zwindler">Denis Germain</a> pour l&rsquo;invitation et l&rsquo;organisation de l&rsquo;événement :)</p>
<p><img alt="/img/stickers-kcd.jpg" src="/img/stickers-kcd.jpg"></p>
<p><em>Point bonus pour le sticker bar, la récolte a été fructueuse !</em></p>
]]></content>
        </item>
        
        <item>
            <title>Notes du Very Tech Trip</title>
            <link>/fr/posts/2023/02/notes-du-very-tech-trip/</link>
            <pubDate>Sun, 05 Feb 2023 11:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2023/02/notes-du-very-tech-trip/</guid>
            <description>&lt;p&gt;J&amp;rsquo;ai assisté &lt;a href=&#34;https://blog.ovhcloud.com/very-tech-trip-laventure-ne-fait-que-commencer/&#34;&gt;au Very Tech Trip&lt;/a&gt; le 2 février dernier, organisé par OVH Cloud.&lt;/p&gt;
&lt;p&gt;Voici quelques notes des différents talks que j&amp;rsquo;ai pu écouter. J&amp;rsquo;ai pas forcément noté les noms de tous les speakers par manque de temps 😭 Les replays seront bientôt disponibles !&lt;/p&gt;
&lt;h1 id=&#34;sauvegardez-et-restaurez-proprement-vos-applications-kubernetes&#34;&gt;Sauvegardez et restaurez proprement vos applications kubernetes&lt;/h1&gt;
&lt;p&gt;Velero est un utilitaire facilitant la gestion de backups sur Kubernetes. Au delà des fichiers de confs, ça permet aussi de gérer les volumes qui peuvent être associés à des StatefulSet par exemple.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>J&rsquo;ai assisté <a href="https://blog.ovhcloud.com/very-tech-trip-laventure-ne-fait-que-commencer/">au Very Tech Trip</a> le 2 février dernier, organisé par OVH Cloud.</p>
<p>Voici quelques notes des différents talks que j&rsquo;ai pu écouter. J&rsquo;ai pas forcément noté les noms de tous les speakers par manque de temps 😭 Les replays seront bientôt disponibles !</p>
<h1 id="sauvegardez-et-restaurez-proprement-vos-applications-kubernetes">Sauvegardez et restaurez proprement vos applications kubernetes</h1>
<p>Velero est un utilitaire facilitant la gestion de backups sur Kubernetes. Au delà des fichiers de confs, ça permet aussi de gérer les volumes qui peuvent être associés à des StatefulSet par exemple.</p>
<p>L&rsquo;installation se fait via un chart helm.</p>
<p>On détermine quels volumes sauvegarder via des annotations sur les pods.</p>
<p>Possibilité d&rsquo;avoir des hooks sur lesquels se brancher avant ou après backup. Ca peut être utile pour déclencher certaines requêtes SQL par exemple ou notifier.</p>
<p>Le monitoring du backup se fait également via annotation.</p>
<p>Kyverno: Outil permettant de vérifier la déclaration des backups.</p>
<p>Bonnes pratiques pour les backups:</p>
<ul>
<li>Appliquer la règle du 3/2/1 pour les backups: 3 copies des données sur 2 supports différents dans au moins une autre localisation.</li>
<li>Toujours tester la création de backups mais surtout sa restauration !</li>
</ul>
<h1 id="testing-microservices">Testing microservices</h1>
<p>Problèmes: Dépendances entre les microservices. Plusieurs bdd. Test d&rsquo;intégrations compliqués.</p>
<p><em>White box testing</em> Framework de test associé au langage.
<em>Black box testing</em> Code inconnu, on se base sur les entrées/sorties pour vérifier le bon comportement du programme.
<em>Gray box testing</em> la jointure des deux mondes.</p>
<p>Chez OVHCloud, ces deux outils sont utilisés:</p>
<ul>
<li>Venom, un launcher de tests opensource: <a href="https://github.com/ovh/venom">https://github.com/ovh/venom</a></li>
<li>Smocker, un serveur de mocks http: <a href="https://github.com/Thiht/smocker">https://github.com/Thiht/smocker</a></li>
</ul>
<p>Une demo est accessible <a href="https://github.com/gwleclerc/venom_smocker_example">ici</a>.</p>
<h1 id="find-your-application-bottlenecks-with-tracing">Find your application bottlenecks with tracing</h1>
<p>Opentelemetry (logs : elasticsearch, Loki&hellip;). Metrics montrent la conséquence. Les traces (tempo, Jaeger) générées par les requêtes pour voir ce qui prend du temps.</p>
<p>Les spans sont des traces filles à la trace principale. Le tracing sert à identifier les problèmes.</p>
<p>L&rsquo;autoinstrumentation permet de générer des traces sans changer le code. Ca peut se faire grâce au standard opentelemetry.</p>
<p>Les librairies tierces se rattachent aux hooks des bdd (.net, python, java, node.js).</p>
<p>Collector: ne pas perdre de temps/perf à logger, fonctionne en udp + asynchrone. Il peut y avoir en sidecar par pod, daemonset par node ou central.</p>
<p>Annotation k8s pour activer le tracing sur le pod ( <code>Instrumentation.opentelemetry.io/inject-python: true</code>).</p>
<p>Exemple disponible <a href="http://www.github.com/alistarle/vtt-tracing">ici</a></p>
<h1 id="une-application-résiliente-dans-un-monde-partiellement-dégradé">Une application résiliente dans un monde partiellement dégradé</h1>
<p>Probablement mon talk préféré de la journée ! 🎖</p>
<p><em>Règle des X-nines</em> : Taux de disponibilité, permet de donner une estimation de jours d&rsquo;indispo.
4 neuf =&gt; 99,99%</p>
<p>Les taux de disponibilité <em>se multiplient</em>. Quand il y a des dépendances entre plusieurs api, on multiplie les taux de chacune. Quand on a plein de services dont on dépend, cela a un impact négatif sur notre propre taux de disponibilité.</p>
<p>Le &ldquo;Blast radius&rdquo; d&rsquo;une application : l&rsquo;impact de son downtime sur les autres applications qui la consomment.</p>
<p><em>Service Level Indicator</em> : Mesure qualitative d&rsquo;un aspect du niveau de service. Taux d&rsquo;erreur, latence, nombre de requêtes traitées - débit , durabilité.</p>
<p><em>Service Level Agreement</em>: Contrat avec l&rsquo;utilisateur.  Qu&rsquo;est-ce qui se passe si nos objectifs sont pas respectés ? Généralement, on offre un petit discount financier au client.</p>
<ul>
<li>Mettre en place une alerte uniquement quand il faut faire quelque chose ! Sinon, on se retrouve innondé d&rsquo;informations.</li>
</ul>
<p>Alerte sur un niveau de CPU useless: ça peut être pertinent que le CPU s&rsquo;active s&rsquo;il y a bcp de traitements. Toujours se demander lorsqu&rsquo;on crée une alerte si quelqu&rsquo;un a besoin d&rsquo;être réveillé pour ça.</p>
<p><em>Architecture</em> Des microservices sans communication asynchrone, c&rsquo;est monolithe distribué.</p>
<p>Ajouter un cache augmente pas la résilience. Ça ajoute un intermédiaire et réduit le taux de disponibilité</p>
<p><em>Tips</em></p>
<ul>
<li>Mettre des durées de cache aléatoire pour éviter qu&rsquo;une DB soit sur-solicitee d&rsquo;un coup pour plusieurs entrées qui expirent en même temps.</li>
<li>Heures aléatoire sur les crons, ne pas tous les jouer en même temps.</li>
<li>Une requête a échoué? On peut réessayer mais on limite le nb de fois. (Exponential backoff: on attend de plus en plus lgtps entre les tentatives.)</li>
<li>&ldquo;Choose boring tech&rdquo;</li>
<li>Penser son application en mode dégradé: jeter 10% du trafic pour soulager DB ou ne pas afficher des parties d&rsquo;une application en cas d&rsquo;indisponibilité du service qu&rsquo;elles consomment.</li>
<li><em>Chaos engineering</em>: prévoire que tout peut va casser. Provoquons des pannes en prod pour avoir l&rsquo;habitude de réparer.</li>
</ul>
<p>Merci @<a href="https://twitter.com/pascal_martin">pascal_martin</a> !</p>
<h1 id="comment-gérer-des-journées-de-35h">Comment gérer des journées de 35h</h1>
<ul>
<li>
<p>Multiplier ses activités pour s&rsquo;habituer</p>
</li>
<li>
<p>Rainbow Calendar
Permet de voir en un code couleur les différents activités.</p>
</li>
<li>
<p>l&rsquo;asynchrone</p>
</li>
</ul>
<p>Ane en a fait un très bon sketchnote.</p>
<p><a href="https://twitter.com/ane_naiz/status/1621199493118009345">https://twitter.com/ane_naiz/status/1621199493118009345</a></p>
<h1 id="vanilla-js---web-platform">Vanilla js - Web Platform</h1>
<p>La web platform (HTML, CSS, Javascript) fournissent un standard dont l&rsquo;apprentissage servira une vie.</p>
<p>Parmi la web platform, se trouve les web components qui permettent de créer ses propres balises. Cette spec a bientôt 10 ans et sert encore.</p>
<p><a href="https://playwright.dev/">Playwright</a> &raquo; Tests end to end</p>
<p><a href="https://blog.developer.adobe.com/the-web-platform-is-back-fa5752fabdfc">The web platform is back.</a></p>
<h1 id="webpaas---déploiement-dapplications-sur-le-cloud">WebPaaS - Déploiement d&rsquo;applications sur le cloud</h1>
<p><a href="https://twitter.com/mupsigraphy">Marine Gandy</a> a fait une démonstration du déploiement d&rsquo;une application Drupal sur le WebPaas d&rsquo;OVHCloud.</p>
<p>On peut gérer une multitude de services grâce à une gestion complétement externalisée, ça donne envie!</p>
<p>Code promo pour tester: vtt23webpaas</p>
<h1 id="dis-cest-quoi-ton-setup-">Dis c&rsquo;est quoi ton setup ?</h1>
<p>Fleet : IDE alternatif
Finicky : <a href="https://github.com/johnste/finicky">App</a> qui permet de définir par URL quel browser on choisit pour l&rsquo;ouvrir.
Brave: Navigateur permettant de gérer plusieurs profils selon l’utilisation (pro, perso&hellip;)
Raycast: Déjà testé et approuvé, c&rsquo;est un Spotlight sous Mac mais en bien mieux !
Kopia pour faire des backups.</p>
<p>Terminal OhMyZSH fournit des plugins plutôt cools :</p>
<ul>
<li>Zsh syntax highlighting</li>
<li>Zsh autosuggestions</li>
<li>Starship pour changer le thème</li>
</ul>
<p>Tmux - tmuxinator</p>
<ul>
<li>Nvm gestion de node. Jenv.</li>
<li>Upterm pour partager un terminal via ssh. Pour accéder à des serveurs. Ou tmate</li>
<li>Github cli.</li>
<li>Httpie au lieu de curl</li>
<li>Bat au lieu de cat</li>
<li>Tldr au lieu de man (sympa et coloré)</li>
<li>O au lieu de open.</li>
<li>GTI pour la blagounette quand tu mistype git.</li>
<li>dotfiles. Repo got qui contient ta config de terminal. Y a un script dans la racine.</li>
</ul>
<p>@v_maerten @cedric_gatay</p>
<p>Les replays des conférences seront bientôt disponibles. Encore merci OVHCloud !</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 5</title>
            <link>/fr/posts/2023/01/til-5/</link>
            <pubDate>Sun, 15 Jan 2023 11:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2023/01/til-5/</guid>
            <description>&lt;p&gt;Un nouveau TIL pour démarrer l&amp;rsquo;année 2023 ! 🥳&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;en profite pour souhaiter une douce année 2023 à celles et ceux qui liront cet article: que cette année vous apporte ce que 2022 ne vous a pas donné !&lt;/p&gt;
&lt;p&gt;Au menu ce mois-ci, un peu de front et des utilitaires pour BDD.&lt;/p&gt;
&lt;h1 id=&#34;extension-navigateur&#34;&gt;Extension navigateur&lt;/h1&gt;
&lt;p&gt;Chrome fournit une documentation très complète sur comment créer une extension pour Chrome.&lt;/p&gt;
&lt;p&gt;Elle débute ici: &lt;a href=&#34;https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/&#34;&gt;https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;intégration-css&#34;&gt;Intégration CSS&lt;/h1&gt;
&lt;p&gt;Ces quelques jeux permettent d&amp;rsquo;appréhender le système des flexbox de manière ludique !&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Un nouveau TIL pour démarrer l&rsquo;année 2023 ! 🥳</p>
<p>J&rsquo;en profite pour souhaiter une douce année 2023 à celles et ceux qui liront cet article: que cette année vous apporte ce que 2022 ne vous a pas donné !</p>
<p>Au menu ce mois-ci, un peu de front et des utilitaires pour BDD.</p>
<h1 id="extension-navigateur">Extension navigateur</h1>
<p>Chrome fournit une documentation très complète sur comment créer une extension pour Chrome.</p>
<p>Elle débute ici: <a href="https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/">https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/</a></p>
<h1 id="intégration-css">Intégration CSS</h1>
<p>Ces quelques jeux permettent d&rsquo;appréhender le système des flexbox de manière ludique !</p>
<ul>
<li><a href="https://mastery.games/flexboxzombies/">FlexboxZombies</a></li>
<li><a href="https://flexboxfroggy.com/#fr">FlexboxFroggy</a></li>
</ul>
<p>Le site <a href="https://www.frontendmentor.io/challenges">FrontendMentor</a> fournit des maquettes en libre accès et permet de s&rsquo;entraîner à l&rsquo;intégration. Il y a ensuite un système de reviews où des mentors commentent le code soumis !</p>
<p>Pour revoir les notions de positionnement en CSS, je trouve <a href="https://ishadeed.com/article/learn-css-positioning/">cet article</a> hyper complet ! <em>(en anglais)</em></p>
<h1 id="base-de-données">Base de données</h1>
<p>Ca fait plusieurs mois que je cherche une alternative à MySQL Workbench que je trouve un peu lent et pas très agréable à l&rsquo;utilisation. Je ne sais plus qui m&rsquo;a parlé de <a href="https://github.com/dbcli/mycli">MyCli</a> mais c&rsquo;est un utilitaire qui permet d&rsquo;explorer des bases de données depuis son terminal. Je suis particulièrement fan de l&rsquo;autosuggestion parce que tmtc 🦥 &hellip;</p>
<p><a href="https://supabase.com/">SupaBase</a> est une alternative open-source à Firebase. Si vous souhaitez héberger une base de données Postgres gratuitement à des fins de test, ça peut s&rsquo;avérer utile !</p>
<p>A bientôt pour une nouvelle veille :)</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 4</title>
            <link>/fr/posts/2022/11/til-4/</link>
            <pubDate>Thu, 03 Nov 2022 17:14:15 +0000</pubDate>
            
            <guid>/fr/posts/2022/11/til-4/</guid>
            <description>&lt;p&gt;&lt;a href=&#34;https://www.smashingmagazine.com/2020/01/understanding-css-grid-container/&#34;&gt;https://www.smashingmagazine.com/2020/01/understanding-css-grid-container/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai découvert une extension pour navigateur bien sympa pour avoir un petit feed d&amp;rsquo;articles à chaque ouverture d&amp;rsquo;onglets: &lt;a href=&#34;https://daily.dev/&#34;&gt;https://daily.dev/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Google a sorti une série de cours pour l&amp;rsquo;apprentissage de kubernetes: &lt;a href=&#34;https://learnkubernetes.withgoogle.com/kubernetes-essentials-series&#34;&gt;https://learnkubernetes.withgoogle.com/kubernetes-essentials-series&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;débugger-depuis-un-device-android&#34;&gt;Débugger depuis un device Android&lt;/h1&gt;
&lt;p&gt;Je le fais depuis mon Pixel 3A en passant juste par Chrome, c&amp;rsquo;est un bonheur:
&lt;a href=&#34;https://developer.chrome.com/docs/devtools/remote-debugging/&#34;&gt;https://developer.chrome.com/docs/devtools/remote-debugging/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/a/58834623/1704966&#34;&gt;https://stackoverflow.com/a/58834623/1704966&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vous pouvez avoir besoin de jouer sur le forwarding de ports pour que votre environnement local soit bien accessible.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p><a href="https://www.smashingmagazine.com/2020/01/understanding-css-grid-container/">https://www.smashingmagazine.com/2020/01/understanding-css-grid-container/</a></p>
<p>J&rsquo;ai découvert une extension pour navigateur bien sympa pour avoir un petit feed d&rsquo;articles à chaque ouverture d&rsquo;onglets: <a href="https://daily.dev/">https://daily.dev/</a></p>
<p>Google a sorti une série de cours pour l&rsquo;apprentissage de kubernetes: <a href="https://learnkubernetes.withgoogle.com/kubernetes-essentials-series">https://learnkubernetes.withgoogle.com/kubernetes-essentials-series</a></p>
<h1 id="débugger-depuis-un-device-android">Débugger depuis un device Android</h1>
<p>Je le fais depuis mon Pixel 3A en passant juste par Chrome, c&rsquo;est un bonheur:
<a href="https://developer.chrome.com/docs/devtools/remote-debugging/">https://developer.chrome.com/docs/devtools/remote-debugging/</a></p>
<p><a href="https://stackoverflow.com/a/58834623/1704966">https://stackoverflow.com/a/58834623/1704966</a></p>
<p>Vous pouvez avoir besoin de jouer sur le forwarding de ports pour que votre environnement local soit bien accessible.</p>
<h1 id="docker">Docker</h1>
<p>Utilitaire pour voir en un coup d&rsquo;oeil les différents containers Docker qui tournent sur la machine (thx Jules!)</p>
<p><a href="https://github.com/jesseduffield/lazydocker">https://github.com/jesseduffield/lazydocker</a></p>
<h1 id="vue">Vue</h1>
<p>Passage de propriétés d&rsquo;un petit-fils à son grand-parent : <a href="https://forum.vuejs.org/t/how-do-i-pass-an-event-to-two-parents-up/111901/4">https://forum.vuejs.org/t/how-do-i-pass-an-event-to-two-parents-up/111901/4</a>
Accéder à l&rsquo;instance racine: <a href="https://fr.vuejs.org/v2/guide/components-edge-cases.html#Acceder-a-l%E2%80%99instance-racine">https://fr.vuejs.org/v2/guide/components-edge-cases.html#Acceder-a-l%E2%80%99instance-racine</a>
Reacting to params changes: <a href="https://router.vuejs.org/guide/essentials/dynamic-matching.html#reacting-to-params-changes">https://router.vuejs.org/guide/essentials/dynamic-matching.html#reacting-to-params-changes</a></p>
<h1 id="vue-x">Vue X</h1>
<p><a href="https://vuex.vuejs.org/api/#subscribe">https://vuex.vuejs.org/api/#subscribe</a></p>
]]></content>
        </item>
        
        <item>
            <title>Ce qu&#39;introduit PHP 8.0</title>
            <link>/fr/posts/2021/04/ce-quintroduit-php-8.0/</link>
            <pubDate>Tue, 27 Apr 2021 13:37:37 +0200</pubDate>
            
            <guid>/fr/posts/2021/04/ce-quintroduit-php-8.0/</guid>
            <description>&lt;p&gt;PHP 8 est sorti il y a quelque temps maintenant. L&amp;rsquo;occasion d&amp;rsquo;introduire ce qui change dans la syntaxe 👇&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://taiyr.me/what-is-the-difference-between-code-linters-and-formatters&#34;&gt;Difference entre les formatters / linters&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Nouveautés PHP 8.0&lt;/em&gt; ⏬&lt;/p&gt;
&lt;h4 id=&#34;nullsafe-operator&#34;&gt;Nullsafe operator&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;$address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $user&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getAddress&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$country &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $address &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; $address&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getCountry&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;$country &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $user&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getAddress&lt;/span&gt;()&lt;span style=&#34;color:#f92672&#34;&gt;?-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;getCountry&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;manipulation-de-chaînes-de-caractères&#34;&gt;Manipulation de chaînes de caractères&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;$contains &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;strpos&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Cette chaine contient pouet&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pouet&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;$contains &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_contains&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;blabla&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bla&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$debut &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_starts_with&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;caillou chou pou&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cai&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$fin &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;str_ends_with&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;caillou chou pou&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;pou&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;constructeurs&#34;&gt;Constructeurs&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; $email;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; __construct(&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; $email) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $email;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP8
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; __construct(&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; $email) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $this&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; $email;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;arguments-nommés&#34;&gt;Arguments nommés&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;foo&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;int&lt;/span&gt; $a, &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;int&lt;/span&gt; $b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;string&lt;/span&gt; $c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;int&lt;/span&gt; $d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;foo&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// PHP8 - Evite de mettre des null pour rien, on met juste les paramètres obligatoires selon la signature de la fonction
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;foo&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;typage-darguments&#34;&gt;Typage d&amp;rsquo;arguments&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Possible aussi sur le typage de la valeur de retour&lt;/em&gt;&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>PHP 8 est sorti il y a quelque temps maintenant. L&rsquo;occasion d&rsquo;introduire ce qui change dans la syntaxe 👇</p>
<ul>
<li><a href="https://taiyr.me/what-is-the-difference-between-code-linters-and-formatters">Difference entre les formatters / linters</a></li>
</ul>
<p><em>Nouveautés PHP 8.0</em> ⏬</p>
<h4 id="nullsafe-operator">Nullsafe operator</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// PHP7
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$address <span style="color:#f92672">=</span> $user<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getAddress</span>();
</span></span><span style="display:flex;"><span>$country <span style="color:#f92672">=</span> $address <span style="color:#f92672">?</span> $address<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getCountry</span>() <span style="color:#f92672">:</span> <span style="color:#66d9ef">null</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// PHP8
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$country <span style="color:#f92672">=</span> $user<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getAddress</span>()<span style="color:#f92672">?-&gt;</span><span style="color:#a6e22e">getCountry</span>();
</span></span></code></pre></div><h4 id="manipulation-de-chaînes-de-caractères">Manipulation de chaînes de caractères</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// PHP7
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$contains <span style="color:#f92672">=</span> <span style="color:#a6e22e">strpos</span>(<span style="color:#e6db74">&#39;Cette chaine contient pouet&#39;</span>, <span style="color:#e6db74">&#39;pouet&#39;</span>) <span style="color:#f92672">!==</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// PHP8
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$contains <span style="color:#f92672">=</span> <span style="color:#a6e22e">str_contains</span>(<span style="color:#e6db74">&#39;blabla&#39;</span>, <span style="color:#e6db74">&#39;bla&#39;</span>);
</span></span><span style="display:flex;"><span>$debut <span style="color:#f92672">=</span> <span style="color:#a6e22e">str_starts_with</span>(<span style="color:#e6db74">&#39;caillou chou pou&#39;</span>, <span style="color:#e6db74">&#39;cai&#39;</span>);
</span></span><span style="display:flex;"><span>$fin <span style="color:#f92672">=</span> <span style="color:#a6e22e">str_ends_with</span>(<span style="color:#e6db74">&#39;caillou chou pou&#39;</span>, <span style="color:#e6db74">&#39;pou&#39;</span>);
</span></span></code></pre></div><h4 id="constructeurs">Constructeurs</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// PHP7
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">User</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">string</span> $email;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> __construct(<span style="color:#a6e22e">string</span> $email) {
</span></span><span style="display:flex;"><span>    $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">email</span> <span style="color:#f92672">=</span> $email;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// PHP8
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">User</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> __construct(<span style="color:#66d9ef">private</span> <span style="color:#a6e22e">string</span> $email) {
</span></span><span style="display:flex;"><span>    $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">email</span> <span style="color:#f92672">=</span> $email;
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="arguments-nommés">Arguments nommés</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// PHP7
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">foo</span>(<span style="color:#a6e22e">int</span> $a, <span style="color:#f92672">?</span><span style="color:#a6e22e">int</span> $b <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>, <span style="color:#f92672">?</span><span style="color:#a6e22e">string</span> $c <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>, <span style="color:#f92672">?</span><span style="color:#a6e22e">int</span> $d <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>) {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">foo</span>(<span style="color:#ae81ff">2</span>, <span style="color:#66d9ef">null</span>, <span style="color:#66d9ef">null</span>, <span style="color:#ae81ff">40</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// PHP8 - Evite de mettre des null pour rien, on met juste les paramètres obligatoires selon la signature de la fonction
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">foo</span>(<span style="color:#a6e22e">a</span><span style="color:#f92672">:</span><span style="color:#ae81ff">2</span>, <span style="color:#a6e22e">d</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">40</span>);
</span></span></code></pre></div><h4 id="typage-darguments">Typage d&rsquo;arguments</h4>
<p><em>Possible aussi sur le typage de la valeur de retour</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// PHP8
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">bar</span>(<span style="color:#66d9ef">array</span><span style="color:#f92672">|</span><span style="color:#a6e22e">string</span> $bla) <span style="color:#f92672">:</span> <span style="color:#a6e22e">int</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">float</span> {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h4 id="virgule-finale">Virgule finale</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// PHP7
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">foo</span>(<span style="color:#a6e22e">int</span> $a, <span style="color:#a6e22e">string</span> $b) {
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// PHP8 - Pouvoir ajouter de nouveaux arguments facilement
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">foo</span>(<span style="color:#a6e22e">int</span> $a, <span style="color:#a6e22e">string</span> $b,) {
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content>
        </item>
        
        <item>
            <title>Mettre en place un cronjob avec Github Actions et Netlify</title>
            <link>/fr/posts/2021/04/mettre-en-place-un-cronjob-avec-github-actions-et-netlify/</link>
            <pubDate>Tue, 27 Apr 2021 13:37:37 +0200</pubDate>
            
            <guid>/fr/posts/2021/04/mettre-en-place-un-cronjob-avec-github-actions-et-netlify/</guid>
            <description>&lt;p&gt;Je n&amp;rsquo;avais jamais eu l&amp;rsquo;occasion de jouer avec Github Actions. J&amp;rsquo;ai donc crée une petite application qui va récupérer quotidiennement nos statistiques de suivi de la communauté Ladies of Code Paris.&lt;/p&gt;
&lt;p&gt;Elle va consommer différentes API dans le but de tout féderer dans un tableau de suivi, pratique à consulter pour l&amp;rsquo;équipe coorganisatrice.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architecture de l&amp;rsquo;application est plutôt simple.&lt;/p&gt;
&lt;h2 id=&#34;création-de-la-fonction-netlify&#34;&gt;Création de la fonction Netlify&lt;/h2&gt;
&lt;p&gt;Il est possible d&amp;rsquo;héberger une fonction. On exploite une technologie Serverless: on ne sait pas du tout dans quel contexte cette fonction va s&amp;rsquo;exécuter, ni les caractérstiques du serveur qui l&amp;rsquo;héberge.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Je n&rsquo;avais jamais eu l&rsquo;occasion de jouer avec Github Actions. J&rsquo;ai donc crée une petite application qui va récupérer quotidiennement nos statistiques de suivi de la communauté Ladies of Code Paris.</p>
<p>Elle va consommer différentes API dans le but de tout féderer dans un tableau de suivi, pratique à consulter pour l&rsquo;équipe coorganisatrice.</p>
<p>L&rsquo;architecture de l&rsquo;application est plutôt simple.</p>
<h2 id="création-de-la-fonction-netlify">Création de la fonction Netlify</h2>
<p>Il est possible d&rsquo;héberger une fonction. On exploite une technologie Serverless: on ne sait pas du tout dans quel contexte cette fonction va s&rsquo;exécuter, ni les caractérstiques du serveur qui l&rsquo;héberge.</p>
<h2 id="création-du-cronjob-avec-github-actions">Création du cronjob avec Github Actions</h2>
<ul>
<li>Il est possible de créer simplement un workflow via l&rsquo;interface de Github.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">refresh-stats</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">schedule</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">cron</span>: <span style="color:#e6db74">&#39;*/15 * * * *&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">cron</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Refresh members count</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          curl --request GET \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          --url &#39;https://meetup-watchtower.netlify.app/.netlify/functions/members_count&#39;</span>          
</span></span></code></pre></div><ul>
<li>Il y a possibilité de définir des variables d&rsquo;environnements qui seront exploitables par les workflows Github.</li>
</ul>
<h2 id="troubleshooting">Troubleshooting</h2>
<p>Il faut exécuter <code>vercel dev</code> à la racine du projet</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> &gt; node_modules/mongodb/lib/encrypter.js:15:40: error: Could not resolve <span style="color:#e6db74">&#34;mongodb-client-encryption&#34;</span> <span style="color:#f92672">(</span>mark it as external to exclude it from the bundle<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#ae81ff">15</span> │ const mongodbClientEncryption <span style="color:#f92672">=</span> require<span style="color:#f92672">(</span><span style="color:#e6db74">&#39;mongodb-client-encryption&#39;</span><span style="color:#f92672">)</span>;
</span></span><span style="display:flex;"><span>       ╵                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~
</span></span></code></pre></div><p>J&rsquo;ai eu l&rsquo;erreur suivante après avoir installé Mongodb, lancé le client.</p>
<h2 id="variables-denvironnement">Variables d&rsquo;environnement</h2>
<ul>
<li>En local, créer un simple fichier .env</li>
<li>Pendant le build, créer les variables d&rsquo;environnement via l&rsquo;interface de Netlify.</li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>TIL 3</title>
            <link>/fr/posts/2021/04/til-3/</link>
            <pubDate>Tue, 27 Apr 2021 13:37:37 +0200</pubDate>
            
            <guid>/fr/posts/2021/04/til-3/</guid>
            <description>&lt;p&gt;Est-ce que j&amp;rsquo;ai complètement délaissé ce format ? C&amp;rsquo;est possible !&lt;/p&gt;
&lt;h2 id=&#34;html&#34;&gt;HTML&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/everestpipkin/status/1381053241543245825&#34;&gt;https://twitter.com/everestpipkin/status/1381053241543245825&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;css&#34;&gt;CSS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On ne peut pas accéder à l&amp;rsquo;élément parent en CSS. &lt;em&gt;Cascading&lt;/em&gt; Stylesheet for a reason &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tools&#34;&gt;Tools&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On peut rejouer des requêtes XHR via l&amp;rsquo;onglet &amp;ldquo;Networks&amp;rdquo; sur Chrome (et probablement d&amp;rsquo;autres navigateurs)&lt;/li&gt;
&lt;li&gt;On peut prettifier une requête SQL sur MySQL Workbench en cliquant sur le petit pinceau.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il est possible d&amp;rsquo;empê&lt;/p&gt;
&lt;h2 id=&#34;sur-les-internets&#34;&gt;Sur les Internets&lt;/h2&gt;
&lt;p&gt;Tu es développeuse mais tu passes beaucoup de temps sur des choses pas liées au code: onboarding des nouveaux, planification de la roadmap et autres réunions qui t&amp;rsquo;éloignent de ton terminal?  Cette lecture te parlera sûrement ! Merci à Morgane pour le partage de cet article &lt;a href=&#34;https://noidea.dog/glue&#34;&gt;&amp;ldquo;Being Glue&amp;rdquo;&lt;/a&gt; qui m&amp;rsquo;aura fait prendre conscience de beaucoup de choses sur mes envies professionnelles.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Est-ce que j&rsquo;ai complètement délaissé ce format ? C&rsquo;est possible !</p>
<h2 id="html">HTML</h2>
<p><a href="https://twitter.com/everestpipkin/status/1381053241543245825">https://twitter.com/everestpipkin/status/1381053241543245825</a></p>
<h2 id="css">CSS</h2>
<ul>
<li>On ne peut pas accéder à l&rsquo;élément parent en CSS. <em>Cascading</em> Stylesheet for a reason &hellip;</li>
</ul>
<h2 id="tools">Tools</h2>
<ul>
<li>On peut rejouer des requêtes XHR via l&rsquo;onglet &ldquo;Networks&rdquo; sur Chrome (et probablement d&rsquo;autres navigateurs)</li>
<li>On peut prettifier une requête SQL sur MySQL Workbench en cliquant sur le petit pinceau.</li>
</ul>
<p>Il est possible d&rsquo;empê</p>
<h2 id="sur-les-internets">Sur les Internets</h2>
<p>Tu es développeuse mais tu passes beaucoup de temps sur des choses pas liées au code: onboarding des nouveaux, planification de la roadmap et autres réunions qui t&rsquo;éloignent de ton terminal?  Cette lecture te parlera sûrement ! Merci à Morgane pour le partage de cet article <a href="https://noidea.dog/glue">&ldquo;Being Glue&rdquo;</a> qui m&rsquo;aura fait prendre conscience de beaucoup de choses sur mes envies professionnelles.</p>
<p>Les facteurs clés pour garantir une bonne qualité logicielle ne sont pas ceux que vous pensez. Spoiler alert: ça ne touche pas qu&rsquo;à la manière dont on refactore notre code. <a href="https://increment.com/teams/the-epistemology-of-software-quality/">Lecture ici</a>.</p>
<p>Je prends beaucoup de plaisir à lire les newsletters de Women on Rails et Doctolib.</p>
]]></content>
        </item>
        
        <item>
            <title>Git 101</title>
            <link>/fr/posts/2021/03/git-101/</link>
            <pubDate>Thu, 18 Mar 2021 13:37:37 +0200</pubDate>
            
            <guid>/fr/posts/2021/03/git-101/</guid>
            <description>&lt;p&gt;En échangeant avec des étudiant·e·s en informatique, je remarque qu&amp;rsquo;un bon nombre n&amp;rsquo;utilise pas ou peu Git dans le cadre de leurs projets scolaires. C&amp;rsquo;est dommage car c&amp;rsquo;est un outil qui facilite la vie lorsqu&amp;rsquo;on travaille à plusieurs sur un projet logiciel.&lt;/p&gt;
&lt;p&gt;À travers cet article, je vais répondre aux questions que j&amp;rsquo;ai le plus souvent entendues et donner les bases minimales de ce merveilleux outil qu&amp;rsquo;est Git.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#x2139;&amp;#xfe0f; &lt;em&gt;Disclaimer&lt;/em&gt;: J&amp;rsquo;utilise essentiellement Git par ligne de commande. Il existe aussi des interfaces (notamment Github Desktop, Sourcetree) qui font la même chose.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>En échangeant avec des étudiant·e·s en informatique, je remarque qu&rsquo;un bon nombre n&rsquo;utilise pas ou peu Git dans le cadre de leurs projets scolaires. C&rsquo;est dommage car c&rsquo;est un outil qui facilite la vie lorsqu&rsquo;on travaille à plusieurs sur un projet logiciel.</p>
<p>À travers cet article, je vais répondre aux questions que j&rsquo;ai le plus souvent entendues et donner les bases minimales de ce merveilleux outil qu&rsquo;est Git.</p>
<blockquote>
<p>&#x2139;&#xfe0f; <em>Disclaimer</em>: J&rsquo;utilise essentiellement Git par ligne de commande. Il existe aussi des interfaces (notamment Github Desktop, Sourcetree) qui font la même chose.</p>
</blockquote>
<h2 id="cest-quoi-git-">C&rsquo;est quoi Git ?</h2>
<p>Git est un gestionnaire de version. Il représente votre projet logiciel comme un arbre. Votre projet logiciel pousse et évolue comme un arbre.</p>
<p>Grâce à Git, vous pourrez :</p>
<ul>
<li>Identifier des versions précises de votre projet</li>
<li>Collaborer à plusieurs sur un projet</li>
<li>Restaurer des versions précédentes de votre projet</li>
<li>Et bien plus encore !</li>
</ul>
<p>Rares sont les équipes qui n&rsquo;utilisent pas Git (ou un autre gestionnaire de version). C&rsquo;est pourquoi j&rsquo;ai souhaité démystifier à travers cet article les fonctionnalités principales à connaître sur Git.</p>
<h2 id="récupérer-son-projet">Récupérer son projet</h2>
<p>Soit on se trouve dans un cas de figure où on doit initialiser son projet. Il suffit de se placer à la racine du répertoire que l&rsquo;on souhaite versionner et taper la commande suivante :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git init
</span></span></code></pre></div><p>Soit on récupère un projet existant.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git clone url-du-projet
</span></span></code></pre></div><p>Avec cette commande, vous pourrez juste récupérer le projet pas forcément y contribuer. Il faudra vous assurer d&rsquo;avoir été ajouté en collaborateur par le gestionnaire du projet.</p>
<h2 id="les-branches">Les branches</h2>
<p>Une branche est l&rsquo;équivalent d&rsquo;une &ldquo;version&rdquo; de l&rsquo;application qu&rsquo;on est sur le point de créer.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git checkout -b nom-de-ma-branche
</span></span></code></pre></div><blockquote>
<p>Les noms de branche suivent généralement une nomenclature. On démarre généralement :</p>
<p>type-de-branche/numéro-ticket-feature</p>
<ul>
<li>feature/PRP-101-add-button</li>
<li>fix/PRP-202-remove-bug</li>
<li>hotfix/PP-394-everything-down</li>
</ul>
<p>Cela va dépendre de l&rsquo;équipe projet que vous intégrez et des normes que vous décidez de vous imposer &#x1f604;</p>
</blockquote>
<p>La branche main | master représente la version la plus stabilisée du projet, c&rsquo;est la branche principale. Toutes les branches que vous créerez ont vocation à être &ldquo;mergées&rdquo; avec master.</p>
<p>&ldquo;Merger une branche&rdquo; avec master signifie déporter les modifications qui ont été faites sur la branche dans la branche principale du projet.</p>
<h2 id="cycle-de-développement">Cycle de développement</h2>
<p>Quand on code, on va éditer des fichiers. Git détectera les modifications faites aux fichiers. Il est possible de visualiser les modifications courantes grâce à la commande</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git status
</span></span></code></pre></div><p>Une fois notre développement prêt, on va pouvoir commit. Un commit est une &ldquo;capture&rdquo; de votre application à un instant donné.</p>
<p>Il va falloir ajouter les fichiers à son commit puis commiter.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git add fichier
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;message de commit&#34;</span>
</span></span></code></pre></div><blockquote>
<p>&#x1f4a1; Il arrive parfois que des fichiers se trouvent dans notre arbre de modifications. J&rsquo;évite soigneusement le <code>git add .</code> pour mieux maîtriser ce que j&rsquo;envoie dans mon commit !</p>
</blockquote>
<p>Il est recommandé de mettre un message le plus clair possible. Chaque équipe projet a ses habitudes mais nombreuses sont celles qui utilisent la convention de nommage <a href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits</a></p>
<p>Il m&rsquo;arrive aussi de mettre des emojis dans mes messages de commit sur mes projets personnels.</p>
<h2 id="les-relectures-de-code">Les relectures de code</h2>
<p>Les Pull Request (ou Merge Request) permettent aux autres développeurs du projet de contribuer. Selon l&rsquo;outil que vous utilisez (Github, Gitlab, Bitbucket&hellip;), l&rsquo;ouverture d&rsquo;une Pull Request sera différente mais l&rsquo;objectif est le même : soumettre votre code à vos pairs afin qu&rsquo;ils vous donnent des feedbacks.</p>
<p>Une bonne PR doit contenir :</p>
<ul>
<li>L&rsquo;objectif de la modification en quelques lignes dans le titre de la PR</li>
<li>L&rsquo;issue liée: ça peut être une issue Github, un ticket Trello bref, ce qui peut aider votre reviewer à comprendre le contexte dans lequel le code que vous soumettez est nécessaire.</li>
<li>Les éventuels points d&rsquo;attention à apporter via des commentaires au fil de votre PR.</li>
</ul>
<p>Pour faciliter les relectures de code, Ségolène de la communauté Women on Rails a écrit un brillant article.</p>
<h3 id="merge-vs-rebase">Merge vs Rebase</h3>
<p>Une fois votre branche prête et approuvée par la team, vous avez deux options: <code>merge</code> ou <code>rebase</code></p>
<p>Les deux commandes intégreront vos modifications dans la branche que vous souhaitez.</p>
<p>Une des différences majeures est que<code>git merge</code> va préserver l&rsquo;historique de vos commits à la différence de <code>git rebase</code> qui va les condenser en un commit.</p>
<p><code>git merge</code> va créer un commit de merge lors du merge de deux branches, permettant ainsi de mieux identifier quand les branches ont été regroupées.</p>
<h2 id="les-tags">Les tags</h2>
<p>Les tags sont rattachés à des commits. Ils sont utilisés pour &ldquo;identifier&rdquo; une version précise de l&rsquo;application.</p>
<p>Dans un environnement d&rsquo;intégration continue, on peut soit écouter les derniers commits sur master ou les derniers tags crées. Encore une fois, Git propose des fonctionnalités diverses mais chaque équipe choisit ses rituels de mise en production !</p>
<h2 id="la-différence-entre-git-et-github-">La différence entre Git et Github ?</h2>
<p>Prenons un exemple.</p>
<ul>
<li>Vous créez votre branche sur votre ordinateur, vous commitez sur la branche <em>sans la pousser</em></li>
<li>Vous vous faites un petit goûter gourmand pour vous récompenser.</li>
<li>Un cambrioleur vole votre ordi en passant par la fenêtre de votre bureau.</li>
<li>Votre travail est perdu.</li>
</ul>
<p>Github est donc une sorte d&rsquo;hébergeur en ligne de projets Git, afin qu&rsquo;ils ne soient jamais perdus. Leur responsabilité est d&rsquo;héberger vos projets Git et de s&rsquo;assurer ainsi qu&rsquo;ils ne soient jamais perdus &#x1f91e;</p>
<p>À noter qu&rsquo;il existe d&rsquo;autres solutions conccurentes à Github : Gitlab, Bitbucket&hellip;</p>
<p>J&rsquo;espère que cet article aura pû vous aider à éclaircir quelques points obscurs concernant Git !</p>
<p>Y a-t-il d&rsquo;autres questions que vous vous posez sur Git ? Je serais ravie d&rsquo;y répondre en commentaires !</p>
]]></content>
        </item>
        
        <item>
            <title>Faire une API Rest avec Vercel</title>
            <link>/fr/posts/2020/09/faire-une-api-rest-avec-vercel/</link>
            <pubDate>Sun, 06 Sep 2020 13:37:37 +0200</pubDate>
            
            <guid>/fr/posts/2020/09/faire-une-api-rest-avec-vercel/</guid>
            <description>&lt;p&gt;&lt;a href=&#34;https://unsplash.com/photos/A4AJVLFu-Ug&#34;&gt;&lt;em&gt;Cover picture by Tomasz Sroka&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vercel (&lt;em&gt;anciennement Zeit&lt;/em&gt;) est une plateforme JAMStack qui permet de déployer facilement des applications à partir d&amp;rsquo;un repository Git distant. Le service fourni est similaire à celui de Netlify, l&amp;rsquo;objectif est d&amp;rsquo;améliorer l&amp;rsquo;expérience de développement et faciliter les déploiements.&lt;/p&gt;
&lt;p&gt;On peut héberger des applications (un blog Gatsby par exemple!) mais aussi des fonctions Serverless. &lt;a href=&#34;https://serverless-stack.com/chapters/fr/what-is-serverless.html&#34;&gt;Une fonction Serverless&lt;/a&gt; est une fonction qui est exécutée à la demande (lors de la réception d&amp;rsquo;une requête HTTP par exemple) par un service de Cloud tiers (AWS Lambda, Cloud Functions&amp;hellip;) : on ne paie donc pas un nombre de serveurs mais plutôt à l&amp;rsquo;usage des fonctions.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p><a href="https://unsplash.com/photos/A4AJVLFu-Ug"><em>Cover picture by Tomasz Sroka</em></a></p>
<p>Vercel (<em>anciennement Zeit</em>) est une plateforme JAMStack qui permet de déployer facilement des applications à partir d&rsquo;un repository Git distant. Le service fourni est similaire à celui de Netlify, l&rsquo;objectif est d&rsquo;améliorer l&rsquo;expérience de développement et faciliter les déploiements.</p>
<p>On peut héberger des applications (un blog Gatsby par exemple!) mais aussi des fonctions Serverless. <a href="https://serverless-stack.com/chapters/fr/what-is-serverless.html">Une fonction Serverless</a> est une fonction qui est exécutée à la demande (lors de la réception d&rsquo;une requête HTTP par exemple) par un service de Cloud tiers (AWS Lambda, Cloud Functions&hellip;) : on ne paie donc pas un nombre de serveurs mais plutôt à l&rsquo;usage des fonctions.</p>
<p>J&rsquo;ai voulu tester en créant une API très simple qui retourne une citation aléatoire de Jul (<em>jugez moi</em>).</p>
<p>Ces citations sont stockées dans une collection sur une base MongoDB.</p>
<h2 id="pré-requis">Pré-requis</h2>
<p>Avant toute chose, j&rsquo;ai installé <a href="https://vercel.com/download">vercel-cli</a>, qui permet de gérer les déploiements mais aussi de démarrer un environnement local similaire à la production, ce qui est bien pratique pour éviter les mauvaises surprises</p>
<h2 id="création-dune-base-de-données">Création d&rsquo;une base de données</h2>
<p>Il est possible de créer une petite base <a href="http://cloud.mongodb.com/">MongoDB gratuite</a> sur le cloud, parfaite pour une sandbox.  Il est possible de créer des secrets sur Vercel très facilement à l&rsquo;aide de la commande</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>vercel secrets add <span style="color:#e6db74">&#34;NOM_DU_SECRET VALEUR&#34;</span>
</span></span></code></pre></div><p><em>On oublie pas les quotes !</em></p>
<h2 id="création-de-lapplication">Création de l&rsquo;application</h2>
<p>Vercel impose une structure dans la manière de déclarer sa fonction serverless. Il faut que la fonction se trouve dans un dossier api.</p>
<p>Il suffit de démarrer son environnement local à l&rsquo;aide de la commande vercel dev.</p>
<p>J&rsquo;ai choisi d&rsquo;utiliser Node.js pour mon API mais il est possible d&rsquo;utiliser Go, Python ou Ruby également. <a href="https://vercel.com/guides">La documentation est exhaustive</a> sur la manière de démarrer un projet dans différentes technos.</p>
<h2 id="bilan">Bilan</h2>
<p>Le setup de l&rsquo;environnement local est très agréable. Il vient même avec un hot-reload, l&rsquo;expérience de développement est painless. Les commandes de Vercel ressemblaient à celles de Kubernetes ce qui m&rsquo;a moins mêlée.</p>
<p>Attention si vous utilisez Docker en parallèle, il est possible que Vercel conflicte avec des ports déjà en usage. Pensez à stopper les applications (je n&rsquo;ai pas trouvé de moyen de faire démarrer Vercel sur un autre port).</p>
<p>J&rsquo;aurais du mal à utiliser un service de ce type sur un projet réel. J&rsquo;ai l&rsquo;impression que ça s&rsquo;adapte plutôt bien pour des mini-projets de test ou des proof of concepts mais que les prix peuvent rapidement s&rsquo;envoler dans un contexte de production normal.</p>
<p>En tout cas, je recommande l&rsquo;outil pour tous ceux qui souhaiteraient construire un portfolio sur leurs projets open source !</p>
<h2 id="ressources">Ressources</h2>
<ul>
<li><a href="https://vercel.com/guides/deploying-a-mongodb-powered-api-with-node-and-vercel">https://vercel.com/guides/deploying-a-mongodb-powered-api-with-node-and-vercel</a></li>
<li><a href="https://www.lambrospetrou.com/articles/battle-of-jamstack-platforms-netlify-vercel-aws/">https://www.lambrospetrou.com/articles/battle-of-jamstack-platforms-netlify-vercel-aws/</a></li>
<li><a href="https://jamstack.org/">https://jamstack.org/</a></li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>Ode à la simplicité</title>
            <link>/fr/posts/2020/07/ode-%C3%A0-la-simplicit%C3%A9/</link>
            <pubDate>Sun, 05 Jul 2020 20:14:34 +0200</pubDate>
            
            <guid>/fr/posts/2020/07/ode-%C3%A0-la-simplicit%C3%A9/</guid>
            <description>&lt;p&gt;&lt;em&gt;Disclaimer: C&amp;rsquo;est le premier article de ce type que je sors. Excusez les fautes d&amp;rsquo;orthographe.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Je déclare officiellement mon amour pour la simplicité. Et ce, dans tous les axes de ma vie.&lt;/p&gt;
&lt;h3 id=&#34;dans-mon-code&#34;&gt;Dans mon code&lt;/h3&gt;
&lt;p&gt;J&amp;rsquo;aime avoir un code simple, compréhensible par n&amp;rsquo;importe quelle personne qui le lirait, que ce soit un vieux roublard des Internets ou encore un poulain novice. J&amp;rsquo;aime me relire six mois plus tard et comprendre la logique de Laila du passé.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p><em>Disclaimer: C&rsquo;est le premier article de ce type que je sors. Excusez les fautes d&rsquo;orthographe.</em></p>
<p>Je déclare officiellement mon amour pour la simplicité. Et ce, dans tous les axes de ma vie.</p>
<h3 id="dans-mon-code">Dans mon code</h3>
<p>J&rsquo;aime avoir un code simple, compréhensible par n&rsquo;importe quelle personne qui le lirait, que ce soit un vieux roublard des Internets ou encore un poulain novice. J&rsquo;aime me relire six mois plus tard et comprendre la logique de Laila du passé.</p>
<p>Le bonheur d&rsquo;un code simple, c&rsquo;est qu&rsquo;il est savoureux à lire et à maintenir. Le code simple rend tout le monde heureux: la machine qui l&rsquo;interprète / le compile mais aussi les humains qui le lisent.</p>
<h3 id="dans-mes-mots">Dans mes mots</h3>
<p>J&rsquo;aime la simplicité dans mes articles: elle les rend plus digestes.</p>
<p>La simplicité d&rsquo;un article le rend accessible à tou·te·s. N&rsquo;importe qui peut s&rsquo;y reconnaître et y tirer une graine à semer dans son esprit.</p>
<h3 id="dans-mes-interactions">Dans mes interactions</h3>
<p>J&rsquo;aime interagir avec une personne et qu&rsquo;elle comprenne <em>tous</em> les mots que j&rsquo;emploie. Il n&rsquo;y a pas de non-dits, de mauvaises interprétations.</p>
<p>J&rsquo;aime quand on me parle avec des mots simples.</p>
<p>J&rsquo;aime la simplicité dans l&rsquo;administration. J&rsquo;aime quand il <em>ne manque aucun</em> <em>papier</em>, quand la liste est claire et qu&rsquo;on ne me demande pas plus que nécessaire. J&rsquo;aime la simplicité en politique : quand un politicien parle avec des mots simples, de problématiques qui concernent son peuple. Je commence à déborder &hellip;</p>
<p>Pourquoi se passe-t-on de la simplicité aujourd&rsquo;hui ? Pourquoi <a href="https://medium.com/@m_nebra/quand-la-complexit%C3%A9-prend-le-pouvoir-a683b1bf8a2b">vouer un culte à la complexité</a> alors que la simplicité peut nous faciliter l&rsquo;existence ?</p>
<p>J&rsquo;ai l&rsquo;impression que c&rsquo;est lié à l&rsquo;effort à fournir pour la simplification. Derrière la simplicité se cache des efforts invisibles de clarification : comment optimiser ma parole pour qu&rsquo;elle soit bien comprise de mon interlocuteur ?</p>
<p>Je m&rsquo;engage désormais à faire de mon mieux pour garder les choses <em>simples</em>. Que ce soit dans mon code mais aussi dans ma vie.</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 2</title>
            <link>/fr/posts/2020/07/til-2/</link>
            <pubDate>Sun, 05 Jul 2020 20:14:34 +0200</pubDate>
            
            <guid>/fr/posts/2020/07/til-2/</guid>
            <description>&lt;p&gt;Elles ont un peu de retard mais elles sont là ! C&amp;rsquo;est parti pour les découvertes du mois de juin.&lt;/p&gt;
&lt;h2 id=&#34;outils&#34;&gt;Outils&lt;/h2&gt;
&lt;p&gt;Visual Studio Code a un ZenMode : c&amp;rsquo;est hyper agréable de naviguer, on peut passer d&amp;rsquo;un fichier ouvert à l&amp;rsquo;autre avec le raccourci Ctrl + Tab.&lt;/p&gt;
&lt;h2 id=&#34;liens-chouettes&#34;&gt;Liens chouettes&lt;/h2&gt;
&lt;p&gt;En cherchant les différences entre les objets &lt;code&gt;XMLHttpRequest&lt;/code&gt; et &lt;code&gt;fetch&lt;/code&gt;, je suis tombée sur ce blog très cool qui poste quasi quotidiennement des articles à propos de Javascript.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Elles ont un peu de retard mais elles sont là ! C&rsquo;est parti pour les découvertes du mois de juin.</p>
<h2 id="outils">Outils</h2>
<p>Visual Studio Code a un ZenMode : c&rsquo;est hyper agréable de naviguer, on peut passer d&rsquo;un fichier ouvert à l&rsquo;autre avec le raccourci Ctrl + Tab.</p>
<h2 id="liens-chouettes">Liens chouettes</h2>
<p>En cherchant les différences entre les objets <code>XMLHttpRequest</code> et <code>fetch</code>, je suis tombée sur ce blog très cool qui poste quasi quotidiennement des articles à propos de Javascript.</p>
<p><a href="https://gomakethings.com/why-i-still-use-xhr-instead-of-the-fetch-api/">https://gomakethings.com/why-i-still-use-xhr-instead-of-the-fetch-api/</a></p>
<p>J&rsquo;ai découvert cette API qui retourne des propriétés de plantes. Je l&rsquo;ai trouvée via le repository d&rsquo;APIs publiques utilisables pour des projets personnels !</p>
<p>https<a href="https://trefle.io/api/plants?q=rosemary">://trefle.io/api/plants?q=rosemary</a></p>
<p>Mes moments de procrastination sur Twitter m&rsquo;ont fait découvrir le super portfolio de Bruno Simon: <a href="https://bruno-simon.com/">https://bruno-simon.com/</a> Mention spéciale aux Easter eggs.</p>
<h2 id="css">CSS</h2>
<p>Il est possible de rendre un sélecteur CSS case insensitive.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">CSS Tip  🔥️ There&#39;s a special operator you can use in CSS Attribute Selectors<br><br>The operator is `i`, here&#39;s how it works:<br><br>// Case insensitive match<br>a[title=&quot;home&quot; i] {<br>    Will match Home or even HOME<br>}<br><br>// Case sensitive match<br>a[title=&quot;home&quot;] {<br>    Will only match home<br>}<a href="https://x.com/hashtag/css?src=hash&amp;ref_src=twsrc%5Etfw">#css</a> <a href="https://t.co/UIJTGTUczt">pic.twitter.com/UIJTGTUczt</a></p>&mdash; Umar Hansa (@umaar) <a href="https://x.com/umaar/status/1275416501688942592?ref_src=twsrc%5Etfw">June 23, 2020</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>


<h2 id="javascript">Javascript</h2>
<p>Il est possible d&rsquo;observer le changement de taille d&rsquo;un élément en Javascript via l&rsquo;API ResizeObserver.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ResizeObserver lets us observe changes to the layout size of elements: <a href="https://t.co/ZIswQyNemT">https://t.co/ZIswQyNemT</a> It&#39;s in the latest Safari! <br><br>Now in *all* modern browsers, we can efficiently design components responsive to their container vs. just the viewport. <a href="https://t.co/TNK9VDjSAZ">pic.twitter.com/TNK9VDjSAZ</a></p>&mdash; Addy Osmani (@addyosmani) <a href="https://x.com/addyosmani/status/1248899086490558465?ref_src=twsrc%5Etfw">April 11, 2020</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>


<p>Il est possible de grouper les messages en console via la fonction console.group.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">DevTools Tip: <a href="https://t.co/mUe3Mc48hz">https://t.co/mUe3Mc48hz</a>() is great for grouping console messages to make them more readable 📖 <a href="https://t.co/xem3kfkvn8">pic.twitter.com/xem3kfkvn8</a></p>&mdash; Addy Osmani (@addyosmani) <a href="https://x.com/addyosmani/status/1191049744962842624?ref_src=twsrc%5Etfw">November 3, 2019</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>


<p>Si vous ne suivez pas Addy Osmani, je vous le recommande vivement. Ses contenus sont toujours pertinents et applicables.</p>
<p>J&rsquo;ai découvert qu&rsquo;on pouvait rendre un objet immutable grâce à la fonction <code>Object.freeze</code>.</p>
<h2 id="devops">DevOps</h2>
<p>J&rsquo;ai appris à supprimer les images Docker qui ne sont pas associées à un container.</p>
<p><code>docker rmi $(docker images --filter &quot;dangling=true&quot; -q --no-trunc)</code></p>
<p>J&rsquo;ai aussi découvert comment lister les fichiers existants sur un volume Docker via busybox.</p>
<p><a href="https://stackoverflow.com/questions/46866933/is-there-a-way-to-list-files-inside-a-docker-volume">https://stackoverflow.com/questions/46866933/is-there-a-way-to-list-files-inside-a-docker-volume</a></p>
<h2 id="fun">Fun</h2>
<p>Le compte Twitter CuriositesJuridiques pour ses extraits &hellip; insolites.</p>
<blockquote class="twitter-tweet"><p lang="fr" dir="ltr">N&#39;est pas un accident de travail la blessure infligée pendant une bagarre survenue à la cantine car une fonctionnaire voulait absolument récupérer le dessert de la cantine déjà mangé par un collègue.<br><br>Cour administrative d&#39;appel de Versailles, 15 juin 2020, n°18VE02936</p>&mdash; Curiosités Juridiques (@CJuridiques) <a href="https://x.com/CJuridiques/status/1278306074282557442?ref_src=twsrc%5Etfw">July 1, 2020</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>


<p>C&rsquo;est tout pour aujourd&rsquo;hui !</p>
<p>N&rsquo;hésitez pas à faire part de vos découvertes dans les commentaires :)</p>
]]></content>
        </item>
        
        <item>
            <title>4 astuces pour préparer un bon live-coding</title>
            <link>/fr/posts/2020/06/4-astuces-pour-pr%C3%A9parer-un-bon-live-coding/</link>
            <pubDate>Mon, 08 Jun 2020 20:39:34 +0200</pubDate>
            
            <guid>/fr/posts/2020/06/4-astuces-pour-pr%C3%A9parer-un-bon-live-coding/</guid>
            <description>&lt;p&gt;Le live-coding (ou &lt;a href=&#34;https://fr.wikipedia.org/wiki/Live_coding&#34;&gt;programmation à la volée&lt;/a&gt; en bon français!) est un exercice où un(e) dev code devant une audience. On voit souvent cet exercice lors de conférences tech sur une version courte mais il est possible aussi de l&amp;rsquo;exercer avec des devs plus junior dans un but d&amp;rsquo;apprentissage.&lt;/p&gt;
&lt;p&gt;Le confinement m&amp;rsquo;a fait découvrir &lt;a href=&#34;https://www.descodeuses.org/frontend&#34;&gt;l&amp;rsquo;association Descodeuses&lt;/a&gt; qui propose des formations à des femmes pour devenir développeuse web. Je suis encore aujourd&amp;rsquo;hui mentor pour cette association.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>Le live-coding (ou <a href="https://fr.wikipedia.org/wiki/Live_coding">programmation à la volée</a> en bon français!) est un exercice où un(e) dev code devant une audience. On voit souvent cet exercice lors de conférences tech sur une version courte mais il est possible aussi de l&rsquo;exercer avec des devs plus junior dans un but d&rsquo;apprentissage.</p>
<p>Le confinement m&rsquo;a fait découvrir <a href="https://www.descodeuses.org/frontend">l&rsquo;association Descodeuses</a> qui propose des formations à des femmes pour devenir développeuse web. Je suis encore aujourd&rsquo;hui mentor pour cette association.</p>
<p>Dans le cadre de cette expérience de mentorat, une des apprenantes m&rsquo;a demandé comment gérer l&rsquo;intégration d&rsquo;un feed Instagram sur une application. Je lui ai donc proposé une session de live-coding  où elle me verrait faire.</p>
<p>Voici quelques conseils si vous souhaitez préparer un livecoding.</p>
<h2 id="vérifier-son-installation-technique">Vérifier son installation technique</h2>
<p>Avoir une bonne connexion Internet est évidemment indispensable pour ce genre d&rsquo;exercices. Un micro peut s&rsquo;avérer tout aussi utile pour éviter les bruits de fond parasites de ton voisin qui retape sa maison pendant le confinement (<em>true story</em>)</p>
<h2 id="déterminer-son-sujet">Déterminer son sujet</h2>
<p>L&rsquo;exercice de live-coding est une &ldquo;improvisation&rdquo; mais il y a un équilibre à tenir: il faut préparer un minimum son sujet avant la session mais pas trop pour que l&rsquo;audience puisse suivre le processus de développement.</p>
<p>J&rsquo;aime voir ça comme une recette de cuisine: quand on regarde une vidéo explicative, la personne ne nous emmène pas faire les courses avec elle et a déjà les ingrédients à disposition !</p>
<p>Préparez donc votre &ldquo;liste d&rsquo;ingrédients&rdquo; avant la session de live-coding. Dans mon cas, je me suis assurée d&rsquo;avoir:</p>
<ul>
<li>Lu la doc de l&rsquo;API Instagram avec laquelle j&rsquo;allais interagir</li>
<li>Crée mon application</li>
<li>Une page HTML vierge pour pouvoir y ajouter mon code Javascript</li>
</ul>
<p><em>N&rsquo;allez pas trop loin</em> dans la préparation: il faut que votre audience puisse voir les éventuelles erreurs dans votre processus et comprendre comment est-ce que vous résolvez les problèmes.</p>
<figure><img src="https://media.giphy.com/media/jxzEhHBMmH7tm/giphy.gif?center">
</figure>

<h2 id="verbaliser-son-processus-de-débugage">Verbaliser son processus de débugage</h2>
<p>Ce qui est particulièrement intéressant dans l&rsquo;exercice du live coding, c&rsquo;est qu&rsquo;un développeur montre son processus de réflexion à une autre personne.</p>
<p>Il faut penser à dire tout haut ce que vous pensez et à détailler le plus possible ce qu&rsquo;on fait.</p>
<p>Comme &ldquo;on ne voit pas&rdquo; son audience, il est facile de la perdre. Il est important de :</p>
<ul>
<li>Clarifier au début de la session qu&rsquo;il faut pas hésiter à interrompre à tout moment</li>
<li>Demander régulièrement à l&rsquo;audience si elle arrive bien à suivre (quitte à reprendre les étapes à partir du moment où elle a décroché)</li>
</ul>
<p>Ça serait dommage que l&rsquo;audience finisse comme ça ⬇️</p>
<figure><img src="https://media.giphy.com/media/nURzWHsOTpDDa/giphy.gif?center">
</figure>

<h2 id="fixer-le-scope-du-live-coding">Fixer le scope du live coding</h2>
<p>Au fur et à mesure des questions de l&rsquo;audience, il est facile d&rsquo;être tenté de retravailler son code en live pour répondre aux questions.  Il vaut mieux éviter de se disperser: vous risquez de perdre l&rsquo;attention de votre audience.</p>
<figure><img src="https://media.giphy.com/media/mx9fVEF08tyne/giphy.gif?center">
</figure>

<p>Proposez plutôt une autre session durant laquelle vous répondrez à la nouvelle question posée.</p>
<p>Avez-vous déjà tenté l&rsquo;expérience du live coding ? Si oui, qu&rsquo;en avez-vous pensé ?</p>
]]></content>
        </item>
        
        <item>
            <title>TIL 1</title>
            <link>/fr/posts/2020/05/til-1/</link>
            <pubDate>Tue, 26 May 2020 20:14:34 +0200</pubDate>
            
            <guid>/fr/posts/2020/05/til-1/</guid>
            <description>&lt;p&gt;En mai, j&amp;rsquo;ai (encore) refait mon blog.&lt;/p&gt;
&lt;p&gt;Ce blog en a connu des vertes et des pas mûres en 8 ans!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple fichier HTML hébergé sur un serveur Free 👵🏼&lt;/li&gt;
&lt;li&gt;Passage sur Wordpress hébergé chez 1&amp;amp;1&lt;/li&gt;
&lt;li&gt;Migration vers Jekyll hébergé sur Github Pages pour jouer avec Ruby&lt;/li&gt;
&lt;li&gt;Migration vers Gatsby hébergé sur Github Pages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aujourd&amp;rsquo;hui, ce blog est propulsé par Hugo et hébergé chez Netlify. Et évidemment, j&amp;rsquo;ai écrit très peu d&amp;rsquo;articles sur ce temps là.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<p>En mai, j&rsquo;ai (encore) refait mon blog.</p>
<p>Ce blog en a connu des vertes et des pas mûres en 8 ans!</p>
<ul>
<li>Simple fichier HTML hébergé sur un serveur Free 👵🏼</li>
<li>Passage sur Wordpress hébergé chez 1&amp;1</li>
<li>Migration vers Jekyll hébergé sur Github Pages pour jouer avec Ruby</li>
<li>Migration vers Gatsby hébergé sur Github Pages</li>
</ul>
<p>Aujourd&rsquo;hui, ce blog est propulsé par Hugo et hébergé chez Netlify. Et évidemment, j&rsquo;ai écrit très peu d&rsquo;articles sur ce temps là.</p>
<figure><img src="https://media.giphy.com/media/b55x0VFpFKm7S/giphy.gif?center">
</figure>

<p>Inspirée des <a href="https://www.madmoizelle.com/rubriques/pour-rire/trouvailles-dinternet-pour-bien-commencer-la-semaine">trouvailles de madmoiZelle</a>, j&rsquo;ai décidé d&rsquo;écrire un article par mois listant mes trouvailles de dev sur les Internets (avec peut-être quelques blagounettes au passage).</p>
<p>Pourquoi ?</p>
<ol>
<li>C&rsquo;est plus pratique de fouiller sur mon blog pour retrouver des bons liens que de fouiller sur mon fil Twitter x)</li>
<li>Ca me motive à écrire</li>
</ol>
<p>TIL au passage est un acronyme pour Things I&rsquo;ve Learned.</p>
<p>C&rsquo;est parti !</p>
<h2 id="front">Front</h2>
<p>Le confinement m&rsquo;a fait rejoindre l&rsquo;association Descodeuses en tant que mentor. Cette activité m&rsquo;a amené à faire beaucoup de front ce mois-ci.</p>
<p>L&rsquo;API IntersectionObserver permet de détecter la collision de deux éléments du DOM. Ses performances sont meilleures que l&rsquo;écoute des événéments scroll/resize auxquels j&rsquo;aurais pû penser pour ce problème jusqu&rsquo;à maintenant.  Voici un petit codepen d&rsquo;exemple ici <a href="https://codepen.io/leiluspocus/pen/oNjExNg">https://codepen.io/leiluspocus/pen/oNjExNg</a>.</p>
<p>Cette démo avec la grande Rachelle McAndrews m&rsquo;a bien aidé à préparer mon live coding sur les Grids CSS avec les apprenantes


    
    <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/g1osnSY9mSU?autoplay=0&controls=1&end=0&loop=0&mute=0&start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
      ></iframe>
    </div>
</p>
<p>Il est possible de transformer un document HTML en un beau document LaTeX en utilisant cette bibliothèque: <a href="https://latex.now.sh/">https://latex.now.sh/</a></p>
<p>Il existe des frameworks CSS sans classe <a href="https://watercss.kognise.dev/">comme (Water)</a> qui redéfinissent simplement le style des balises HTML. Pratique pour un MVP.</p>
<p>David Walsh m&rsquo;a fait découvrir <a href="https://davidwalsh.name/cancel-fetch">l&rsquo;interface <code>AbortController</code></a> qui permet d&rsquo;annuler des requêtes fetch en Javascript.</p>
<h2 id="hugo">Hugo</h2>
<p>Comme je disais, j&rsquo;ai refait pour la n-ième fois le blog et je suis conquise par <a href="https://gohugo.io/">Hugo</a>.
Les p&rsquo;tits plus qui me font kiffer:</p>
<ul>
<li>La <em>rapidité</em> de l&rsquo;environnement local</li>
<li>Les shortcodes utilisables dans les markdown (pour intégrer un tweet, une vidéo Youtube)</li>
<li>La facilité d&rsquo;overrider le thème installé</li>
</ul>
<h2 id="devtools">DevTools</h2>
<p>J&rsquo;ai l&rsquo;impression de découvrir régulièrement de chouettes features sur les DevTools de Chrome.</p>
<ul>
<li>
<p>On peut copier du CSS à la volée.
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://x.com/hashtag/DevTools?src=hash&amp;ref_src=twsrc%5Etfw">#DevTools</a> Tip ⚡️ Copy and extract all the CSS for an element on the page<br><br>Right click element &gt; Copy &gt; Copy Styles<br><br>Useful as styles can often be scattered across many selectors! ⭐️ <a href="https://t.co/YHmdxoj9fh">pic.twitter.com/YHmdxoj9fh</a></p>&mdash; Umar Hansa (@umaar) <a href="https://x.com/umaar/status/1263418649286754304?ref_src=twsrc%5Etfw">May 21, 2020</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>

</p>
</li>
<li>
<p>On peut voir les dépendances entre les requêtes sur l&rsquo;onglet Network
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Tip: In <a href="https://x.com/ChromeDevTools?ref_src=twsrc%5Etfw">@ChromeDevTools</a>, hold shift while hovering over a request and it will highlight the initiator in green and dependencies in red. <a href="https://t.co/Xd9l2BCoC9">pic.twitter.com/Xd9l2BCoC9</a></p>&mdash; Addy Osmani (@addyosmani) <a href="https://x.com/addyosmani/status/1260479896888975362?ref_src=twsrc%5Etfw">May 13, 2020</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>

</p>
</li>
</ul>
<h2 id="communauté">Communauté</h2>
<p>BenjaminCode a sorti une vidéo sur le niveau minimum requis pour avoir une première mission en tant que dev frontend. C&rsquo;est une question qui nous est régulièrement posée par des juniors chez Ladies of Code, ses conseils sont très pertinents et applicables concrètement !


    
    <div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/XJYRhQUjS6I?autoplay=0&controls=1&end=0&loop=0&mute=0&start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
      ></iframe>
    </div>
</p>
<p>Paola m&rsquo;a fait découvrir <a href="https://streamyard.com/">Streamyard</a>, une solution pour gérer facilement un stream depuis&hellip; un navigateur web. Vous pouvez voir le résultat sur un meetup <a href="https://www.youtube.com/watch?v=QGM_kT0KWXA&t=5s">Ladies of Code</a>.</p>
<h2 id="autres">Autres</h2>
<ul>
<li>
<p><a href="https://www.youtube.com/channel/UCFKE7WVJfvaHW5q283SxchA">Yoga With Adrienne</a>
Est-il encore nécessaire de présenter cette chaîne Youtube en 2020 ? J&rsquo;ai suivi le challenge &ldquo;Home&rdquo; sur 30 jours, une routine que j&rsquo;espère maintenir le plus longtemps possible post confinement.</p>
</li>
<li>
<p>FlightRadar24
C&rsquo;est un service qui trace le trafic aérien en temps réel.</p>
</li>
</ul>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Meanwhile at London Heathrow Airport... <a href="https://t.co/yNFtksYEJg">pic.twitter.com/yNFtksYEJg</a></p>&mdash; Flightradar24 (@flightradar24) <a href="https://x.com/flightradar24/status/1266431804803878918?ref_src=twsrc%5Etfw">May 29, 2020</a></blockquote>
<script async src="https://platform.x.com/widgets.js" charset="utf-8"></script>


<p>C&rsquo;est tout pour ce beau mois de mai !</p>
<p>Merci de m&rsquo;avoir lue jusqu&rsquo;ici, n&rsquo;hésite pas à me partager tes découvertes dans les commentaires ci-dessous 👋</p>
]]></content>
        </item>
        
        <item>
            <title>Une journée à dotJS (Jour Backend 2)</title>
            <link>/fr/posts/2019/12/une-journ%C3%A9e-%C3%A0-dotjs-jour-backend-2/</link>
            <pubDate>Mon, 09 Dec 2019 19:23:42 +0000</pubDate>
            
            <guid>/fr/posts/2019/12/une-journ%C3%A9e-%C3%A0-dotjs-jour-backend-2/</guid>
            <description>&lt;h1 id=&#34;récapitulatif---dotjs-2019&#34;&gt;Récapitulatif - dotJS 2019&lt;/h1&gt;
&lt;p&gt;J&amp;rsquo;ai eu la chance d&amp;rsquo;assister à dotJS cette année grâce à des places qui ont été offertes par les dotConferences à la communauté &lt;!-- raw HTML omitted --&gt;Ladies of Code&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;@Jawache&lt;!-- raw HTML omitted --&gt; a pris la parole sur notre impact environnemental en tant que développeur. L&amp;rsquo;électricité est responsable à 30% des émissions de CO2. On ne peut se permettre d&amp;rsquo;en gaspiller.
Google Cloud serait un cloud Carbone neutral (ça m&amp;rsquo;étonne un peu).
Les servers produisent du carbone, on pollue moins avec le serverless.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<h1 id="récapitulatif---dotjs-2019">Récapitulatif - dotJS 2019</h1>
<p>J&rsquo;ai eu la chance d&rsquo;assister à dotJS cette année grâce à des places qui ont été offertes par les dotConferences à la communauté <!-- raw HTML omitted -->Ladies of Code<!-- raw HTML omitted -->.</p>
<p><!-- raw HTML omitted -->@Jawache<!-- raw HTML omitted --> a pris la parole sur notre impact environnemental en tant que développeur. L&rsquo;électricité est responsable à 30% des émissions de CO2. On ne peut se permettre d&rsquo;en gaspiller.
Google Cloud serait un cloud Carbone neutral (ça m&rsquo;étonne un peu).
Les servers produisent du carbone, on pollue moins avec le serverless.</p>
<p>Le serverless présente aussi des avantages économiques</p>
<ul>
<li>Autoscaling</li>
<li>On paie selon la durée et la consommation mémoire des fonctions que l&rsquo;on exécute.</li>
</ul>
<pre tabindex="0"><code>Nitr.ooo fireship.io = gcp functions nest.js
</code></pre><p>Si le sujet vous intéresse, consulter climateaction.tech pour s&rsquo;impliquer plus.</p>
<hr>
<p><!-- raw HTML omitted -->@devdevcharlie<!-- raw HTML omitted --> nous a montré les possibilités de recognition de sounds en exploitant la WebAudio API en javascript et le Machine Learning (avec TensorFlow). La WebAudio API récupère les données du microphone.</p>
<p>Sa démo présente un spectrogramme (la photo d&rsquo;un son). Plus le son est fort, plus la couleur sur l&rsquo;amplitude du spectrogramme est lumineuse.</p>
<p>Gather data from WEBAUDIOAPI and transforme it for tensorflow. Multidimensionnel array with labels for pattern recognition. La démo est accessible <!-- raw HTML omitted -->ici<!-- raw HTML omitted -->, et c&rsquo;est plutôt impressionnant : acoustic-ml.netlify.com</p>
<hr>
<p><!-- raw HTML omitted -->BertBelder<!-- raw HTML omitted --> nous a présenté Deno, un runtime for JavaScript and Typesvript (webassembly) qui vise à résoudre les soucis que Node pose. Il utilise V8, Rust, Tokio (event.loop), TypeScript.</p>
<p>Node a un système de modules complexes, exposé aux failles et il existe un tas de tooling parallèle là où Deno a une API web et un tooling intégré.</p>
<hr>
<p>Quelques talks qui m&rsquo;ont été recommandés en discutant durant les breaks: <!-- raw HTML omitted -->Universe in a single arrow<!-- raw HTML omitted --> et <!-- raw HTML omitted -->Mother of all demos<!-- raw HTML omitted --> (la première démonstration d&rsquo;une souris, d&rsquo;un clavier pour les amateurs d&rsquo;images d&rsquo;archive).</p>
<hr>
<p>@stefanjudis a donné un lightning talk super sur les expressions régulières. <!-- raw HTML omitted -->Les slides sont claires<!-- raw HTML omitted -->, je vous recommande de les checker, une bonne piqûre de rappel pour les humains nuls en regexp comme moi ^_^</p>
<pre tabindex="0"><code>?: Omit captions group
?&lt;rest&gt; capture group
\p{Emoji} capture emoji 
</code></pre><hr>
<p><!-- raw HTML omitted -->Vlad Filippov<!-- raw HTML omitted --> a donné un talk sur <!-- raw HTML omitted -->WebAssembly<!-- raw HTML omitted --> (wasm).
C&rsquo;est un nouveau language bas niveau, similaire à l&rsquo;assembleur, conçu pour compléter des applications web javascript. On peut charger des modules WebAssembly dans des applications Javascript : certaines bibliothèques l&rsquo;utilisent déjà comme pica.</p>
<p>L&rsquo;objectif est d&rsquo;améliorer les performances. Attention cependant aux cas d&rsquo;application: il faut toujours benchmarker les gains et être vigilant sur la taille du module WASP.</p>
<p>WebAssembly.studio</p>
<hr>
<p><!-- raw HTML omitted -->Vladimir Agafonkin<!-- raw HTML omitted --> (créateur de Leaflet) a donné un talk sur l&rsquo;optimisation d&rsquo;algorithmes.</p>
<p>Il a présenté le cas d&rsquo;une bibliothèque Delaunay qui a subi plusieurs optimisations sur des modules npm. ( delaunay-fast // faster-delaunay // delaunator étant le plus rapide)</p>
<p>Étapes pour optimiser un algorithme:</p>
<ul>
<li>Trouver le bottleneck (parties les plus longues) grâce à des outils de profiling (on sous-utilise celui de Chrome).</li>
<li>Le code lent est du code pas nécessaire</li>
<li>Être vigilant sur les complexités, faire varier le code selon les tailles d&rsquo;input.</li>
</ul>
<pre tabindex="0"><code>O(n) loop 
O(n2) o(n3) boucles imbriquées
</code></pre><p>Attention aux fonctions natives Javascript (Array.indexOf, etc.) qui ont aussi leur propre complexité (assez grosse).</p>
<p>accidentallyquadratic.tumblr.com</p>
<p>Memory complexity _ allocate Much memory than we need
Ces fonctions : <code>slice concat Map filter split</code> utilisent plus de  mémoire que nécessaire.</p>
<p>O.log(n) best complexity.
Binary search.</p>
<p>Astuce d&rsquo;optimisation: Trier les données en entrer pour processer les données plus rapidement. En faire plus au début (tri) pour en faire moins après.</p>
<p>HashTable -&gt; Array peut faire gagner en performance.</p>
<ol>
<li>Learn how things work under the wood ! Surtout dans les fonctions JS par défaut qu&rsquo;on a  l&rsquo;habitude d&rsquo;utiliser.</li>
<li>Tout peut être amélioré !</li>
</ol>
<hr>
<p><!-- raw HTML omitted -->James Long<!-- raw HTML omitted -->, créateur de Prettier, a donné un talk sur la synchronisation des données sur des applications distribuées.</p>
<p>Il y a parlé de la complexité de la synchronisation d&rsquo;applications hors-ligne et notamment la garance de la consistance des données.</p>
<p>Un point critique est l&rsquo;ordre de réception des données: utiliser un timestamp pour réordonner les datas (Vector clock, Hybrid logical clock).
Un timestamp existe par device et est généré / assigné à un changement émis.</p>
<p>Il faut trouver des solutions les plus simples possible pour garantir la fiabilité dans un système distribué.</p>
<p>Les slides sont disponibles <!-- raw HTML omitted -->par ici<!-- raw HTML omitted -->.</p>
<hr>
<p><!-- raw HTML omitted -->@nodebotanist<!-- raw HTML omitted --> nous a joué un son de guitare connecté à une application Node qui changeait la couleur d&rsquo;une LED branchée à sa guitare. Le tout réalisé avec des bibliothèques npm suivantes: midi tonal color ws (websocket).</p>
<p>@nodebotanist a aussi mis au défit les recruteurs présents de recruter quelqu&rsquo;un de différent d&rsquo;eux.</p>
<hr>
<p>@maggiepint a présenté la nouvelle librairie Temporal qui vise à résoudre les soucis actuels de Date en Javascript. (Months index from 0, Mutability, Timezone gaps, No date only représentation).</p>
<hr>
<p><!-- raw HTML omitted -->Daniel Ehrenberg<!-- raw HTML omitted --> a ensuite présenté TC39, une communauté de développeurs qui améliorent Javascript et comment nous pouvons les aider.</p>
<p>tc39.es</p>
<pre tabindex="0"><code># is the new _ for strong encapsulation.
</code></pre><p>J&rsquo;ai passé deux jours très enrichissants et plein de découvertes / belles rencontres. J&rsquo;espère pouvoir renouveler l&rsquo;expérience l&rsquo;an prochain ! :)</p>
]]></content>
        </item>
        
        <item>
            <title>Une journée à dotJS (Jour Frontend 1)</title>
            <link>/fr/posts/2019/12/une-journ%C3%A9e-%C3%A0-dotjs-jour-frontend-1/</link>
            <pubDate>Sun, 08 Dec 2019 19:23:42 +0000</pubDate>
            
            <guid>/fr/posts/2019/12/une-journ%C3%A9e-%C3%A0-dotjs-jour-frontend-1/</guid>
            <description>&lt;h1 id=&#34;récapitulatif---dotjs-2019&#34;&gt;Récapitulatif - dotJS 2019&lt;/h1&gt;
&lt;p&gt;J&amp;rsquo;ai eu la chance d&amp;rsquo;assister à dotJS cette année grâce à des places qui ont été offertes par les dotConferences à la communauté &lt;!-- raw HTML omitted --&gt;Ladies of Code&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;En discutant avec quelques personnes, j&amp;rsquo;y ai appris l&amp;rsquo;existence d&amp;rsquo;un framework Node.js, &lt;!-- raw HTML omitted --&gt;Nest.js&lt;!-- raw HTML omitted --&gt; qui permettrait d&amp;rsquo;avoir une application plus structurée qu&amp;rsquo;une app Node classique qui n&amp;rsquo;utiliserait qu&amp;rsquo;Express pour le routing.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<h1 id="récapitulatif---dotjs-2019">Récapitulatif - dotJS 2019</h1>
<p>J&rsquo;ai eu la chance d&rsquo;assister à dotJS cette année grâce à des places qui ont été offertes par les dotConferences à la communauté <!-- raw HTML omitted -->Ladies of Code<!-- raw HTML omitted -->.</p>
<p>En discutant avec quelques personnes, j&rsquo;y ai appris l&rsquo;existence d&rsquo;un framework Node.js, <!-- raw HTML omitted -->Nest.js<!-- raw HTML omitted --> qui permettrait d&rsquo;avoir une application plus structurée qu&rsquo;une app Node classique qui n&rsquo;utiliserait qu&rsquo;Express pour le routing.</p>
<p><!-- raw HTML omitted -->Eduardo San Martin Morote<!-- raw HTML omitted --> a donné un talk plutôt sympa intitulé Modern Front-end Routing. Il y a décortiqué l&rsquo;API History en évoquant la complexité entre les différents navigateurs (UrlSearchParams notamment mal supporté par IE et Safari). Les navigateurs encodent les caractères spéciaux dans une URL différement et leur récupération via les API disponibles en JS en est affectée. L&rsquo;encodage des URLs est donc recommandé (même si ce n&rsquo;est pas &ldquo;joli&rdquo;).</p>
<pre tabindex="0"><code>EncodeURI //path and hash
DecodeURI //Path and hash
EncodeURIComponent //Query keys only
</code></pre><p>Ses slides sont disponibles <!-- raw HTML omitted -->ici<!-- raw HTML omitted -->.</p>
<p>S&rsquo;en est suivi un talk &ldquo;Complexity in Simplicity&rdquo; chouette donné par <!-- raw HTML omitted -->Sara Viera<!-- raw HTML omitted --> où j&rsquo;y ai appris des fun-facts tels que:</p>
<ul>
<li>les placeholders ne sont pas traduits automatiquement par le navigateur</li>
<li>les placeholders ne sont pas lu par les technologies VoiceOver, d&rsquo;où l&rsquo;utilité des labels</li>
<li>On peut récupérer le language du navigateur via un objet <code>navigator.language</code></li>
</ul>
<p>Ses slides sont très claires et <!-- raw HTML omitted -->par ici<!-- raw HTML omitted -->. Une phrase choc de ce talk :</p>
<blockquote>
<p>Your pretty code won&rsquo;t make your users come back</p>
</blockquote>
<p>Côté lightning talks, il y a eu:</p>
<ul>
<li>une présentation dense mais qui donnait envie de <!-- raw HTML omitted -->Breeze<!-- raw HTML omitted --> un ORM pour applications Javascript.</li>
<li>une présentation de Svelte.js comparé à React et Vue.</li>
<li>une bibliothèque de test côté front, <!-- raw HTML omitted -->DOM Testing Library<!-- raw HTML omitted --></li>
</ul>
<p>Ce dernier talk était particulièrement intéressant et m&rsquo;a donné envie d&rsquo;y jeter un oeil. Il y a possibilité de simuler le click sur un component en appelant <code>FireEvent.click()</code>. <!-- raw HTML omitted -->Adria Fontcuberta<!-- raw HTML omitted --> donnait également le conseil d&rsquo;écrire des tests qui ressemblent le plus possible à ton application pour éviter les Faux positifs.</p>
<p>On a eu un talk de <!-- raw HTML omitted -->Jana Beck<!-- raw HTML omitted --> sur la visualisation de données côté browser en utilisant Web Workers et Offscreen canvas.</p>
<p>Quelqu&rsquo;un (oui, je n&rsquo;ai pas noté son nom -_-&rsquo;) a présenté le compilateur javascript <!-- raw HTML omitted -->Stencil<!-- raw HTML omitted -->. Le truc plutôt cool: il génère un graphe de dépendances, les bundles sont optimisés selon les liens entre les components, ce qui optimise les appels HTTP.</p>
<p><!-- raw HTML omitted -->Igor Minar<!-- raw HTML omitted --> a expliqué comment ils géraient les montées de version d&rsquo;Angular. La mise en place de dépréciations en amont a aidé les utilisateurs à migrer plus facilement. Il conseille d&rsquo;allouer un vrai budget pour les updates réguliers et d&rsquo;automatiser les updates mineurs en utilisant des outils comme Dependabot. Il a montré un retour d&rsquo;expérience de KLM qui prend de moins en moins de temps à migrer son application Angular (30jours sur les premières versions d&rsquo;Angular contre 1 journée sur les versions récentes).</p>
<p>Il y a eu une présentation trop cool de qui a montré une application full serverless. Il a utilisé Evently (static site generator), FaunaDB en base de données et les fonctions Netlify, webtask.io : register crons online. Sa présentation est ici: <a href="https://findthat.at/servered">https://findthat.at/servered</a></p>
<p>Sur la dernière présentation, Evan You a présenté un comparatif de la construction de components entre Svelte, Vue et React, faisant un parallèle entre les hooks (React) et Vue Composition API.</p>
<p>C&rsquo;est ce que j&rsquo;ai retenu de cette première journée ! Plein d&rsquo;enseignements, j&rsquo;ai bien apprécié aussi le jour 2, dont le compte rendu arrive bientôt également :)</p>
]]></content>
        </item>
        
        <item>
            <title>Un après-midi à dotCSS</title>
            <link>/fr/posts/2019/12/un-apr%C3%A8s-midi-%C3%A0-dotcss/</link>
            <pubDate>Sat, 07 Dec 2019 19:23:42 +0000</pubDate>
            
            <guid>/fr/posts/2019/12/un-apr%C3%A8s-midi-%C3%A0-dotcss/</guid>
            <description>&lt;h1 id=&#34;récapitulatif---dotcss-2019&#34;&gt;Récapitulatif - dotCSS 2019&lt;/h1&gt;
&lt;p&gt;J&amp;rsquo;ai eu la chance d&amp;rsquo;assister à dotCSS cette année grâce à des places qui ont été offertes par les dotConferences à la communauté &lt;!-- raw HTML omitted --&gt;Ladies of Code&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;La conférence a commencé très fort avec une conférence de Sarah Dayan, ingénieure chez Algolia. Elle y a introduit le concept d&amp;rsquo;utility-first CSS CSS est plus efficace lorsqu&amp;rsquo;on utilise comme une bibliothèque en raison des dépendances entre le HTML et le CSS. Un composant ne sera pas réutilisable dans sa globalité, autant factoriser de plus petits éléments (typographie similaire, ou icône).
Le CSS est plus petit à parser par le navigateur puisqu&amp;rsquo;à un seul niveau de profondeur, plus rapide à resolve.
Elle y fait une démonstration &lt;!-- raw HTML omitted --&gt;d&amp;rsquo;un outil qu&amp;rsquo;elle a crée pour la factorisation des classes redondantes&lt;!-- raw HTML omitted --&gt; entre éléments du DOM grâce à Brotli (algorithme de compression). Le benchmark de performance est impressionnant.
Sa présentation est accessible &lt;!-- raw HTML omitted --&gt;ici&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<h1 id="récapitulatif---dotcss-2019">Récapitulatif - dotCSS 2019</h1>
<p>J&rsquo;ai eu la chance d&rsquo;assister à dotCSS cette année grâce à des places qui ont été offertes par les dotConferences à la communauté <!-- raw HTML omitted -->Ladies of Code<!-- raw HTML omitted -->.</p>
<p>La conférence a commencé très fort avec une conférence de Sarah Dayan, ingénieure chez Algolia. Elle y a introduit le concept d&rsquo;utility-first CSS CSS est plus efficace lorsqu&rsquo;on utilise comme une bibliothèque en raison des dépendances entre le HTML et le CSS. Un composant ne sera pas réutilisable dans sa globalité, autant factoriser de plus petits éléments (typographie similaire, ou icône).
Le CSS est plus petit à parser par le navigateur puisqu&rsquo;à un seul niveau de profondeur, plus rapide à resolve.
Elle y fait une démonstration <!-- raw HTML omitted -->d&rsquo;un outil qu&rsquo;elle a crée pour la factorisation des classes redondantes<!-- raw HTML omitted --> entre éléments du DOM grâce à Brotli (algorithme de compression). Le benchmark de performance est impressionnant.
Sa présentation est accessible <!-- raw HTML omitted -->ici<!-- raw HTML omitted -->.</p>
<p>S&rsquo;en est suivi des présentations autour de l&rsquo;accessibilité et l&rsquo;importance de réfléchir avant de défaire un comportement natif du navigateur.</p>
<pre tabindex="0"><code>:focus {
    outline: none;
}

div {
    display: contents; // pouvoir être lu par le VoiceOver
}
</code></pre><p>Ces propriétés peuvent être utiles dans un contexte d&rsquo;accessibilité où l&rsquo;utilisateur est contraint d&rsquo;utiliser un clavier pour sa navigation ou un système de voice-over. Il est possible de créer des règles spécifiques pour les utilisateurs qui ne peuvent pas voir d&rsquo;animations pour des raisons d&rsquo;handicap: prefered-reduced-motion à ajouter dans une media query séparée.</p>
<pre tabindex="0"><code class="language- " data-lang=" ">Transition: all 600ms // not working on Chrome.
</code></pre><p>J&rsquo;y ai appris l&rsquo;existence du site <a href="http://www.testmycss.com/">http://www.testmycss.com/</a> pour l&rsquo;analyse et l&rsquo;optimisation d&rsquo;un fichier CSS.</p>
<p>Jérémie Patonnier nous a raconté <!-- raw HTML omitted -->la belle histoire d&rsquo;amitié entre SVG et CSS<!-- raw HTML omitted --> et m&rsquo;a donné envie de jouer un peu plus avec ces deux là :)</p>
<p><!-- raw HTML omitted -->@emplums<!-- raw HTML omitted --> a présenté <!-- raw HTML omitted -->PrimerComponents<!-- raw HTML omitted -->, une bibliothèque de components React qui implémentent le design system de Github.</p>
<p>Durant un lightning talk (je n&rsquo;ai pas noté le nom de la personne malheuresuement), j&rsquo;ai appris qu&rsquo;il était possible de runner du JS dans du CSS ! 😱 (je prendrai un peu de temps pour fouiller sur Twitter et updater cet article avec son incroyable codepen!)</p>
<p>Jason Pamental a parlé <!-- raw HTML omitted -->typographie<!-- raw HTML omitted --> et a présenté le concept des custom properties et variables fonts. J&rsquo;ai aussi découvert dans ce talk qu&rsquo;il était possible de target le dark-mode en CSS encore via&hellip; une media query ! (Moi qui pensais bêtement qu&rsquo;on ne pouvait mettre que des tailles de device dans ces petites choses !). Ses slides sont <!-- raw HTML omitted -->par ici<!-- raw HTML omitted -->.</p>
<p>Pour finir, Ires nous a plongé dans l&rsquo;état actuel et futur de CSS (spoiler alert: on est déjà dans le futur!). J&rsquo;y ai découvert Houdini, un set d&rsquo;API qui exposent une partie de l&rsquo;engine CSS. Je creuserai définitivement <!-- raw HTML omitted -->la doc MDN à ce sujet<!-- raw HTML omitted -->.</p>
<p>Elle nous a expliqué le concept des <!-- raw HTML omitted -->Features Queries en CSS<!-- raw HTML omitted --> sous-utilisées à son goût, qu&rsquo;il vaut mieux utiliser positivement que négativement (et mettre le fallback dans le body par défaut). Elle nous a rappelé de tirer profit du rôle &ldquo;cascade&rdquo; de CSS, de tirer profit des préférences utilisateur pour une meilleure accessibilité (color scheme // animations // adapt data consumption preferences).</p>
<p>Elle nous a aussi parlé d&rsquo;un futur où il faudra considérer plus de pays et des problématiques d&rsquo;inclusivité plus diverses pour le web: les concepts d&rsquo;internationalisation seront à prendre en compte. Un <code>margin-left</code> n&rsquo;aura pas le même sens pour un européen habitué à lire de gauche à droite et de haut en bas que pour une personne asiatique ou arabe. Les problématiques de données seront aussi. Je vous recommande vraiment de revoir son talk qui était très agréable à écouter.</p>
<p>C&rsquo;est tout pour moi ! C&rsquo;était top, j&rsquo;y retournerai définitvement l&rsquo;an prochain si j&rsquo;en ai l&rsquo;opportunité :)</p>
]]></content>
        </item>
        
        <item>
            <title>Symfony Live - Jour 2</title>
            <link>/fr/posts/2019/03/symfony-live-jour-2/</link>
            <pubDate>Fri, 29 Mar 2019 19:23:42 +0000</pubDate>
            
            <guid>/fr/posts/2019/03/symfony-live-jour-2/</guid>
            <description>&lt;h1 id=&#34;récapitulatif---symfonylive-2019-jour-2&#34;&gt;Récapitulatif - SymfonyLive 2019 Jour 2&lt;/h1&gt;
&lt;p&gt;Mais qu&amp;rsquo;est-ce que je retrouve ? Des notes que j&amp;rsquo;avais prises en mars 2019 lors de la Symfony Live à Paris !&lt;/p&gt;
&lt;p&gt;NDLR: Elles sont un peu en vrac.&lt;/p&gt;
&lt;h1 id=&#34;talk-1-open-source---renouveau-de-lhumanisme&#34;&gt;Talk #1: Open Source - Renouveau de l&amp;rsquo;humanisme&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Principe anthropique = Tout est orienté pour faire apparaître la vie organique.&lt;/li&gt;
&lt;li&gt;Interdépendance entre chaque membre d&amp;rsquo;une communauté = ubuntu&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Ubuntu&amp;rdquo; = I am because we are.&lt;/li&gt;
&lt;li&gt;Symfony Diversity Initiative&lt;/li&gt;
&lt;li&gt;Communauté Drupal =&amp;gt; Clash lié à la diversité.&lt;/li&gt;
&lt;li&gt;L&amp;rsquo;inclusivité ne s&amp;rsquo;arrête pas à l&amp;rsquo;égalité F-H.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;talk-2--passion-doctrine&#34;&gt;Talk #2 : Passion Doctrine&lt;/h1&gt;
&lt;p&gt;Derrière le Query Builder, Doctrine prépare un statement.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<h1 id="récapitulatif---symfonylive-2019-jour-2">Récapitulatif - SymfonyLive 2019 Jour 2</h1>
<p>Mais qu&rsquo;est-ce que je retrouve ? Des notes que j&rsquo;avais prises en mars 2019 lors de la Symfony Live à Paris !</p>
<p>NDLR: Elles sont un peu en vrac.</p>
<h1 id="talk-1-open-source---renouveau-de-lhumanisme">Talk #1: Open Source - Renouveau de l&rsquo;humanisme</h1>
<ul>
<li>Principe anthropique = Tout est orienté pour faire apparaître la vie organique.</li>
<li>Interdépendance entre chaque membre d&rsquo;une communauté = ubuntu</li>
<li>&ldquo;Ubuntu&rdquo; = I am because we are.</li>
<li>Symfony Diversity Initiative</li>
<li>Communauté Drupal =&gt; Clash lié à la diversité.</li>
<li>L&rsquo;inclusivité ne s&rsquo;arrête pas à l&rsquo;égalité F-H.</li>
</ul>
<h1 id="talk-2--passion-doctrine">Talk #2 : Passion Doctrine</h1>
<p>Derrière le Query Builder, Doctrine prépare un statement.</p>
<p>Doctrine construit un objet a partir de la BDD: hydratation. Changer l&rsquo;hydratation pour les performances. L&rsquo;hydratation en object surtout avec des objets associés est très lourde.</p>
<h2 id="changer-le-mode-dhydrataion">Changer le mode d&rsquo;hydrataion</h2>
<p>HYDRATE_SIMPLEOBJECT =&gt; warning avec getters.</p>
<h2 id="partial-object">Partial object.</h2>
<p>Il faut se souvenir des champs que l&rsquo;on récupère pour
éviter des NPE.</p>
<h2 id="partial-references">Partial references</h2>
<p>Récupérer une entité que pour son ID: <code>$entityManager-&gt;getPartialReference</code></p>
<p>orphanRemoval =&gt; Un article est associé à un blog et ne peut exister sans blog.</p>
<p>Dans la mesure du possible, Doctrine propose du lazy loading : proxy ou une PersistentCollection à la place des entités jointes.</p>
<ul>
<li>Les proxies supportent mal la sérialisation.</li>
<li>Utiliser les criteria dans le getter de l&rsquo;entité.</li>
<li>Utiliser les filtres</li>
</ul>
<h2 id="organiser-ses-repositories">Organiser ses repositories</h2>
<ul>
<li>Factoriser les clauses where appelées régulièrement.</li>
<li>Ou faire un builder de QueryBuilder</li>
</ul>
<h2 id="lifecycle-callbacks">Lifecycle callbacks</h2>
<ul>
<li>Implémenter les Entity Listener</li>
<li>On a pas besoin de persist() par défaut. Possibilité de changer ça via la trackingPolicy</li>
</ul>
<h2 id="optimiser-la-trackingpolicy-pour-les-perfs">Optimiser la trackingPolicy pour les perfs</h2>
<ul>
<li>Deferred Explicit (utilise moins de ressources mais attention aux cascades)
<ul>
<li>Les annotations ne suffisent pas.</li>
</ul>
</li>
<li>Notify : le plus optimisé mais lourd à mettre en place</li>
<li>On ne peut pas faire de flush depuis un listener Doctrine</li>
</ul>
<h2 id="mappings">Mappings</h2>
<h3 id="embeddable">Embeddable</h3>
<p>Annotation \Embeddable pour embarquer directement une classe dans une entité. DQL on peut directement faire un join dans la classe
MappedSuperclass : déconseillé. Si pas d&rsquo;héritage, utiliser les Traits.</p>
<h3 id="caches">Caches</h3>
<ul>
<li>**metadata_cache_driver (cache annotations) + query_cache_driver (cache DQL) à activer en prod ** !</li>
<li>result_cache_driver: apcu (optionnel et manuel)</li>
<li>second=level cache</li>
</ul>
<p>steevanb/DoctrineStatsBundle =&gt; bundle sympa pour débugguer + optimiser les performances de page.</p>
<p>Slides à venir sur le twitter de @romaricdrigon Présentation hyper complète, on adore.</p>
<h1 id="talk-3--api-platform">Talk #3 : API Platform</h1>
<p>Twitter @gheb_dev</p>
<ul>
<li>Annotation @APIResource : CRUD complet disponible + doc swagger.</li>
<li>mercure=true / messenger=true option dans l&rsquo;annotation APIResource
<ul>
<li>plutôt que de l&rsquo;envoyer en BDD, APIPlatform va intercepter la ressource et l&rsquo;envoyer sur AMQP ou al.</li>
</ul>
</li>
</ul>
<h1 id="talk-4--symfony-http-client">Talk #4 : Symfony HTTP Client</h1>
<p>@nicolasgrekas
Package standalone. Implémente PSR-18. Utilisable même sur des projets hors Symfo.</p>
<ul>
<li>Faire des requêtes facilement</li>
<li>Remplace GuzzleHttp\Client</li>
</ul>
<p>Découplage du composant. Il consomme une abstraction (HTTPClientInterface).
Stateless (autowired) service.</p>
<p>Bearer / JSON payload peut être passé dans les options de la requête (3ème arg).</p>
<p>Form parameters (form_params sur guzzle) peut directement être passé dans le body de la requête.</p>
<h2 id="options-de-client-request">Options de $client-&gt;request</h2>
<ul>
<li>proxy - get through an http proxy</li>
<li>on_progress - afficher une progress bar / interrompre une requête</li>
<li>base_uri - construire une URL absolue</li>
<li>resolve - bypasser résolution DNS : empêcher d&rsquo;appeler des endpoints internes</li>
<li>max_redirects - désactiver ou limiter les redirections</li>
</ul>
<p>FailSafe par défaut : si on recoit un statut code 3/4/5xx ça jette une exception (désactivable mais pas cool)</p>
<p>Streameable downloads sur une réponse.</p>
<p>Les Responses sont lazy et les requêtes sont concurrentes.
<code>$response-&gt;getStatusCode()</code>
On attend pas que la totalité de la réponse arrive pour retourner la réponse. On attend juste les headers.</p>
<p>Sur les chunks, il existe une méthode <code>isLast</code> pour détecter que c&rsquo;est le dernier du stream.</p>
<p><code>$response-&gt;getInfo('user_data')</code></p>
<ul>
<li>Avoir des infos sur ce qui s&rsquo;est passé au niveau de la réponse.</li>
<li>Recopie une valeur passée au moment de la request.</li>
</ul>
<p>379 requêtes en 0,4s (utilise curl sous HTTP2) sur l&rsquo;ex de la demo.</p>
<p>Fait pour HTTP/2 PUSH.</p>
<h2 id="component-consommateur">Component consommateur</h2>
<p>NativeHttpClient utilise fopen, CurlHttpClient basé sur curl.</p>
<ul>
<li>Beaucoup d&rsquo;infos sur les temps passés dans la requête</li>
</ul>
<p>NativeHttpClient est la plus portable. Bloquant jusqu&rsquo;à ce que les réponses de header arrivent.</p>
<p>CurlHttpClient utilise ext-curl. Gère le multiplexing au niveau des entêtes et du body. 0 latence. La quasi totalité des options curl sont couvertes par l&rsquo;abstraction à la différence de Guzzle où on peut forcer les options #notclean</p>
<h2 id="décorateurs">Décorateurs</h2>
<ul>
<li>MockHttpClient - Pour les tests, ne fait pas de requête</li>
<li>CachingHttpClient - Headers Cache Controls gérés
(cf: slides)</li>
</ul>
<h1 id="talk-5-react-admin---admin-generator-dapi-platform">Talk #5: React-admin - Admin Generator d&rsquo;API Platform</h1>
<p>@francoisz
marmelab/react-admin</p>
<p>Conseils pratiques: Comment se mettre au développement front quand on est dev Symfo ?</p>
<p><code>&lt;HydraAdmin entrypoint=&quot;api&quot;&gt;&lt;/HydraAdmin&gt;</code></p>
<ul>
<li>Ejecter l&rsquo;AdminBuilder et utiliser le composant natif de react-admin : Admin
<ul>
<li>Avoir la main sur son admin.</li>
</ul>
</li>
<li>Éviter les entités embeddées</li>
</ul>
<p>Annotation @Group pour préciser les colonnes qu&rsquo;on veut récupérer côté admin.</p>
<p>Onglet Redux sur Chrome ! (Comme Vue)</p>
<p>react-admin communique avec l&rsquo;API au travers du data provider.</p>
<p>Évaluer la variable d&rsquo;environnement dans l&rsquo;objet window :</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>window.<span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">edit</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Immutable Web Apps
</span></span></span></code></pre></div><p>Récupérer aussi les slides, y avait une alternative intéressante UI pour ouvrir un panel.</p>
<h1 id="talk-6-rabbit-mq">Talk #6: Rabbit MQ</h1>
<p>Déclarer les messages persistants si on veut qu&rsquo;ils restent dans la queue au redémarrage.</p>
<p>Par défaut, rabbitMQ cnsomme trois messages.
Reject / NACK : Possibilité complémentaire: rejeter les  messages dans prefecth, tout repart dans la queue. Oublier reject.</p>
<p>On publie un message dans un exchange (point de diffusion d&rsquo;un message). La queue se binde dans l&rsquo;exchange. Sans queue, pas de message.</p>
<p>On publie le message avec une routing key unique. Chaque queue peut s&rsquo;abonner à différences keys.</p>
<ul>
<li>&ldquo;topic&rdquo; permet d&rsquo;avoir des wildcards dans les binding keys auquelles s&rsquo;abonner.</li>
<li>&ldquo;direct&rdquo; routing key doit être identique à la binding key.</li>
<li>&ldquo;headers&rdquo; message porte l&rsquo;information de routing</li>
<li>&ldquo;fanout&rdquo; on distribue tout à n&rsquo;importe qui.</li>
</ul>
<p>Dead Letter Exchange : Récupérer les messages en erreur et les envoyer sur un exchange sur lequel une queue pourra être bindée.
Un TTL peut être défini pour envoyer le message en DLX.</p>
<p>conposer require messenger</p>
<p>NotifyMessageHandler qui implèmente MessageHandlerInterface. Prend un MessageBusInterface et peut envoyer un message à Rabbit.</p>
<p>composer require amqp-pack : possibilité de configurer un transport avec son DSN.</p>
<h1 id="talk-7--tdd-symfo-et-ses-amis">Talk #7 : TDD Symfo et ses amis</h1>
<p>Slides accessibles ici: <a href="https://bit.ly/real-world-tdd">https://bit.ly/real-world-tdd</a></p>
<p>Cycle :</p>
<ul>
<li>Failing Test</li>
<li>Make test pass</li>
<li>Refactor</li>
</ul>
<p>Codeception ?</p>
<ul>
<li>DTOs = Data Transfer Objects</li>
</ul>
<h2 id="test-driven-repositories">Test-Driven Repositories</h2>
<ul>
<li>Unit Test: ORM branché sur une base de donnée en mémoire (ex: SQLite)</li>
<li>Manuellement: Branché sur MySQL</li>
</ul>
<p>migration:diff -&gt; compare les schémas et crée les migrations nécessaires pour mettre le schéma de la BDD à jour.</p>
<p><a href="https://bit.ly/tdd-vids">https://bit.ly/tdd-vids</a></p>
<p>Brancher Doctrine :</p>
<ul>
<li>config_test.yml &lt;&ndash; Utilisé par PHPUnit</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">doctrine</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">dbal</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">driver</span>: <span style="color:#ae81ff">pdo_sqlite </span>
</span></span></code></pre></div>]]></content>
        </item>
        
        <item>
            <title>Symfony Live - Jour 1</title>
            <link>/fr/posts/2019/03/symfony-live-jour-1/</link>
            <pubDate>Thu, 28 Mar 2019 19:23:42 +0000</pubDate>
            
            <guid>/fr/posts/2019/03/symfony-live-jour-1/</guid>
            <description>&lt;h1 id=&#34;récapitulatif---symfonylive-2019-jour-1&#34;&gt;Récapitulatif - SymfonyLive 2019 Jour 1&lt;/h1&gt;
&lt;p&gt;Mais qu&amp;rsquo;est-ce que je retrouve ? Des notes que j&amp;rsquo;avais prises en mars 2019 lors de la Symfony Live à Paris !&lt;/p&gt;
&lt;p&gt;NDLR: Elles sont un peu en vrac.&lt;/p&gt;
&lt;h1 id=&#34;keynote&#34;&gt;Keynote&lt;/h1&gt;
&lt;p&gt;Symfony Mime &amp;gt; Swift_Mailer&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Moins d’objets à serializer&lt;/li&gt;
&lt;li&gt;Headers pas determines a l’avance&lt;/li&gt;
&lt;li&gt;intégration native avec twig, embarque l’objet email : méthode template / textTemplate / htmlTemplate à utiliser.&lt;/li&gt;
&lt;li&gt;Inky pour simplifier templating&lt;/li&gt;
&lt;li&gt;séparation envoi et création&lt;/li&gt;
&lt;li&gt;Symfony mailer juste pour mails transactionnels&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;http : body déjà construit, api: il le construit par le provider&lt;/p&gt;</description>
            <content type="html"><![CDATA[<h1 id="récapitulatif---symfonylive-2019-jour-1">Récapitulatif - SymfonyLive 2019 Jour 1</h1>
<p>Mais qu&rsquo;est-ce que je retrouve ? Des notes que j&rsquo;avais prises en mars 2019 lors de la Symfony Live à Paris !</p>
<p>NDLR: Elles sont un peu en vrac.</p>
<h1 id="keynote">Keynote</h1>
<p>Symfony Mime &gt; Swift_Mailer</p>
<ul>
<li>Moins d’objets à serializer</li>
<li>Headers pas determines a l’avance</li>
<li>intégration native avec twig, embarque l’objet email : méthode template / textTemplate / htmlTemplate à utiliser.</li>
<li>Inky pour simplifier templating</li>
<li>séparation envoi et création</li>
<li>Symfony mailer juste pour mails transactionnels</li>
</ul>
<blockquote>
<blockquote>
<p>http : body déjà construit, api: il le construit par le provider</p>
</blockquote>
</blockquote>
<p>Security.symfony.com : On peut y uploader composer.lock pour checker les failles de sécurité</p>
<h1 id="symfo--react">Symfo / React</h1>
<p>insights.symfony.com</p>
<ul>
<li>Mutations induites par changement sur l’UI.</li>
<li>Mutations complexes à reproduire appliquer DEBUG.</li>
<li>Dispatcher &gt; Store &gt; view
React rerenders view when data changes &raquo; slow.</li>
<li>La fonction render fabrique un arbre de composants correspondant à la représentation de la vue.</li>
</ul>
<p>Webpack encore</p>
<h1 id="symfo--vuejs-les-tilleuls-coop">Symfo / Vue.js (Les Tilleuls Coop)</h1>
<p>Approche Rich client ==&gt; API driven.
joind.in =&gt; noter conférences.
symfonycon.les-tilleuls.coop</p>
<blockquote>
<p>bin/console make:entity pour générer des entités CLI</p>
</blockquote>
<p>Côté server: hypermedia API / Client-side: web components JS.
Recette dispo sous Symfo 4 pour API Platform. Code dispo sur Github.</p>
<p>BrowserKit &gt; simuler des scénarios de navigation sur browser (PHP)</p>
<p>Symfony Panther =&gt; test end to end. Quelques méthodes intéressantes &gt; attendre qu’un élément apparaisse sur la page. Rien à configurer officiellement.</p>
<p>Fixtures</p>
<blockquote>
<p>composer req alice.
Implémenter ReloadDatabaseTrait &raquo; Reload les fixtures avant chaque test. Plus besoin du script pour lancer les fixtures. (Panther vs Behat ?).
Fait des screenshots aussi.</p>
</blockquote>
<p>mercure.rocks &gt; Hub maintient les connexions persistantes. (intéressant pour les notifs)</p>
<p>Annotation Mercure true sur API Platform pour broadcaster derrière une info au hub.</p>
<h1 id="elasticsearch--symfo">Elasticsearch + Symfo</h1>
<p>Pas de données critiques sur Elasticsearch.
Noeud : Instance d’ElasticSearch qui tourne. Création d’index dans le cluster.
Elastica =&gt; Bibliothèque recommandée pour manipuler ElasticSearch.</p>
<p>noyaml.com yawl anchor
dynamic false pour ne pas laisser elasticsearch deviner le type de la donnée à indexer</p>
<p>Indexer le minimum de données, juste le nécessaire à la recherche.</p>
<h2 id="accélérer-indexation">Accélérer indexation</h2>
<p>Côté PHP:</p>
<ul>
<li>Faire des traitements par bulk</li>
<li>Black fire pour tracer</li>
<li>Utiliser un serializer rapide (Jane?)</li>
<li>Doctrine iterate.</li>
</ul>
<p>Côté elasticsearch:</p>
<ul>
<li>refresh_interval à augmenter + désactiver les replicas.</li>
<li>optimiser le temps passé sur le réseau côté infra (node es qui communique avec frontal php, node communique avec es clusters)</li>
</ul>
<h2 id="pertinence-des-résultats-">Pertinence des résultats :</h2>
<ul>
<li>?explain=true pour avoir une explication du score de la recherche donné par elasticsearch.</li>
</ul>
<h2 id="sql-avec-elasticsearch">SQL avec ElasticSearch:</h2>
<p>POST /_sql
{query: &ldquo;select * from table&rdquo; }</p>
<p>Kibana = PHPStorm d&rsquo;ES.</p>
<h1 id="http3-bjacquemont">HTTP/3 @bjacquemont</h1>
<p>HTTP/2 = 2015
HTTP/2 = 2018</p>
<p>TCP
Client -&gt; Syn
Serv -&gt; Syn Ack
Client -&gt; Ack
Client -&gt; Requête</p>
<p>TCP Handshake =&gt; Latency.</p>
<p>Latence : on se heurte à des limites physiques (vitesse de la lumière).
3 important time limits in UX :</p>
<ul>
<li>0.1s: instantaneous feeling limit</li>
<li>1s flow of thought limit</li>
<li>10s user attention limit</li>
</ul>
<blockquote>
<p>ennemi of UX.</p>
</blockquote>
<p>HTTP2: Multiplexer les requêtes au sein d’une connexion HTTP</p>
<p>TCP + TLS (8 étapes) + TLS =&gt; 90% du temps de latence est passé dans l’établissement de la connexion.
TCP ne connaît pas TLS. TCP établit connexion mais n’est pas au courant de sa sécurisation.
QUIC : Protocole de transport remplaçant TCP basé sur UDP.
Qui Handshake
Initiator : Quickness’s hello -&gt; Quickness’s token -&gt; quickness’s hello + token: en trois étapes, on génère une connexion fiabilité et chiffrée avec moins de latence que TCP / TLS.</p>
<p>Quic va devoir implémenter les fonctions manquantes perte de paquets réémission + réordonnancement de paquets : navigateur / serveur</p>
<p>Couplage fort entre TCP et réseau internet : si un casse, l’autre se casse aussi. (déconnexion quand on change de réseau).</p>
<p>Réduction de la latence, migration de réseau possible sur QUIC (couplage faible).
HTTP2 : Possibilité de faire plusieurs requêtes en parallèle. Connectivité mauvaise (métro) :  streams can fail easily.
QUIC a conscience des streams HTTP. Possibilité d’utiliser les données qui sont arrivées en attendant le reste.
Streams QUIC sont indépendants les uns des autres même si on est dans la même connexion QUIC.</p>
<p>HTTP3 = HTTP2 basé sur QUIC. Sémantics ne changent pas. HTTP/3 is a drop in replacement for HTTP/2 : préparations pour HTTP/2 seront valides.</p>
<p>Firewall configuration: Firewall usually opened only for TCP for 80 and 443.</p>
<p>Maturité de QUIC : Lancé en 2013 par Google, enbled sur Chromium. Standardisation en cours via l’IETF. Sortie officielle cette année ou 2020.</p>
<p>Cloudflare support QUIC. Varnish: WIP. Pas de module Nginx / Apache.</p>
<p>daniel.haxx.se/blog/tag/auic</p>
<h1 id="images-sous-symfo">Images sous Symfo</h1>
<p>DPR : Device Pixel Ratio. mydevice.io pour voir les dimensions physiques + leur device pixel ratio.
width et height dans balise img pour réserver l’espace dans le layout.</p>
<p>Navigateur selon la qualité du réseau va  pouvoir changer sa source d’images.</p>
<p>Chargement des pages:</p>
<ul>
<li>Navigateur charge le DOM</li>
<li>Le parse</li>
<li>Lance les requêtes pour loader les assets externes.</li>
</ul>
<p>Au parsing du DOM, le navigateur connait le DRP de l’appareil, les dimensions du viewport et la qualité du réseau.</p>
<p><a href="https://responsivebreakpoints.com">https://responsivebreakpoints.com</a> génère breakpoints d’images.</p>
<p>github.com/clavetage/daltons : Utilitaire CLI pour générer des breakpoints d’image à partir de données analytics</p>
<p>attribut srcset + sizes pour indiquer au navigateur la largeur de la balise img.
L’ordre des sources dans secret n’a pas d’importance. L’ordre des medias queries dans l’attribut sizes a une importance (premier saisi premier interprété). Le premier attribut media utilisé est vérifié.</p>
<p>Glide + LiipImagineBundle (gère pas la sécurité) - Symfony pour la génération d’images.</p>
<h1 id="du-développement-à-la-prod--une-architecture-grandissante">Du développement à la prod : une architecture grandissante</h1>
<p>Accès au site = File d’attente
Vitesse de chargement des pages = Traitement du service</p>
<p>Optimisation des requêtes / processus PHP / nb dépendances / poids images js html css / optimisation des redirections ==&gt; Effet Papillon</p>
<p>DevOps Lifecycle Mesh.</p>
<p>Fastly = version CDN de Varnish.
Ajout de layers : serveurs de cache HTTP (Varnish), cache de persistence de données (Redis Memcached).</p>
<p>etag : hash correspondant à la ressource, être sûr de son unicité.</p>
<p>Varnish : Fichier de configuration (vcl) ou on peut rajouter du C.Requête HTTP arrive sur le vcl_receive (vcl_recv).
varnish stat pour monitorer ( CACHE HIT : Nombre d’objets en cache dans la mémoire Varnish doit être supérieure au CACHE MISS).
Varnish Log  : varnishlog -g request -q « RespStatus &gt;= 500 »</p>
<p>Cache de persistence - Redis</p>
<ul>
<li>Mécanisme de réplication simple ( master / slave pour backup )</li>
<li>Réplication avec Sentinels (Service à installer en même temps que Redis. Ces Sentinels vont dialoguer ensemble pour élire un nouveau master en cas de fail)</li>
<li>Redis Cluster (réplication fournie par Redis directement)</li>
</ul>
<p>Galera Cluster
Système de réplication BDD.
Règles: Plus de 50% de noeuds pour maintenir les opérations. Galera a besoin de 3 serveurs minimum pour fonctionner. Chaque noeud doit valider la requête pour qu’elle soit exécutée.</p>
<h2 id="bundles-intéressant-pour-le-cache">Bundles intéressant pour le cache:</h2>
<p>Fos HTTP Cache Bundle.
UserContext : Faire varier le bloc de cache selon l’user. Droits utilisateur sous forme de chaîne de caractère : tous les users ayant les mêmes droits voient les mêmes données cachées. Cache désactivable sur une page dans le YAML.
Symfony Cache Component (PSR6 PSR16)</p>
<h1 id="bundles-et-outils-pour-applis-symfo">Bundles et outils pour applis Symfo</h1>
<p>PHP CS Fixer
FriendsOfPHP/PHP-CS-Fixer  &gt; correction automatique
phpmd/phpmd
phpstan/phpstan</p>
<p>Hooks locaux / Hooks distants</p>
<p>GrumPHP &gt; tasks : on active les outils de qualité dont on a besoin.</p>
<p>fabbot.io &gt; validation service for GitHub pull requests</p>
<p>Outils de qualité
Symfony Insights
alice-bundle == doctrine-fixtures-bundle</p>
<p>Documentation d’une API REST : BelmioApiDocBundle documentation au format OpenAPI.
guzzle/guzzle : consommer des web services facilement. Couche d’abstraction pour les requêtes Http.
Http Client: symfony/http-client : experimental feature</p>
<p>Sécuriser API :</p>
<ul>
<li>Json Web Token lexie : authentification par jeton JWT.</li>
<li>OAuth hwi/HWIOAuthBundle.</li>
</ul>
<p>DoctrineExtension : Via des annotations, faire du tri, softdelete.</p>
<p>FOSEslasticaBundle (ElasticSearch)
algolia/search-bundle
Glide : HTTP based image manipulation.</p>
<p>Composant Messenger à la place de AMQP ?</p>
<p>Monolog =&gt; Possibilité d’envoyer des alertes sur Slack. Envoi aux serveurs spécifiques. Affichage dans les consoles navigateur.</p>
<p>Sentry -&gt; Real time crash reporting sentry/sentry-symfony : la payload est renseignée / navigateur du user.</p>
<p>Critères de sélection: packagist (nombre de downloads, contributeurs, stars, date du dernier commit).</p>
<p>Single Responsibility
Open Closed
Liskov Substitution
Interface Segregation
Dependency Inversion</p>
<p>Packages Principles
Les classes sont nécessaires mais insuffisantes pour organiser un système. Utiliser les packages.</p>
<p>Package principes
Principe de cohésion (granularité) + principe de couplage (stabilité / dépendance).</p>
<p>Abstract Syntax Tree : Analyseurs de code utilisent cette représentation pour détecter les erreurs.</p>
<p>SymfonyChecker =&gt; façon d’analyser dynamiquement le code pour supprimer les traductions inutilisées, tout est local.</p>
<p>symfony =&gt; binaire en Go installable en local</p>
]]></content>
        </item>
        
        <item>
            <title>Setup terminal macOSX</title>
            <link>/fr/posts/2018/10/setup-terminal-macosx/</link>
            <pubDate>Tue, 02 Oct 2018 19:23:42 +0000</pubDate>
            
            <guid>/fr/posts/2018/10/setup-terminal-macosx/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Juste un petit article pour mémoriser le setup de mon terminal sur mon ordi perso sous Mac OSX.&lt;/p&gt;
&lt;h2 id=&#34;terminal&#34;&gt;Terminal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.iterm2.com/downloads.html&#34;&gt;Télécharger iTerm2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/ayuth/iterm2-zsh-oh-my-zsh-the-most-power-full-of-terminal-on-macos-bdb2823fb04c&#34;&gt;Configurer zsh et oh-my-zsh avec iTerm2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;alias-de-commandes-git&#34;&gt;Alias de commandes Git&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://dev.to/robertcoopercode/using-aliases-to-speed-up-your-git-workflow-2f5a?utm_source=digest_mailer&amp;utm_medium=email&amp;utm_campaign=digest_email&#34;&gt;Alias pour Git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tools-chouettes&#34;&gt;Tools chouettes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/notwaldorf/tiny-care-terminal&#34;&gt;Tiny Care Terminal (merci Younes pour la découverte !)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Juste un petit article pour mémoriser le setup de mon terminal sur mon ordi perso sous Mac OSX.</p>
<h2 id="terminal">Terminal</h2>
<ul>
<li><a href="https://www.iterm2.com/downloads.html">Télécharger iTerm2</a></li>
<li><a href="https://medium.com/ayuth/iterm2-zsh-oh-my-zsh-the-most-power-full-of-terminal-on-macos-bdb2823fb04c">Configurer zsh et oh-my-zsh avec iTerm2</a></li>
</ul>
<h2 id="alias-de-commandes-git">Alias de commandes Git</h2>
<ul>
<li><a href="https://dev.to/robertcoopercode/using-aliases-to-speed-up-your-git-workflow-2f5a?utm_source=digest_mailer&utm_medium=email&utm_campaign=digest_email">Alias pour Git</a></li>
</ul>
<h2 id="tools-chouettes">Tools chouettes</h2>
<ul>
<li><a href="https://github.com/notwaldorf/tiny-care-terminal">Tiny Care Terminal (merci Younes pour la découverte !)</a></li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>Débuter avec Mongo DB</title>
            <link>/fr/posts/2016/11/d%C3%A9buter-avec-mongo-db/</link>
            <pubDate>Thu, 10 Nov 2016 09:01:20 +0000</pubDate>
            
            <guid>/fr/posts/2016/11/d%C3%A9buter-avec-mongo-db/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;démarrer-mongo&#34;&gt;Démarrer Mongo&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mongod&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;démarrer-mongo-sans-les-journaux&#34;&gt;Démarrer Mongo sans les journaux&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mongod --nojournal&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Peut être pratique si vous n’avez pas beaucoup d’espace sur votre ordi.&lt;/p&gt;
&lt;h2 id=&#34;se-connecter-en-shell-à-mongo&#34;&gt;Se connecter en Shell à Mongo&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;mongo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id=&#34;créer-unebase-de-données&#34;&gt;Créer une base de données&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;use &amp;lt;nom_de_la_base_de_données&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Il faut y enregistrer au moins un document pour que la base de données soit vraiment sauvegardée.&lt;/p&gt;
&lt;h2 id=&#34;créer-un-utilisateur&#34;&gt;Créer un utilisateur&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-db.createUser(&#34; data-lang=&#34;db.createUser(&#34;&gt;{
  user: &amp;#34;fashion&amp;#34;,
  pwd: &amp;#34;fashion&amp;#34;,
  roles: [ &amp;#34;readWrite&amp;#34;, &amp;#34;dbAdmin&amp;#34; ]
});
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;voir-le-contenu-drsquoune-collection&#34;&gt;Voir le contenu d’une collection&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;db.nom_collection.find();&lt;/code&gt;&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<h2 id="démarrer-mongo">Démarrer Mongo</h2>
<p><code>mongod</code></p>
<h2 id="démarrer-mongo-sans-les-journaux">Démarrer Mongo sans les journaux</h2>
<p><code>mongod --nojournal</code></p>
<p>Peut être pratique si vous n’avez pas beaucoup d’espace sur votre ordi.</p>
<h2 id="se-connecter-en-shell-à-mongo">Se connecter en Shell à Mongo</h2>
<p><code>mongo</code></p>
<p> </p>
<h2 id="créer-unebase-de-données">Créer une base de données</h2>
<p><code>use &lt;nom_de_la_base_de_données&gt;</code></p>
<p>Il faut y enregistrer au moins un document pour que la base de données soit vraiment sauvegardée.</p>
<h2 id="créer-un-utilisateur">Créer un utilisateur</h2>
<pre tabindex="0"><code class="language-db.createUser(" data-lang="db.createUser(">{
  user: &#34;fashion&#34;,
  pwd: &#34;fashion&#34;,
  roles: [ &#34;readWrite&#34;, &#34;dbAdmin&#34; ]
});
</code></pre><h2 id="voir-le-contenu-drsquoune-collection">Voir le contenu d’une collection</h2>
<p><code>db.nom_collection.find();</code></p>
<p>Une collection Mongo s’apparente à une table MySQL et un document Mongo s’apparente à l’entrée d’une table MySQL.</p>
<p>show all content collection: http://stackoverflow.com/questions/24985684/mongodb-show-all-contents-from-all-collections</p>
]]></content>
        </item>
        
        <item>
            <title>Débuter avec Sails</title>
            <link>/fr/posts/2016/05/d%C3%A9buter-avec-sails/</link>
            <pubDate>Sun, 08 May 2016 19:38:05 +0000</pubDate>
            
            <guid>/fr/posts/2016/05/d%C3%A9buter-avec-sails/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Après mon HackDay sur Node.js, j’ai eu quelques inquiétudes sur mes aptitudes à rapidement faire n’importe quoi au niveau de la structure de mon application.&lt;/p&gt;
&lt;p&gt;Je me suis donc mise à la recherche d’un framework sympa qui pourrait m’aider à mieux structurer mon application Node.js : après une petite recherche, je suis tombée sur Sails et Meteor (qui fera aussi l’objet d’un HackDayz !).&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Après mon HackDay sur Node.js, j’ai eu quelques inquiétudes sur mes aptitudes à rapidement faire n’importe quoi au niveau de la structure de mon application.</p>
<p>Je me suis donc mise à la recherche d’un framework sympa qui pourrait m’aider à mieux structurer mon application Node.js : après une petite recherche, je suis tombée sur Sails et Meteor (qui fera aussi l’objet d’un HackDayz !).</p>
<p>Voici mon petit retour de ces quelques heures de bachotages.</p>
<h2 id="facile-à-appréhender">Facile à appréhender</h2>
<p>Pour les habitués de framework MVC, Sails nous permet de nous y retrouver facilement avec son architecture bien rodée. Les routes se créent simplement à partir du fichier config/routes.js</p>
<p>Le framework utilise Express que j’avais déjà appréhendé lors de mon premier tutoriel Node.js</p>
<p>On peut demander à une route dans ce fichier de retourner directement un template ou de passer par un contrôleur qui lui rendra le template.</p>
<p>Des commandes permettent de générer directement les fichiers contrôleurs / modèles (ça m’a rappelé de bons souvenirs de Ruby ça).</p>
<!-- raw HTML omitted -->
<p>Il est aussi possible de générer un modèle séparement et définir les données qu’il contient.</p>
<p>On démarre ensuite l’application avec un sails lift. Et on savoure le beau ASCII art de début \o/</p>
<p>Un petit aperçu de ce que j’ai pu produire de ce HackDay : <a href="https://github.com/leiluspocus/shredder">une petite application qui permet de partager des messages secrets</a>. Je la pousserai prochainement sur Heroku 🙂</p>
<h2 id="deploy-friendly">Deploy friendly</h2>
<p>Le framework vient avec un système bien pratique pour gérer différents environnements (dev, staging, prod par exemple). Il suffit de définir les variables qui changent selon l’environnement dans le dossier</p>
<p><code>config/env/</code></p>
<h2 id="quelques-liens-sympas">Quelques liens sympas</h2>
<p><a href="http://sailsjs.org/documentation/concepts/services/creating-a-service">Documentation Sails</a></p>
<p><a href="http://stackoverflow.com/questions/16205028/deploying-a-sails-js-app-to-heroku">Comment déployer une app Sails sur Heroku</a></p>
]]></content>
        </item>
        
        <item>
            <title>Débuter avec Node.js</title>
            <link>/fr/posts/2016/01/d%C3%A9buter-avec-node.js/</link>
            <pubDate>Sun, 10 Jan 2016 16:46:02 +0000</pubDate>
            
            <guid>/fr/posts/2016/01/d%C3%A9buter-avec-node.js/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’ai profité de cet après-midi pluvieux pour me familiariser avec Node.js grâce à &lt;a href=&#34;https://openclassrooms.com/courses/des-applications-ultra-rapides-avec-node-js&#34;&gt;l’excellent cours de Mathieu Nebra sur Open Classrooms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce que je retiens de ces quelques heures de bachotage (pas encore poussé mon application) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Javascript qui s’exécute côté serveur&lt;/li&gt;
&lt;li&gt;Force du language: la gestion d’événements côté serveur et sa rapidité&lt;/li&gt;
&lt;li&gt;NPM est un outil puissant pour la gestion des dépendances&lt;/li&gt;
&lt;li&gt;Nécessite une bonne connaissance de Javascript (Closures, callbacks, prototypes).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;quelques-outils-donnés-sur-le-tutoriel-bien-pratiques&#34;&gt;Quelques outils donnés sur le tutoriel bien pratiques&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://browsenpm.org/package.json&#34;&gt;http://browsenpm.org/package.json&lt;/a&gt;
Récapitulatif des attributs que l’on peut préciser dans son fichier de dépendances&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>J’ai profité de cet après-midi pluvieux pour me familiariser avec Node.js grâce à <a href="https://openclassrooms.com/courses/des-applications-ultra-rapides-avec-node-js">l’excellent cours de Mathieu Nebra sur Open Classrooms</a>.</p>
<p>Ce que je retiens de ces quelques heures de bachotage (pas encore poussé mon application) :</p>
<ul>
<li>Javascript qui s’exécute côté serveur</li>
<li>Force du language: la gestion d’événements côté serveur et sa rapidité</li>
<li>NPM est un outil puissant pour la gestion des dépendances</li>
<li>Nécessite une bonne connaissance de Javascript (Closures, callbacks, prototypes).</li>
</ul>
<h2 id="quelques-outils-donnés-sur-le-tutoriel-bien-pratiques">Quelques outils donnés sur le tutoriel bien pratiques</h2>
<ul>
<li>
<p><a href="http://browsenpm.org/package.json">http://browsenpm.org/package.json</a>
Récapitulatif des attributs que l’on peut préciser dans son fichier de dépendances</p>
</li>
<li>
<p><a href="https://github.com/nodejs/node-v0.x-archive/wiki/modules#templating">https://github.com/nodejs/node-v0.x-archive/wiki/modules#templating</a>
Modules utilisables pour le templating. J’ai retenu juste l’exemple de EJS donné dans le cours qui est compatible avec Express, framework Node.js</p>
</li>
<li>
<p><a href="https://nodejs.org/api/http.html#http">https://nodejs.org/api/http.html#http</a>_event_close</p>
</li>
</ul>
<p>Documentation des objets utilisables dans le core de Node.js</p>
<h2 id="bonnes-pratiques-de-développement-sous-nodejs">Bonnes pratiques de développement sous Node.js</h2>
<ul>
<li><a href="https://devcenter.heroku.com/articles/node-best-practices">https://devcenter.heroku.com/articles/node-best-practices</a></li>
<li><a href="https://blog.heroku.com/archives/2015/11/10/node-habits-2016">https://blog.heroku.com/archives/2015/11/10/node-habits-2016</a></li>
</ul>
<h2 id="mongodb-x-nodejs">MongoDB x Node.js</h2>
<ul>
<li><a href="http://mongodb.github.io/node-mongodb-native/2.0/overview/quickstart/">http://mongodb.github.io/node-mongodb-native/2.0/overview/quickstart/</a></li>
<li><a href="https://docs.mongodb.org/getting-started/node/insert/">https://docs.mongodb.org/getting-started/node/insert/</a></li>
</ul>
<h2 id="quelques-commandes-de-base">Quelques commandes de base</h2>
<p>Installer un module (l’option –save permet de rajouter le module en dépendance dans le fichier package.json)</p>
<p><code>npm install nom_du_module --save</code></p>
<p>Gestion des versions de Node</p>
<pre tabindex="0"><code># Module n permet de gérer plus facilement le switch vers telle ou telle version de Node
sudo npm install n -g

# Se mettre sur la dernière version la plus stable de Node
sudo n stable
</code></pre><h2 id="ce-que-jrsquoai-réalisé-en-nodejs">Ce que j’ai réalisé en Node.js</h2>
<p>Ma première application Node.js peut-être consultée ici: <a href="https://fierce-wildwood-39907.herokuapp.com/">https://fierce-wildwood-39907.herokuapp.com/</a></p>
<p>Le repository associé se trouve ici: https://github.com/leiluspocus/greenie</p>
]]></content>
        </item>
        
        <item>
            <title>Préparer une entrevue technique</title>
            <link>/fr/posts/2015/07/pr%C3%A9parer-une-entrevue-technique/</link>
            <pubDate>Sat, 18 Jul 2015 16:56:07 +0000</pubDate>
            
            <guid>/fr/posts/2015/07/pr%C3%A9parer-une-entrevue-technique/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Préparer une entrevue technique nécessite un peu de bachotage ! Voici quelques liens que je trouve intéressants pour mieux se préparer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.quora.com/What-are-the-most-important-questions-to-ask-a-full-stack-developer-during-an-interview-for-a-startup&#34;&gt;https://www.quora.com/What-are-the-most-important-questions-to-ask-a-full-stack-developer-during-an-interview-for-a-startup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/indy256/Full-stack-Developer-Interview-Questions-and-Answers&#34;&gt;Questions réponses pour une entrevue de développeur Full-Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.toptal.com/web/interview-questions&#34;&gt;https://www.toptal.com/web/interview-questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour des entrevues dans des entreprises prestigieuses (Facebook, Google, Apple), le livre &lt;a href=&#34;https://www.amazon.fr/Cracking-Coding-Interview-6th-Programming/dp/0984782850&#34;&gt;Cracking the Coding interview&lt;/a&gt; m’a chaudement été recommandé … 👀&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Préparer une entrevue technique nécessite un peu de bachotage ! Voici quelques liens que je trouve intéressants pour mieux se préparer :</p>
<ul>
<li><a href="https://www.quora.com/What-are-the-most-important-questions-to-ask-a-full-stack-developer-during-an-interview-for-a-startup">https://www.quora.com/What-are-the-most-important-questions-to-ask-a-full-stack-developer-during-an-interview-for-a-startup</a></li>
<li><a href="https://github.com/indy256/Full-stack-Developer-Interview-Questions-and-Answers">Questions réponses pour une entrevue de développeur Full-Stack</a></li>
<li><a href="https://www.toptal.com/web/interview-questions">https://www.toptal.com/web/interview-questions</a></li>
</ul>
<p>Pour des entrevues dans des entreprises prestigieuses (Facebook, Google, Apple), le livre <a href="https://www.amazon.fr/Cracking-Coding-Interview-6th-Programming/dp/0984782850">Cracking the Coding interview</a> m’a chaudement été recommandé … 👀</p>
]]></content>
        </item>
        
        <item>
            <title>GoodUI Recevoir de bonnes pratiques de création d&#39;UI deux fois par mois</title>
            <link>/fr/posts/2015/06/goodui-recevoir-de-bonnes-pratiques-de-cr%C3%A9ation-dui-deux-fois-par-mois/</link>
            <pubDate>Mon, 29 Jun 2015 23:32:46 +0000</pubDate>
            
            <guid>/fr/posts/2015/06/goodui-recevoir-de-bonnes-pratiques-de-cr%C3%A9ation-dui-deux-fois-par-mois/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Careful&lt;/em&gt; You&amp;rsquo;re reading an old article ! Some links might be broken and content may be outdated&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je ne m’inscris généralement pas aux infolettres mais celle-ci est particulièrement intéressante! GoodUi propose une infolettre envoyée deux fois par mois.  Son auteur, Jakub Linowski, parle d’optimisation d’interface utilisateur, la meilleure façon de concevoir des formulaires de type opt-out … Je ne regrette pas de m’y être inscrite !&lt;/p&gt;
&lt;p&gt;Petit bémol qui peut en fruster certains: l’infolettre est en anglais !&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Careful</em> You&rsquo;re reading an old article ! Some links might be broken and content may be outdated</p>
</blockquote>
<p>Je ne m’inscris généralement pas aux infolettres mais celle-ci est particulièrement intéressante! GoodUi propose une infolettre envoyée deux fois par mois.  Son auteur, Jakub Linowski, parle d’optimisation d’interface utilisateur, la meilleure façon de concevoir des formulaires de type opt-out … Je ne regrette pas de m’y être inscrite !</p>
<p>Petit bémol qui peut en fruster certains: l’infolettre est en anglais !</p>
<p>Inscrivez-vous <a href="http://goodui.org/">ici</a></p>
]]></content>
        </item>
        
        <item>
            <title>Config Sublime Text 2</title>
            <link>/fr/posts/2014/12/config-sublime-text-2/</link>
            <pubDate>Thu, 18 Dec 2014 16:15:51 +0000</pubDate>
            
            <guid>/fr/posts/2014/12/config-sublime-text-2/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;comment-installer-des-packages-dans-sublime-text-2-&#34;&gt;Comment installer des packages dans Sublime Text 2 ?&lt;/h4&gt;
&lt;p&gt;Il faut utiliser le package control. Plus de détails ici: &lt;a href=&#34;https://www.granneman.com/webdev/editors/sublime-text/packages/how-to-install-and-use-package-control/&#34;&gt;https://www.granneman.com/webdev/editors/sublime-text/packages/how-to-install-and-use-package-control/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voici les packages que j’utilise dans ma configuration Sublime Text 2, très utiles pour des projets front.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;installed_packages&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Alignment&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;BracketHighlighter&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Emmet&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTML5&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LESS&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sass&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SideBarEnhancements&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SublimeLinter&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SublimeLinter-contrib-scss-lint&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SublimeLinter-csslint&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SublimeLinter-gjslint&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SublimeLinter-phplint&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SublimeLinter-xmllint&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<h4 id="comment-installer-des-packages-dans-sublime-text-2-">Comment installer des packages dans Sublime Text 2 ?</h4>
<p>Il faut utiliser le package control. Plus de détails ici: <a href="https://www.granneman.com/webdev/editors/sublime-text/packages/how-to-install-and-use-package-control/">https://www.granneman.com/webdev/editors/sublime-text/packages/how-to-install-and-use-package-control/</a></p>
<p>Voici les packages que j’utilise dans ma configuration Sublime Text 2, très utiles pour des projets front.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span> <span style="color:#e6db74">&#34;installed_packages&#34;</span><span style="color:#960050;background-color:#1e0010">:</span>
</span></span><span style="display:flex;"><span>  [
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Alignment&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;BracketHighlighter&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Emmet&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;HTML5&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;LESS&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Sass&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SideBarEnhancements&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SublimeLinter&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SublimeLinter-contrib-scss-lint&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SublimeLinter-csslint&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SublimeLinter-gjslint&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SublimeLinter-phplint&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;SublimeLinter-xmllint&#34;</span>
</span></span><span style="display:flex;"><span>  ]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">}</span>
</span></span></code></pre></div>]]></content>
        </item>
        
        <item>
            <title>4 astuces pour réaliser et réussir son test d&#39;utilisabilité</title>
            <link>/fr/posts/2014/06/4-astuces-pour-r%C3%A9aliser-et-r%C3%A9ussir-son-test-dutilisabilit%C3%A9/</link>
            <pubDate>Thu, 26 Jun 2014 23:40:17 +0000</pubDate>
            
            <guid>/fr/posts/2014/06/4-astuces-pour-r%C3%A9aliser-et-r%C3%A9ussir-son-test-dutilisabilit%C3%A9/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il n’y a pas que le code qui se teste, une interface utilisateur aussi !&lt;/p&gt;
&lt;p&gt;Dans le cadre de ma maîtrise en commerce électronique, j’ai été amenée à réaliser des tests d’utilisabilité sur un site Internet. L’expérience est vraiment fascinante car on réalise à quel point notre vision de développeur / stratège web est biaisée par rapport aux individus « normaux ».&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Il n’y a pas que le code qui se teste, une interface utilisateur aussi !</p>
<p>Dans le cadre de ma maîtrise en commerce électronique, j’ai été amenée à réaliser des tests d’utilisabilité sur un site Internet. L’expérience est vraiment fascinante car on réalise à quel point notre vision de développeur / stratège web est biaisée par rapport aux individus « normaux ».</p>
<p>Cet article a pour but de vous présenter les tests d’utilisabilité et de faire un petit retour d’expérience avec les erreurs que j’ai pu commettre.</p>
<p>Un test d’utilisabilité consiste à comprendre comment un utilisateur perçoit un site Internet et de lister ainsi les erreurs de son interface. Une personne (le modérateur) observe le comportement de l’utilisateur sur le site, et peut être accompagné éventuellement d’une équipe plus large qui observera en retrait (idéalement, dans une salle de focus groupe)</p>
<p>Le participant réalisera donc différentes tâches et à la fin de chacune de ces tâches, une verbalisation se fera avec le modérateur. Il est préférable pour le participant de verbaliser à voix haute pendant sa réalisation de la tâche mais certains n’y arrivent pas donc il est inutile de trop forcer le participant. Le plus important est en effet qu’il se sente à l’aise et de recréer une expérience « comme à la maison ».</p>
<p>Nous utilisions Tobii Studio, un système d’oculométrie mais ce matériel coûte extrêmement cher. L’essentiel est d’enregistrer l’expérience de navigation de l’utilisateur sur le site. On peut utiliser des outils d’enregistrement d’écran ou encore cet outil que j’ai découvert aujourd’hui Inspectlet (<a href="http://www.inspectlet.com/">http://www.inspectlet.com/</a>) qui enregistre les sessions sur un site et crée des heatmaps.</p>
<p>Le test se prépare en plusieurs étapes</p>
<h2 id="planification-du-test">Planification du test</h2>
<p>Cette étape consistera à planifier les scénarios qui seront à réaliser par les participants. On va notamment écrire des guides d’entrevue qui vont permettre au modérateur de ne manquer aucun détail sur le scénario à réaliser ou la présentation du test:</p>
<p>Un premier script qui va consister à présenter le test au participant (la confidentialité de sa participation, le fait qu’il doit suivre ses habitudes de navigation…)</p>
<p>Personnellement, je ne lisais pas ces scripts car je n’étais pas à l’aise de ne pas regarder le participant dans les yeux pendant que je parlais. Je m’assurais juste de n’avoir manqué aucun point important du script après avoir parlé.</p>
<h2 id="aller-chercher-des-participants">Aller chercher des participants</h2>
<p>Les participants ne devront pas être choisis au hasard et devront correspondre à la cible du site testé. Nous avions réussi à obtenir une dizaine de participants pour notre test, on peut en récupérer même moins selon le degré d’implication du participant. On a constaté que beaucoup de choses se répétaient parmi nos répondants, il y a un stade où on ne peut récolter plus d’informations que celle dont on dispose déjà.</p>
<p>Un incitatif peut faciliter leur déplacement (argent, nourriture gratuite, échantillons … Soyez inventifs! 😛 ) mais n’invitez le participant que s’il est un minimum intéressé: un participant peu motivé fournira des résultats inexploitables.</p>
<h2 id="réaliser-les-tests">Réaliser les tests</h2>
<p>Nos tests se faisaient au laboratoire de focus groupe de la faculté d’administration de la faculté de Sherbrooke. Nous disposions d’un oculomètre qui suivait les mouvements des pupilles des participants. Le fait d’être observé peut biaiser les résultats: l’idéal est de recréer les conditions de navigation habituelles de l’internaute (lors de la présentation du test, nous insistions sur l’aspect « comme à la maison »).</p>
<p>Il est difficile de recréer les conditions « comme à la maison »: c’est pourquoi nous insistions là-dessus pendant la présentation du test. Si on voyait pendant le test que le participant ne jouait pas assez le jeu (réalisation de la tâche de manière anormalement rapide), nous posions la question durant la verbalisation « Auriez-vous fait ça chez vous? ». Cela permet de récolter de l’information manquante.</p>
<p>Pour éviter d’avoir des résultats trop biaisés, il est recommandé de garder toujours le même modérateur.</p>
<p>N’effectuez pas de tests trop long sous peine de fatiguer votre participant et d’ainsi diminuer la qualité des commentaires qu’il vous donne.</p>
<p>Je conseille personnellement d’avoir une liste de tâches pour la configuration du matériel, surtout s’il y a beaucoup de choses à faire pour la mise en place du test. Nous avions un oculomètre à configurer et les caméras à démarrer, il nous est déjà arrivé d’oublier de démarrer les enregistrements car nous étions concentré sur autre chose.</p>
<p>Aussi, pensez à vider l’historique entre chaque test, surtout si vous testez des remplissages de formulaire… Cela évitera que le navigateur garde en cache les informations saisies par le participant précédent.</p>
<h2 id="exploiter-les-résultats">Exploiter les résultats</h2>
<p>Une étape longue mais essentielle ! N’oubliez pas de faire des sauvegardes de vos enregistrements, re-visualisez les vidéos pour être sûr de ne manquer aucun commentaire.</p>
<p>En espérant que cet article soit utile, je vous souhaite de bons tests utilisateur! 🙂</p>
]]></content>
        </item>
        
        <item>
            <title>Quelques techniques de design pour émouvoir le visiteur</title>
            <link>/fr/posts/2014/05/quelques-techniques-de-design-pour-%C3%A9mouvoir-le-visiteur/</link>
            <pubDate>Tue, 06 May 2014 23:38:22 +0000</pubDate>
            
            <guid>/fr/posts/2014/05/quelques-techniques-de-design-pour-%C3%A9mouvoir-le-visiteur/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L’influence de l’interface sur les émotions ressenties par les utilisateurs durant leur navigation fait l’objet de nombreuses recherches scientifiques. Par exemple, Éthier et al. (2008) ont démontré qu’un utilisateur pouvait ressentir différentes émotions (telles que la peur, la joie, ou encore la frustation) durant un épisode d’achat sur un site de commerce en ligne.&lt;/p&gt;
&lt;p&gt;L’interface a donc un rôle non négligeable dans l’état émotionnel de l’utilisateur, cet article a pour but de vous présenter certaines techniques qui permettent d’aller chercher des émotions chez l’utilisateur, créant ainsi une expérience utilisateur qui fidélisera vos visiteurs.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>L’influence de l’interface sur les émotions ressenties par les utilisateurs durant leur navigation fait l’objet de nombreuses recherches scientifiques. Par exemple, Éthier et al. (2008) ont démontré qu’un utilisateur pouvait ressentir différentes émotions (telles que la peur, la joie, ou encore la frustation) durant un épisode d’achat sur un site de commerce en ligne.</p>
<p>L’interface a donc un rôle non négligeable dans l’état émotionnel de l’utilisateur, cet article a pour but de vous présenter certaines techniques qui permettent d’aller chercher des émotions chez l’utilisateur, créant ainsi une expérience utilisateur qui fidélisera vos visiteurs.</p>
<p><strong>Se doter d’une personnalité</strong></p>
<p>Mailchimp est un excellent exemple pour ce point: outre l’interface extrêmement « user-friendly » et son design épuré, Mailchimp dispose d’une forte image de marque axée sur l’humour. Une mascotte rigolote, des phrases humoristiques (high five après avoir envoyé une campagne): autant d’atouts qui vont jouer sur la fidélisation de l’utilisateur !</p>
<p>Un site qui se veut plus « sophistiqué » (exemple d’une marque de luxe par exemple) adoptera une approche plus minimaliste au niveau de son design: images larges, peu de contenu textuel et un nombre minimal de couleurs dans la charte graphique.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p> </p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><strong>Les beauty-shots</strong></p>
<p>En mettant en avant une image, choisie judicieusement et à la qualité irréprochable, on va créer un sentiment d’émerveillement chez l’utilisateur.  Cette technique sera particulièrement appréciée pour les sites mettant en avant une personne (artiste, professionnel…). Un bon exemple pour ce cas est le site de <a href="http://juliezhuo.com/">Julie Zhuo</a>, directrice du design chez Facebook, qui met en fond de page une photo d’elle-même haute résolution.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><strong>De (petites) animations</strong></p>
<p>L’idée est de réveiller l’utilisateur dans sa navigation et de ne pas le rendre « inactif » en animant un peu les éléments du site. On ne parle évidemment pas de blinkie  (so 2000!) mais plutôt d’une animation légère qui s’adapterait à l’utilisateur. Cela peut se faire par des carrousels interactifs (avec des boutons « Call-to-Action », voir mon article précédent) ou par des animations légères sur certains éléments du site. <a href="http://latrmouh.org/stromae.net">Stromae</a>, l’artiste belge, le fait très bien sur son site. Des effets parallax auront également une influence positive, en allant chercher l’attention de l’utilisateur.</p>
<p><em>Sources</em></p>
<p>Éthier, Jean, et al. « Interface design and emotions experienced on B2C Web sites: Empirical testing of a research model. » _Computers in Human Behavior _24.6 (2008): 2771-2791.</p>
<p><a href="http://uxmovement.com/content/5-design-techniques-to-incite-user-emotion/">http://uxmovement.com/content/5-design-techniques-to-incite-user-emotion/</a></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Bibliographie UX</title>
            <link>/fr/posts/2014/05/bibliographie-ux/</link>
            <pubDate>Mon, 05 May 2014 23:37:35 +0000</pubDate>
            
            <guid>/fr/posts/2014/05/bibliographie-ux/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici une petite bibliographie qui pourrait plaire aux novices qui s’intéressent au domaine de l’user experience. Je l’ai dénichée à partir d’un article de blog qui a recensé toutes les références faites à ces livres, créant le classement suivant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t Make me think by Steve Krug&lt;/li&gt;
&lt;li&gt;About Face by Alan Cooper&lt;/li&gt;
&lt;li&gt;Rocket Surgery Made Easy by Steve Krug&lt;/li&gt;
&lt;li&gt;Designing Interactions by Bill Moggridge&lt;/li&gt;
&lt;li&gt;The Design of Everyday Things by Don Norman&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On m’a déjà parlé du livre de Steve Krug qui semble être un incontournable. Thank you &lt;!-- raw HTML omitted --&gt;Armen Ghazarian&lt;!-- raw HTML omitted --&gt; for this list !&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Voici une petite bibliographie qui pourrait plaire aux novices qui s’intéressent au domaine de l’user experience. Je l’ai dénichée à partir d’un article de blog qui a recensé toutes les références faites à ces livres, créant le classement suivant:</p>
<ul>
<li>Don&rsquo;t Make me think by Steve Krug</li>
<li>About Face by Alan Cooper</li>
<li>Rocket Surgery Made Easy by Steve Krug</li>
<li>Designing Interactions by Bill Moggridge</li>
<li>The Design of Everyday Things by Don Norman</li>
</ul>
<p>On m’a déjà parlé du livre de Steve Krug qui semble être un incontournable. Thank you <!-- raw HTML omitted -->Armen Ghazarian<!-- raw HTML omitted --> for this list !</p>
<h3 id="sources">Sources</h3>
<ul>
<li><a href="http://armenghazarian.com/what-to-read-if-you-decided-to-learn-ux/">http://armenghazarian.com/what-to-read-if-you-decided-to-learn-ux/</a></li>
<li><a href="https://docs.google.com/spreadsheet/ccc?key=0Ai4lrwKRQj2BdElpcDFiNUNYSjRtZFVWMmJvZDdEWkE#gid=0">https://docs.google.com/spreadsheet/ccc?key=0Ai4lrwKRQj2BdElpcDFiNUNYSjRtZFVWMmJvZDdEWkE#gid=0</a></li>
</ul>
]]></content>
        </item>
        
        <item>
            <title>Grille ou liste: quel affichage adopter pour son site de e-commerce ?</title>
            <link>/fr/posts/2014/04/grille-ou-liste-quel-affichage-adopter-pour-son-site-de-e-commerce/</link>
            <pubDate>Tue, 29 Apr 2014 23:36:26 +0000</pubDate>
            
            <guid>/fr/posts/2014/04/grille-ou-liste-quel-affichage-adopter-pour-son-site-de-e-commerce/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous souhaitez vendre des produits en ligne et hésitez sur la manière de présenter vos produits. Trois solutions sont envisageables: grille, liste ou hybride.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grilles&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Quand les utiliser?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Quand l’image du produit est suffisante pour le distinguer d’un autre produit (ex: vêtements).  Certains sites (comme Etam) proposent une vision 360° du produit dès la page catalogue, ce qui permet à l’utilisateur d’avoir un « feeling » du produit avant même d’atteindre la fiche produit détaillée.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Vous souhaitez vendre des produits en ligne et hésitez sur la manière de présenter vos produits. Trois solutions sont envisageables: grille, liste ou hybride.</p>
<p><strong>Grilles</strong></p>
<p><em>Quand les utiliser?</em></p>
<p>Quand l’image du produit est suffisante pour le distinguer d’un autre produit (ex: vêtements).  Certains sites (comme Etam) proposent une vision 360° du produit dès la page catalogue, ce qui permet à l’utilisateur d’avoir un « feeling » du produit avant même d’atteindre la fiche produit détaillée.</p>
<p><em>Avantages / Inconvénients</em></p>
<ul>
<li>Permet d’afficher plus de produits sur une page</li>
<li>Confortable pour l’utilisateur qui n’a pas à lire de texte</li>
<li>Nécessité d’avoir des <strong>images de bonne qualité, fidèle au produit réel</strong></li>
</ul>
<p><em>Exemple :</em></p>
<p><a href="http://www.etam.com/maillots-de-bain/la-collection/les-1-piece.html">Site Internet de Etam</a></p>
<p><strong>Listes</strong></p>
<p><em>Quand les utiliser?</em></p>
<p>Quand le produit a des informations complexes associées, ou qu’il est difficile de distinguer deux produits différents par une image (exemple: meubles de tailles différentes). Il est nécessaire dans ce cas là de faire apparaître l’information à l’utilisateur sous forme textuelle.</p>
<p><em>Avantages / Inconvénients</em></p>
<ul>
<li>Information mise à disposition de l’utilisateur, ce qui le met en confiance et favorise la conversion</li>
<li>Texte à lire parfois rebutant pour les utilisateurs: nécessité d’<strong>aller à l’essentiel</strong> (présentation sous forme de liste…)</li>
</ul>
<p><em>Exemple :</em></p>
<p><a href="http://www.priceminister.com/nav/Jeux-Video-et-Consoles">Priceminister</a> (qui propose à ses utilisateurs de switcher en mode grille) ou encore <a href="http://themeforest.net/category/all">ThemeForest</a> (pour afficher plus de détails sur la structure et compatibilité du template)</p>
<p> </p>
<p>Affichage sous forme liste</p>
<p><strong>Hybride</strong></p>
<p>On adopte un affichage type grille et au survol d’un produit, on affiche plus de détails sur le produit.</p>
<p>Avantages/Inconvénients</p>
<ul>
<li>On conserve les avantages des deux catégories: pouvoir montrer plus de produits tout en affichant un détail sur le produit (s’il est complexe).</li>
<li>Être vigilant sur le temps de chargement de la page (Javascript à ajouter pour la gestion du texte à afficher au survol des images)</li>
</ul>
<p><em>Exemple :</em></p>
<p><a href="http://www.ikea.com/fr/fr/catalog/categories/departments/bathroom/20719/">Ikea</a></p>
<p>Affichage hybride</p>
<p>Source</p>
<p><a href="http://uxmovement.com/navigation/increasing-ecommerce-conversion-rates-category-page/">Increasing eCommerce conversion rates category page</a></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Avoir le bon carrousel pour son site Internet</title>
            <link>/fr/posts/2014/04/avoir-le-bon-carrousel-pour-son-site-internet/</link>
            <pubDate>Tue, 29 Apr 2014 23:35:06 +0000</pubDate>
            
            <guid>/fr/posts/2014/04/avoir-le-bon-carrousel-pour-son-site-internet/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Careful&lt;/em&gt; You&amp;rsquo;re reading an old article ! Some links might be broken and content may be outdated&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les carrousels sont de bons éléments à placer dans une interface  graphique. Ils permettent de mettre en évidence des produits, des promotions et ainsi générer plus de ventes au sein du site.&lt;/p&gt;
&lt;p&gt;Mais quel est le carrousel efficace, qui aura le plus d’impact chez l’utilisateur ?&lt;/p&gt;
&lt;p&gt;Des études ont montré que les flèches des carrousels classiques sont en réalité peu cliquées. Des boutons avec des textes « Call to Action » auront généralement plus d’impact chez l’utilisateur, qui sera intéressé par le lien présenté, et qui aura ainsi tendance à plus interagir avec le slider.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Careful</em> You&rsquo;re reading an old article ! Some links might be broken and content may be outdated</p>
</blockquote>
<p>Les carrousels sont de bons éléments à placer dans une interface  graphique. Ils permettent de mettre en évidence des produits, des promotions et ainsi générer plus de ventes au sein du site.</p>
<p>Mais quel est le carrousel efficace, qui aura le plus d’impact chez l’utilisateur ?</p>
<p>Des études ont montré que les flèches des carrousels classiques sont en réalité peu cliquées. Des boutons avec des textes « Call to Action » auront généralement plus d’impact chez l’utilisateur, qui sera intéressé par le lien présenté, et qui aura ainsi tendance à plus interagir avec le slider.</p>
<!-- raw HTML omitted -->
<h1 id="quelques-points-critiques-sur-un-carrousel">Quelques points critiques sur un carrousel</h1>
<p><strong>Éviter l’auto-sliding et ce, même après qu’un utilisateur ait pris le contrôle</strong></p>
<p>Sûrement le pire point car il peut vraiment irriter l’utilisateur, qui pense avoir le contrôle alors que non. Il est facile de neutraliser ce problème en détectant la position du curseur sur la page.</p>
<p><strong>Accompagner l’utilisateur dans sa visualisation du slider</strong><br>
En affichant notamment la progression (nombre d’éléments sur le slider) en bas d’image</p>
<p><strong>Rendre les boutons assez gros pour être cliqués</strong></p>
<p>Les éventuelles flèches pour passer à l’image suivante, les boutons call-to-action …</p>
<p><strong>Source</strong></p>
<p><a href="http://uxmovement.com/navigation/why-users-arent-clicking-your-home-page-carousel/">Why Users aren’t clicking your homepage carousel</a></p>
<p><a href="http://uxmovement.com/navigation/big-usability-mistakes-designers-make-on-carousels/">Big usability mistakes Designers make on carousels</a></p>
]]></content>
        </item>
        
        <item>
            <title>Quelle est la différence entre les mots UX et UI ?</title>
            <link>/fr/posts/2014/03/quelle-est-la-diff%C3%A9rence-entre-les-mots-ux-et-ui/</link>
            <pubDate>Mon, 10 Mar 2014 23:34:33 +0000</pubDate>
            
            <guid>/fr/posts/2014/03/quelle-est-la-diff%C3%A9rence-entre-les-mots-ux-et-ui/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Quelle est la différence entre les mots UI et UX ? C’est assez simple.&lt;/p&gt;
&lt;p&gt;L’UI (User Interface) désigne l’interface qu’utilise le visiteur, autrement dit, c’est l’ensemble des éléments avec lesquels l’utilisateur va interagir (en cliquant dessus par exemple).&lt;/p&gt;
&lt;p&gt;L’UX (User eXperience) se concentrera plus sur l’expérience de l’utilisateur dans sa globalité: comment interagira-t-il avec l’interface? Comment va-t-il utiliser le logiciel ? L’UX désigne plutôt le processus de navigation / d’utilisation de l’interface par l’utilisateur.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Quelle est la différence entre les mots UI et UX ? C’est assez simple.</p>
<p>L’UI (User Interface) désigne l’interface qu’utilise le visiteur, autrement dit, c’est l’ensemble des éléments avec lesquels l’utilisateur va interagir (en cliquant dessus par exemple).</p>
<p>L’UX (User eXperience) se concentrera plus sur l’expérience de l’utilisateur dans sa globalité: comment interagira-t-il avec l’interface? Comment va-t-il utiliser le logiciel ? L’UX désigne plutôt le processus de navigation / d’utilisation de l’interface par l’utilisateur.</p>
]]></content>
        </item>
        
        <item>
            <title>Les influences de la couleur dans le processus d&#39;achat</title>
            <link>/fr/posts/2014/03/les-influences-de-la-couleur-dans-le-processus-dachat/</link>
            <pubDate>Tue, 04 Mar 2014 23:33:25 +0000</pubDate>
            
            <guid>/fr/posts/2014/03/les-influences-de-la-couleur-dans-le-processus-dachat/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici un &lt;!-- raw HTML omitted --&gt;billet de blog  &lt;!-- raw HTML omitted --&gt;assez intéressant sur les couleurs et leur influence dans le processus d’achat posté par une bloggeuse de Ludis Media, une agence web localisée à Sherbrooke.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Voici un <!-- raw HTML omitted -->billet de blog  <!-- raw HTML omitted -->assez intéressant sur les couleurs et leur influence dans le processus d’achat posté par une bloggeuse de Ludis Media, une agence web localisée à Sherbrooke.</p>
<p>Enjoy !</p>
]]></content>
        </item>
        
        <item>
            <title>Atomic Design</title>
            <link>/fr/posts/2014/02/atomic-design/</link>
            <pubDate>Mon, 10 Feb 2014 23:30:36 +0000</pubDate>
            
            <guid>/fr/posts/2014/02/atomic-design/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’ai trouvé cet excellent &lt;a href=&#34;http://bradfrostweb.com/blog/post/atomic-web-design/&#34;&gt;article&lt;/a&gt; écrit par &lt;a href=&#34;https://twitter.com/brad_frost&#34;&gt;Brad Fost&lt;/a&gt; qui explique les concepts de l’atomic web design, en voici un petit résumé.&lt;/p&gt;
&lt;p&gt;L’Atomic Design est une méthodologie de conception de systèmes. L’idée est que chaque système est décomposable en plusieurs niveaux pouvant être imbriqués les uns avec les autres. On commencera la conception d’un design par le plus petit niveau.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>J’ai trouvé cet excellent <a href="http://bradfrostweb.com/blog/post/atomic-web-design/">article</a> écrit par <a href="https://twitter.com/brad_frost">Brad Fost</a> qui explique les concepts de l’atomic web design, en voici un petit résumé.</p>
<p>L’Atomic Design est une méthodologie de conception de systèmes. L’idée est que chaque système est décomposable en plusieurs niveaux pouvant être imbriqués les uns avec les autres. On commencera la conception d’un design par le plus petit niveau.</p>
<ol>
<li>Niveau « Atome »</li>
</ol>
<p>Il s’agit de l’élément le plus basique d’une page HTML. Ce peut être par exemple un bouton ou un label.</p>
<ol start="2">
<li>Niveau « Molécule »</li>
</ol>
<p>Il s’agit d’un regroupement d’atomes: l’exemple donné dans l’article est un fieldset de recherche (input pour la zone de texte avec un label et un bouton). Il s’agit de la plus petite unité fonctionnelle d’un site Internet.</p>
<ol start="3">
<li>Niveau « Organisme »</li>
</ol>
<p>Il s’agit d’un regroupement de molécules: autrement dit, on regroupe plusieurs fonctionnalités ensemble pour former une section de l’interface finale. Ce peut être par exemple l’en-tête d’une page.</p>
<ol start="4">
<li>Niveau « Template »</li>
</ol>
<p>Le design du site Internet commence à prendre forme à ce niveau. Ce niveau regroupe plusieurs organismes et donnent ainsi un contexte en regroupant ces éléments, qui sont abstraits lorsqu’ils sont considérés séparement.</p>
<ol start="5">
<li>Niveau « Page »</li>
</ol>
<p>Cela représente le rendu final donné au client. Instance spécifique d’un template, il contiendra le contenu , les images propre à un certain projet.</p>
<p><em>Quel est l’intérêt ?</em></p>
<p>L’intérêt de cette approche méthodologique est de contrôler plus efficacement la conception d’un design en développant des éléments ré-utilisables. La création de molécules favorise la ré-utilisation d’éléments dans différents designs.</p>
<p><em>Sources</em></p>
<p><a href="http://coding.smashingmagazine.com/2013/08/02/other-interface-atomic-design-sass/">http://coding.smashingmagazine.com/2013/08/02/other-interface-atomic-design-sass/</a></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Étudier et vivre aux États-Unis</title>
            <link>/fr/posts/2013/02/%C3%A9tudier-et-vivre-aux-%C3%A9tats-unis/</link>
            <pubDate>Sun, 10 Feb 2013 23:15:53 +0000</pubDate>
            
            <guid>/fr/posts/2013/02/%C3%A9tudier-et-vivre-aux-%C3%A9tats-unis/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L’UTC a un partenariat avec de nombreuses universités américaines. J’ai pour ma part la chance d’effectuer un semestre d’échange avec l’Université du Rhode Island au semestre d’automne 2012. Le rythme de vie en campus américain est tout à fait comme dans les films, tout s’y retrouve: les fraternités, les « dorms » (résidences étudiantes), la vie de campus, les vêtements officiels de l’université, célébrer Thanksgiving et Halloween… Je pense qu’il s’agit vraiment d’une expérience à vivre si on en a l’occasion !&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>L’UTC a un partenariat avec de nombreuses universités américaines. J’ai pour ma part la chance d’effectuer un semestre d’échange avec l’Université du Rhode Island au semestre d’automne 2012. Le rythme de vie en campus américain est tout à fait comme dans les films, tout s’y retrouve: les fraternités, les « dorms » (résidences étudiantes), la vie de campus, les vêtements officiels de l’université, célébrer Thanksgiving et Halloween… Je pense qu’il s’agit vraiment d’une expérience à vivre si on en a l’occasion !</p>
<p>La préparation de mon départ ayant été un peu laborieuse, je tenais à faire un retour d’expérience de ma préparation de départ pour les futurs UTCéens (ou autres étudiants de manière plus générale) qui décideraient de partir.</p>
<h1 id="le-toefl">Le TOEFL</h1>
<p>Tout d’abord, un point sur un test qui m’a assez ennuyé par son coût (240$ quand même!): le TOEFL. L’URI exige un TOEFL minimum de 76 avec un minimum aux différentes sections: Reading 20, Writing 22, Listening 17, Speaking 17. J’ai eu un score de 88 au TOEFL avec un score de 17 au Writing, et mon application n’a pas été rejetée. Je n’avais pas de cours d’anglais particuliers au moment de ma préparation, j’ai préparé le test environ deux semaines à l’avance avec <!-- raw HTML omitted -->ce bouquin<!-- raw HTML omitted -->. Ce test n’est pas à prendre à la légère: il est long (un peu plus de 4h de test), assez difficile par la densité des textes à lire. Il ne faut pas relâcher son attention pendant le test.</p>
<h1 id="lrsquoassurance-santé">L’assurance santé</h1>
<p>Au moment du visa, on vous exigera une assurance santé. Je n’ai pas eu de souci de santé et heureusement car j’ai réalisé a mon retour que l’assurance LMDE avec laquelle j’étais partie en fait ne valait rien 😀</p>
<ul>
<li>J’ai du me faire vacciner aux US et j’ai du payer immédiatement la facture (pas exhorbitante, 9$ pour un vaccin). La LMDE est censée te rembourser après (ou pas dans mon cas).</li>
<li>Mon contrat a cesse en octobre (pendant que j’étais au Rhode Island). Ils ne m’ont pas du tout averti. J’étais donc entre octobre et décembre sans couverture sante aux US… !</li>
</ul>
<p>Je vous recommande vivement <a href="http://fr.april-international.com/global/assurance-crystal-studies">April Mobilite</a>. Oui c’est un peu plus cher mais c’est plus sécuritaire. Par ailleurs, certains sponsors refusent l’assurance santé de la LMDE / SMEREP (ex: la FACC qui s’était occupée de mon visa pour mon stage de fin d’études).</p>
<h1 id="vos-crédits-ects">Vos crédits ECTS</h1>
<p>Cette section ne s’adresse qu’aux UTCéens. Faites attention au niveau des crédits que vous devez valider. Personnellement, je n’avais qu’une CS et deux TM à valider pour ce semestre ce qui m’a permis d’avoir un semestre pas trop trop chargé. Si vous avez un stageà effectuer juste après votre semestre d’échange, ça vous donnera le temps de voir les offres / postuler. Ou de profiter a fond de votre expérience à l’étranger, tout dépend de votre mindset 🙂</p>
<h1 id="se-loger-à-new-york">Se loger à New York</h1>
<p>Cette section s’adresse aux amis qui pensent s’aventurer dans la grosse Pomme. Vivre à New York coûte extrêmement cher. Si vos moyens sont réduits, il va falloir opter pour une résidence étudiante ou une colocation. J’ai personnellement résidé à <a href="http://www.ihouse-nyc.org/s/707/start.aspx">l’I-House</a> quelques mois. Cette résidence est particulièrement fun car elle brasse beaucoup de personnes différentes (stagiaires et étudiants). Le bémol est son prix: je payais environ 950$ par mois pour… un 10 mètres carrés. Et je n’avais pas de cuisine donc je mangeais tout le temps à leur cantine ou à l’extérieur.</p>
<p>Liens vers des résidences similaires :</p>
<p><a href="https://www.studenthousing.org/">https://www.studenthousing.org/</a></p>
<p><a href="http://www.92y.org/Residence">http://www.92y.org/Residence</a></p>
<p>J’ai ensuite déménagé dans le charmant quartier de Bedford-Stuyvesant à Brooklyn. Personnellement, j’ai adoré vivre dans ce quartier de Brooklyn par sa multiculturalité. Certains de mes amis trouvaient ce quartier un peu « ghetto ». J’étais dans une colocation à 6 et payais 900$ par mois incluant Internet et électricité (cette fois-ci avec cuisine donc les frais étaient réduits). J’avais trouvé ce plan dans un groupe CouchSurfing.</p>
<p>Il y a aussi le groupe Facebook « Les Frenchy a NY » : https://www.facebook.com/groups/frenchyany/</p>
<p>Pas mal de bons plans y circulent, aussi bien pour la vente de meubles que pour d’eventuelles sorties. J’ai aussi fait quelques meetups via Couchsurfing ou j’ai rencontre des gens vraiment cools.</p>
<p><a href="https://drive.google.com/open?id=1XC9bR2-ZPYaoEHD_Yjb9D3RQ2jA&usp=sharing">J’ai listé les liens de mes endroits préférés dans la grosse Pomme</a>.</p>
]]></content>
        </item>
        
        <item>
            <title>Github pour les nuls</title>
            <link>/fr/posts/2013/02/github-pour-les-nuls/</link>
            <pubDate>Sun, 10 Feb 2013 23:14:59 +0000</pubDate>
            
            <guid>/fr/posts/2013/02/github-pour-les-nuls/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nous sommes souvent amenés à l’UTC à travailler sur de petits projets en groupe. Pour avoir effectué du développement en groupe sans gestion de versonning, le travail devient vite compliqué au moment où l’on réunit les sources. GitHub serait une solution puisqu’il s’agit d’un service hébergeant à distance les dépôts centralisés (sur lesquels peuvent travailler plusieurs ressources).&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Nous sommes souvent amenés à l’UTC à travailler sur de petits projets en groupe. Pour avoir effectué du développement en groupe sans gestion de versonning, le travail devient vite compliqué au moment où l’on réunit les sources. GitHub serait une solution puisqu’il s’agit d’un service hébergeant à distance les dépôts centralisés (sur lesquels peuvent travailler plusieurs ressources).</p>
<ul>
<li><!-- raw HTML omitted -->Présentation de Git / GitHub<!-- raw HTML omitted --></li>
<li><!-- raw HTML omitted -->Tutoriel vidéo<!-- raw HTML omitted --></li>
<li><!-- raw HTML omitted -->Commandes Git<!-- raw HTML omitted --></li>
</ul>
<p>Quelques tips pour se brancher à un repo déjà existant :</p>
<ol>
<li>Cliquer sur « Fork » sur la page du repo</li>
<li>Lancer la commande « git clone <a href="mailto:git@github.com">git@github.com</a>:<em><!-- raw HTML omitted --></em>/<!-- raw HTML omitted -->.git »</li>
<li>Dans le dossier du repo, lancer la commande « git remote add <em>upstream</em> <a href="mailto:git@github.com">git@github.com</a>:<!-- raw HTML omitted -->/<!-- raw HTML omitted -->.git »</li>
</ol>
<!-- raw HTML omitted -->
<p>A noter que ces commandes peuvent être exécutées s’il s’agit d’un repository <strong>privé</strong> ! Ensuite pour effectuer ses commits, il suffit d’exécuter les commandes « git commit -a » (pour commiter tous les fichiers modifiés), puis « git push upstream master » pour les envoyer sur le repo de référence.</p>
]]></content>
        </item>
        
        <item>
            <title>Installation de MySQL sous Mac OS X</title>
            <link>/fr/posts/2012/09/installation-de-mysql-sous-mac-os-x/</link>
            <pubDate>Sat, 29 Sep 2012 23:08:22 +0000</pubDate>
            
            <guid>/fr/posts/2012/09/installation-de-mysql-sous-mac-os-x/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ayant eu quelques problèmes lors de la mise en place d’une base MySQL sur mon appli RoR (le &lt;code&gt;gem install mysql2&lt;/code&gt; provoquait une erreur), il suffit d’utiliser l’install disponible sur &lt;a href=&#34;http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg&#34;&gt;le site de MySQL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il suffit d&amp;rsquo;exécuter la commande suivante et you’re all set 🙂&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo gem install mysql&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://stackoverflow.com/questions/2014765/unable-to-install-mysql-on-mac-os-x/12632616#12632616&#34;&gt;Source: Stackoverflow&lt;/a&gt;&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Ayant eu quelques problèmes lors de la mise en place d’une base MySQL sur mon appli RoR (le <code>gem install mysql2</code> provoquait une erreur), il suffit d’utiliser l’install disponible sur <a href="http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg">le site de MySQL</a></p>
<p>Il suffit d&rsquo;exécuter la commande suivante et you’re all set 🙂</p>
<p><code>sudo gem install mysql</code></p>
<p><a href="http://stackoverflow.com/questions/2014765/unable-to-install-mysql-on-mac-os-x/12632616#12632616">Source: Stackoverflow</a></p>
]]></content>
        </item>
        
        <item>
            <title>Job d&#39;été Phone-Régie: retour d&#39;expérience</title>
            <link>/fr/posts/2012/09/job-d%C3%A9t%C3%A9-phone-r%C3%A9gie-retour-dexp%C3%A9rience/</link>
            <pubDate>Tue, 18 Sep 2012 23:00:36 +0000</pubDate>
            
            <guid>/fr/posts/2012/09/job-d%C3%A9t%C3%A9-phone-r%C3%A9gie-retour-dexp%C3%A9rience/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un petit billet de blog pour vous partager mon expérience sur les fameux « jobs d’été ». Parfois galère à trouver, j’ai pour ma part effectué plusieurs missions pour Phone Régie.&lt;/p&gt;
&lt;p&gt;Phone Régie, c’est quoi? Des jobs d’hôtesse sur des temps partiels ou complets selon vos disponibilités. Le poste consiste à être à l’accueil et à gérer les flux de visiteurs et/ou d’appels et/ou de colis. Le salaire est divisé en trois parties: la base (smic) + prime d’assiduité + prime d’habillage (si vous portez un uniforme sur le site).&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Un petit billet de blog pour vous partager mon expérience sur les fameux « jobs d’été ». Parfois galère à trouver, j’ai pour ma part effectué plusieurs missions pour Phone Régie.</p>
<p>Phone Régie, c’est quoi? Des jobs d’hôtesse sur des temps partiels ou complets selon vos disponibilités. Le poste consiste à être à l’accueil et à gérer les flux de visiteurs et/ou d’appels et/ou de colis. Le salaire est divisé en trois parties: la base (smic) + prime d’assiduité + prime d’habillage (si vous portez un uniforme sur le site).</p>
<p>Le principal avantage de Phone Régie est que vous pouvez décrocher un contrat très rapidement avec n’importe quelles disponibilités. Pour un étudiant c’est le top, car trouver un job d’été ou plus généralement un job étudiant qui corresponde à nos emplois du temps, nos dates de fin de semestre, peut se révéler complexe.</p>
<p>Inconvénient, le temps de travail réel est supérieur au temps de travail payé : en effet, il faut arriver un peu à l’avance le temps de s’habiller et de faire sa prise de poste. En effet,</p>
<p>la prime d’assiduité est assez particulière. Il faut savoir que les prises de postes se font sur un serveur vocal qui a un algorithme très bête. Si vous effectuez cette fameuse prise de poste à 8h31 et que vous commencez à 8h30, vous êtes déclarée en retard et la prime ne se déclenche pas. Mieux vaut ainsi arriver à l’avance. Par ailleurs, si vous devez faire la fermeture du site, certains flux de visiteurs sont tellement importants que parfois il est nécessaire de faire un peu de temps supplémentaire pour que tous les visiteurs soient pris en charge.</p>
<p>Pour continuer sur la prime d’assiduité, elle n’est pas versée en cas d’absence ou d’un retard (y compris à cause des transports). Cela s’avérait un peu stressant: pour 10 minutes de retard, qui ne causent en soi rien à l’entreprise, une prime assez importante est supprimée. Un conseil: essayez de demander un site proche de chez vous, les responsables essayeront de respecter au mieux votre demande (du moins, si elles sont compatibles avec leurs besoins…).</p>
<p>Bon courage pour vos recherches !</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Hatchi, un tamagotchi rétro pour iPhone</title>
            <link>/fr/posts/2012/07/hatchi-un-tamagotchi-r%C3%A9tro-pour-iphone/</link>
            <pubDate>Sun, 01 Jul 2012 22:59:24 +0000</pubDate>
            
            <guid>/fr/posts/2012/07/hatchi-un-tamagotchi-r%C3%A9tro-pour-iphone/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici une nouvelle application que j’ai trouvé sur l’AppStore il y a quelques mois et qui m’a rendu complètement accro, Hatchi.&lt;/p&gt;
&lt;p&gt;Le principe est simple, vous évoluez votre hatchi, et selon la manière dont vous vous en occupez, il se dirige vers une branche d’évolution différente ! Il a des phases différentes dans sa vie: baby, child, teenager, et adult.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Voici une nouvelle application que j’ai trouvé sur l’AppStore il y a quelques mois et qui m’a rendu complètement accro, Hatchi.</p>
<p>Le principe est simple, vous évoluez votre hatchi, et selon la manière dont vous vous en occupez, il se dirige vers une branche d’évolution différente ! Il a des phases différentes dans sa vie: baby, child, teenager, et adult.</p>
<p>L’orientation vers telle ou telle direction dans l’arbre n’est pas aléatoire :</p>
<p>– 1ère évolution vers « Child » : le rendre plus « smart » qu&rsquo; »active » pour aller vers la branche du haut.</p>
<p>– 2ème évolution vers « Teenager » : faire en sorte qu’il pèse moins de 15 lbs pour aller vers la branche du haut</p>
<p>– 3ème évolution vers « Adult » : faire en sorte qu’il soit heureux pour qu’il aille vers la branche du haut</p>
<p>Ce jeu est très addicitif, j’ai tout de suite tenu à explorer l’arbre. Les graphismes sont simples mais pourtant très efficaces 🙂 Elle était gratuite au moment où je l’ai téléchargée sur l’AppStore, et coûte aux dernières nouvelles 0,79€</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Tutoriels de base</title>
            <link>/fr/posts/2012/04/tutoriels-de-base/</link>
            <pubDate>Sun, 29 Apr 2012 13:11:20 +0000</pubDate>
            
            <guid>/fr/posts/2012/04/tutoriels-de-base/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici une liste de tutoriels pour appréhender en surface certains languages. J’ai suivi ceux sur Spring, RoR et développement iPhone, je continuerai à étoffer cette liste.&lt;/p&gt;
&lt;p&gt;N’hésitez pas à me faire parts de bons liens dans les commentaires 🙂&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;Spring MVC&lt;!-- raw HTML omitted --&gt;&lt;/li&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;RoR&lt;!-- raw HTML omitted --&gt;&lt;/li&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;Développement iPhone&lt;!-- raw HTML omitted --&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Voici une liste de tutoriels pour appréhender en surface certains languages. J’ai suivi ceux sur Spring, RoR et développement iPhone, je continuerai à étoffer cette liste.</p>
<p>N’hésitez pas à me faire parts de bons liens dans les commentaires 🙂</p>
<ul>
<li><!-- raw HTML omitted -->Spring MVC<!-- raw HTML omitted --></li>
<li><!-- raw HTML omitted -->RoR<!-- raw HTML omitted --></li>
<li><!-- raw HTML omitted -->Développement iPhone<!-- raw HTML omitted --></li>
</ul>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Poursuite d&#39;études en informatique</title>
            <link>/fr/posts/2012/03/poursuite-d%C3%A9tudes-en-informatique/</link>
            <pubDate>Thu, 29 Mar 2012 13:11:20 +0000</pubDate>
            
            <guid>/fr/posts/2012/03/poursuite-d%C3%A9tudes-en-informatique/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cela fait quelques temps que je pense à rédiger ce post, afin de faire un retour d’expérience sur mes choix d’orientation.&lt;/p&gt;
&lt;p&gt;J’ai été intéressée par l’univers informatique depuis mes années collège pendant lesquelles j’ai appris de manière auto-didacte le XHTML/CSS. C’est donc naturellement que j’ai souhaité aller plus loin dans le développement web. J’ai choisi de poursuivre mes études dans l’informatique de manière générale car je ne savais pas vers quel domaine précis m’orienter.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Cela fait quelques temps que je pense à rédiger ce post, afin de faire un retour d’expérience sur mes choix d’orientation.</p>
<p>J’ai été intéressée par l’univers informatique depuis mes années collège pendant lesquelles j’ai appris de manière auto-didacte le XHTML/CSS. C’est donc naturellement que j’ai souhaité aller plus loin dans le développement web. J’ai choisi de poursuivre mes études dans l’informatique de manière générale car je ne savais pas vers quel domaine précis m’orienter.</p>
<p>Pourquoi avoir choisi un DUT Informatique ? Tout simplement parce que je souhaitais faire une <strong>formation</strong> <strong>professionnalisante</strong>: tout au long de ma formation, j’ai été amenée à travailler sur des <strong>technologies utilisées dans le monde du travail</strong>. Le stage de fin de DUT de trois mois permet d’appliquer ces connaissances et d’acquérir un certain bagage de connaissances qui nous permet de directement travailler avec un BAC +2. Par ailleurs, l’ambiance est excellente en IUT: on a un bon rythme de travail avec un nombre conséquent de projets (contrairement à un cursus licence où on est plus enclin à bosser juste avant les partiels) et c’est une formation très bien vue dans le monde du travail. Dernier point positif: il est tout à fait possible de <strong>continuer ses études</strong> après un DUT (environ 20% d’étudiants entrent dans la vie active directement après l’IUT) et le choix est très étendu pouvant aller de licences maths-info au cursus MIAGE, en passant par des formations d’ingénieur vers lesquelles je me suis orientée.</p>
<p>J’ai choisi de poursuivre mes études à l’UTC car je souhaitais avoir un diplôme d’ingénieur et aller plus loin que mon niveau Bac +2, tout en gardant une formation qui me prépare au mieux à ma future vie professionnelle. L’UTC prépare en effet une bonne immersion dans la vie active avec ses deux stages de 6 mois, le TN09 (Stage Assistant Ingénieur) et le TN10 (Stage de Fin d’Etudes). Intégrer l’UTC en branche (après mon DUT) m’a permis d’éviter le Tronc Commun, riche en mathématiques et autres matières scientifiques, qui au final ne sont peu voire pas utilisées en branche…</p>
<p>Voilà quant à mon retour d’expérience, pour résumer :</p>
<ul>
<li>Préférez un DUT Info à un BTS si jamais vous ne savez pas si vous souhaitez travailler au bout de deux ans d’études</li>
<li>Si vous souhaitez faire du multimédia, le DUT SRC peut être mieux adapté. Les DUT Informatique et SRC semblent similaires, à la différence près que le DUT Informatique paraît plus général. N’hésitez pas à vous renseigner sur les programmes détaillés et à choisir en conséquence.</li>
<li>La formation en IUT Informatique prépare très bien à l’intégration de l’UTC en Génie Informatique.</li>
</ul>
<p>N’hésitez pas à me contacter si vous avez des questions 🙂</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content>
        </item>
        
        <item>
            <title>Les V.I.E en bref - Volontariat International en Enterprise : Informations et Astuces</title>
            <link>/fr/posts/2012/03/les-v.i.e-en-bref-volontariat-international-en-enterprise-informations-et-astuces/</link>
            <pubDate>Thu, 01 Mar 2012 13:11:20 +0000</pubDate>
            
            <guid>/fr/posts/2012/03/les-v.i.e-en-bref-volontariat-international-en-enterprise-informations-et-astuces/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici des notes que j’ai prises lors d’une présentation du concept des V.I.E. à l’UTC.&lt;/p&gt;
&lt;p&gt;Le Volontariat International en Entreprises (V.I.E), permet aux entreprises françaises de confier à un jeune (de 18 à 28 ans) une mission professionnelle à l’étranger durant une période modulable de 6 à 24 mois. Le V.I.E. facilite énormément le départ à l’étranger: les frais de visa sont pris en charge par UbiFrance, la rémunération est intéressante (1200 à 3500€ selon le risque et le coût de la vie sur place), les frais de voyage, bagages et visas sont pris en charge par l’entreprise et on a de surplus le droit à 2,5 de congés par mois travaillé ! 🙂&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>Voici des notes que j’ai prises lors d’une présentation du concept des V.I.E. à l’UTC.</p>
<p>Le Volontariat International en Entreprises (V.I.E), permet aux entreprises françaises de confier à un jeune (de 18 à 28 ans) une mission professionnelle à l’étranger durant une période modulable de 6 à 24 mois. Le V.I.E. facilite énormément le départ à l’étranger: les frais de visa sont pris en charge par UbiFrance, la rémunération est intéressante (1200 à 3500€ selon le risque et le coût de la vie sur place), les frais de voyage, bagages et visas sont pris en charge par l’entreprise et on a de surplus le droit à 2,5 de congés par mois travaillé ! 🙂</p>
<p>La majorité des V.I.E. sont décrochés via le site <!-- raw HTML omitted -->civiweb<!-- raw HTML omitted --> mais certains sont également décrochés au travers de candidatures spontanées.  A noter, l’inscription sur civiweb requiert un numéro fourni lors de la JAPD… Les entretiens se déroulent généralement en France ou peuvent se faire via vidéoconférence.</p>
<p>A l’UTC, il serait possible d’effectuer son stage en même temps que le V.I.E. (demander confirmation à Valérie Texier), une expérience à l’étranger est un atout. Répondre dans la langue de l’offre (cv / lettre motiv) mais rester sur un cv une page. <strong>Être réactif !</strong> <strong>Mettre en avant son profil international ! (voyages …)</strong></p>
<p>Questions: <a href="mailto:info@civiweb.com">info@civiweb.com</a></p>
]]></content>
        </item>
        
        <item>
            <title>Mocker des classes statiques en Java</title>
            <link>/fr/posts/2012/02/mocker-des-classes-statiques-en-java/</link>
            <pubDate>Fri, 10 Feb 2012 13:11:20 +0000</pubDate>
            
            <guid>/fr/posts/2012/02/mocker-des-classes-statiques-en-java/</guid>
            <description>&lt;blockquote&gt;
&lt;p&gt;👴 &lt;em&gt;Attention&lt;/em&gt; Cet article a quelques années et n&amp;rsquo;est peut-être plus à jour !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;De nombreux frameworks existent pour la réalisation de tests unitaires en Java, j’ai notamment eu l’occasion d’utiliser JUnit, auquel on peut brancher des librairies facilitant la réalisation de mocks (objects fictifs servant à tester l’application).&lt;/p&gt;
&lt;p&gt;J’ai eu l’occasion d’utiliser &lt;a href=&#34;http://mockito.org&#34;&gt;Mockito&lt;/a&gt;, assez pratique jusqu’au moment où on doit mocker des classes statiques. &lt;a href=&#34;https://code.google.com/p/powermock/wiki/MockStatic&#34;&gt;PowerMock&lt;/a&gt; répond alors mieux à ce problème.&lt;/p&gt;</description>
            <content type="html"><![CDATA[<blockquote>
<p>👴 <em>Attention</em> Cet article a quelques années et n&rsquo;est peut-être plus à jour !</p>
</blockquote>
<p>De nombreux frameworks existent pour la réalisation de tests unitaires en Java, j’ai notamment eu l’occasion d’utiliser JUnit, auquel on peut brancher des librairies facilitant la réalisation de mocks (objects fictifs servant à tester l’application).</p>
<p>J’ai eu l’occasion d’utiliser <a href="http://mockito.org">Mockito</a>, assez pratique jusqu’au moment où on doit mocker des classes statiques. <a href="https://code.google.com/p/powermock/wiki/MockStatic">PowerMock</a> répond alors mieux à ce problème.</p>
]]></content>
        </item>
        
    </channel>
</rss>
