<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Jonathan SAEZ</title>
 <link href="https://kandran.fr/atom.xml" rel="self"/>
 <link href="https://kandran.fr/"/>
 <updated>2026-04-06T17:22:48+00:00</updated>
 <id>https://kandran.fr</id>
 <author>
   <name>Jonathan SAEZ</name>
 </author>
 
 
   
   <entry>
     <title>Content Security Policy (CSP) : contrôler les ressources chargées par votre site</title>
     <link href="https://kandran.fr/csp-content-security-policy/"/>
     <updated>2026-04-06T00:00:00+00:00</updated>
     <id>https://kandran.fr/csp-content-security-policy</id>
     <content type="html">&lt;p&gt;Vous développez une application web, vous avez mis en place HTTPS, peut-être même HSTS. Votre serveur est à jour, vos dépendances aussi. Et pourtant, une simple faille XSS peut suffire à compromettre vos utilisateurs. Un script malveillant injecté dans une page, et c’est le vol de session, le redirect vers un site de phishing ou l’exfiltration de données sensibles.&lt;/p&gt;

&lt;p&gt;Les failles Cross-Site Scripting (XSS) restent parmi les vulnérabilités les plus fréquentes sur le web. Elles exploitent un principe simple : le navigateur fait confiance à tout ce que le serveur lui envoie. Si un attaquant parvient à glisser du code dans votre page, le navigateur l’exécute sans poser de questions.&lt;/p&gt;

&lt;p&gt;C’est précisément là qu’intervient la &lt;strong&gt;Content Security Policy&lt;/strong&gt;. CSP permet de dire au navigateur : “voici les sources autorisées pour charger des scripts, des styles, des images, des fonts… tout le reste, tu bloques.” Historiquement pensée pour contrer les XSS, la CSP va en réalité bien au-delà : contrôle du chargement des iframes, protection contre le clickjacking, détection du mixed content HTTP/HTTPS, et même surveillance des violations via un système de reporting.&lt;/p&gt;

&lt;p&gt;Nous allons voir ensemble comment fonctionne CSP, quelles directives utiliser, comment la déployer progressivement sans casser votre site, et surtout quelles erreurs éviter.&lt;/p&gt;

&lt;h2 id=&quot;sommaire&quot;&gt;Sommaire&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#pourquoi-vos-pages-web-sont-vulnerables&quot;&gt;Pourquoi vos pages web sont vulnérables&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#content-security-policy-le-principe&quot;&gt;Content Security Policy : le principe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#les-directives-csp-essentielles&quot;&gt;Les directives CSP essentielles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#tester-sans-casser-le-mode-report-only&quot;&gt;Tester sans casser : le mode Report-Only&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#les-erreurs-qui-rendent-votre-csp-inutile&quot;&gt;Les erreurs qui rendent votre CSP inutile&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#mettre-en-place-csp-concretement&quot;&gt;Mettre en place CSP concrètement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pourquoi-vos-pages-web-sont-vulnérables&quot;&gt;Pourquoi vos pages web sont vulnérables&lt;/h2&gt;

&lt;p&gt;Par défaut, un navigateur charge et exécute tout ce qu’une page HTML lui demande. Un &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt; inline ? Exécuté. Une image chargée depuis un domaine inconnu ? Affichée. Un iframe pointant vers un site tiers ? Rendu. Le navigateur ne fait aucune distinction entre le contenu légitime et le contenu injecté par un attaquant.&lt;/p&gt;

&lt;p&gt;Les failles XSS exploitent exactement ce comportement. On distingue généralement trois variantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;XSS Stored (persistant)&lt;/strong&gt; : le code malveillant est stocké côté serveur (en base de données par exemple) et servi à chaque visiteur. Un commentaire piégé sur un forum en est l’exemple classique.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;XSS Reflected&lt;/strong&gt; : le code est injecté via l’URL ou un paramètre de requête, puis renvoyé dans la réponse du serveur sans être stocké. Typiquement via un lien piégé envoyé par email.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;XSS DOM-based&lt;/strong&gt; : l’injection se produit côté client, directement dans le DOM, sans passer par le serveur. Le JavaScript de la page manipule des données non fiables (fragment d’URL, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;document.referrer&lt;/code&gt;…) sans les assainir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans les trois cas, le résultat est le même : du code JavaScript arbitraire s’exécute dans le contexte de votre page, avec accès aux cookies, au DOM, et potentiellement aux tokens d’authentification de vos utilisateurs.&lt;/p&gt;

&lt;p&gt;La validation et l’échappement des entrées utilisateur restent évidemment la première ligne de défense. Mais une seule erreur, un seul oubli dans un template, et la porte est ouverte. CSP agit comme un filet de sécurité supplémentaire : même si du code malveillant parvient à s’injecter dans votre HTML, le navigateur refusera de l’exécuter si la politique ne l’autorise pas.&lt;/p&gt;

&lt;h2 id=&quot;content-security-policy--le-principe&quot;&gt;Content Security Policy : le principe&lt;/h2&gt;

&lt;p&gt;CSP fonctionne de manière très simple. Votre serveur envoie un en-tête HTTP &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy&lt;/code&gt; avec la réponse. Cet en-tête contient une liste de directives qui indiquent au navigateur quelles sources sont autorisées pour chaque type de ressource.&lt;/p&gt;

&lt;p&gt;Concrètement, quand le navigateur reçoit cet en-tête :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Content-Security-Policy: default-src &apos;self&apos;; script-src &apos;self&apos; https://cdn.exemple.com
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Il comprend : “pour cette page, charge les ressources uniquement depuis l’origine du site (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;self&apos;&lt;/code&gt;), et autorise les scripts depuis le site lui-même et depuis &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://cdn.exemple.com&lt;/code&gt;. Tout le reste est bloqué.”&lt;/p&gt;

&lt;p&gt;Si un attaquant injecte un &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script src=&quot;https://evil.com/malware.js&quot;&amp;gt;&lt;/code&gt; dans votre page, le navigateur le bloquera car &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;evil.com&lt;/code&gt; n’est pas dans la liste des sources autorisées pour les scripts. Idem pour un &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;alert(&apos;xss&apos;)&amp;lt;/script&amp;gt;&lt;/code&gt; inline : par défaut, CSP interdit l’exécution de scripts inline.&lt;/p&gt;

&lt;p&gt;Il existe deux façons de déclarer une CSP :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Via l’en-tête HTTP&lt;/strong&gt; (recommandé) : le serveur ajoute &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy&lt;/code&gt; dans les headers de la réponse.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Via une balise &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;&lt;/strong&gt; : directement dans le HTML avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;...&quot;&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personnellement je vous conseille l’en-tête HTTP. La balise &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; a des limitations : elle ne supporte pas certaines directives comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;frame-ancestors&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;report-uri&lt;/code&gt;, et elle peut être contournée si l’attaquant parvient à injecter du HTML avant la balise &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;les-directives-csp-essentielles&quot;&gt;Les directives CSP essentielles&lt;/h2&gt;

&lt;p&gt;CSP propose un ensemble de directives, chacune contrôlant un type de ressource spécifique. Nous n’allons pas toutes les lister ici, mais voici celles que vous utiliserez le plus souvent :&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Directive&lt;/th&gt;
      &lt;th&gt;Contrôle&lt;/th&gt;
      &lt;th&gt;Exemple&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Politique par défaut pour toutes les ressources non spécifiées&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src &apos;self&apos;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sources autorisées pour les scripts JavaScript&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src &apos;self&apos; https://cdn.exemple.com&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;style-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sources autorisées pour les feuilles de style CSS&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;style-src &apos;self&apos; &apos;unsafe-inline&apos;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;img-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sources autorisées pour les images&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;img-src &apos;self&apos; data: https:&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;connect-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Cibles autorisées pour les requêtes XHR, Fetch, WebSocket&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;connect-src &apos;self&apos; https://api.exemple.com&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;font-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sources autorisées pour les polices de caractères&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;font-src &apos;self&apos; https://fonts.gstatic.com&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;frame-ancestors&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Qui peut intégrer votre page dans une iframe&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;frame-ancestors &apos;none&apos;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;object-src&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Sources pour les plugins (Flash, Java…)&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;object-src &apos;none&apos;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base-uri&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Valeurs autorisées pour la balise &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;base&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;base-uri &apos;self&apos;&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;La directive &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src&lt;/code&gt; est fondamentale. Elle sert de politique de repli : si vous ne définissez pas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src&lt;/code&gt;, c’est &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src&lt;/code&gt; qui s’applique aux scripts. Personnellement je vous conseille de toujours commencer par &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src &apos;self&apos;&lt;/code&gt; puis d’ouvrir au cas par cas.&lt;/p&gt;

&lt;p&gt;Les valeurs les plus courantes que vous pouvez attribuer à ces directives :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;self&apos;&lt;/code&gt; : autorise les ressources provenant de la même origine (même schéma, domaine et port).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;none&apos;&lt;/code&gt; : bloque tout. Utile pour &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;object-src&lt;/code&gt; par exemple, puisque les plugins sont rarement nécessaires aujourd’hui.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://domaine.com&lt;/code&gt; : autorise un domaine spécifique.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data:&lt;/code&gt; : autorise les ressources en data URI (images en base64 par exemple).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;unsafe-inline&apos;&lt;/code&gt; : autorise les scripts ou styles inline. À éviter autant que possible (nous y reviendrons).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un exemple de CSP raisonnablement stricte pour un site classique :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Content-Security-Policy: default-src &apos;self&apos;; script-src &apos;self&apos;; style-src &apos;self&apos; &apos;unsafe-inline&apos;; img-src &apos;self&apos; data: https:; font-src &apos;self&apos; https://fonts.gstatic.com; object-src &apos;none&apos;; frame-ancestors &apos;self&apos;; base-uri &apos;self&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;tester-sans-casser--le-mode-report-only&quot;&gt;Tester sans casser : le mode Report-Only&lt;/h2&gt;

&lt;p&gt;Déployer une CSP sur un site existant sans préparation, c’est la garantie de casser des fonctionnalités. Un script tiers oublié, un style inline dans un vieux template, une image chargée depuis un CDN non listé, et voilà des éléments de votre page qui disparaissent silencieusement.&lt;/p&gt;

&lt;p&gt;C’est pour ça que l’en-tête &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy-Report-Only&lt;/code&gt; existe. Il fonctionne exactement comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy&lt;/code&gt;, mais au lieu de bloquer les ressources non conformes, il se contente de signaler les violations. Votre site continue de fonctionner normalement, et vous collectez les informations nécessaires pour affiner votre politique.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Content-Security-Policy-Report-Only: default-src &apos;self&apos;; script-src &apos;self&apos;; report-uri /csp-report
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Avec cette configuration, le navigateur envoie un rapport JSON à &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/csp-report&lt;/code&gt; à chaque fois qu’une ressource viole la politique. Voici à quoi ressemble un rapport typique :&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;csp-report&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;document-uri&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://monsite.com/page&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;referrer&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;violated-directive&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;script-src &apos;self&apos;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;effective-directive&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;script-src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;original-policy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default-src &apos;self&apos;; script-src &apos;self&apos;; report-uri /csp-report&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;blocked-uri&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://cdn.tracker-inconnu.com/analytics.js&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;status-code&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ce rapport nous dit clairement que la page &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/page&lt;/code&gt; a tenté de charger un script depuis &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cdn.tracker-inconnu.com&lt;/code&gt;, ce qui viole la directive &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src &apos;self&apos;&lt;/code&gt;. À partir de là, deux choix : soit vous ajoutez ce domaine à votre politique parce que c’est un script légitime (un outil analytics par exemple), soit vous confirmez que c’est bien un chargement non désiré et vous gardez la restriction.&lt;/p&gt;

&lt;h3 id=&quot;collecter-les-rapports&quot;&gt;Collecter les rapports&lt;/h3&gt;

&lt;p&gt;Pour réceptionner ces rapports, il vous faut un endpoint capable de recevoir du JSON en POST. Un exemple minimaliste en Node.js :&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/csp-report&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;express&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;application/csp-report&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Violation CSP :&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;csp-report&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;204&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;En pratique, sur un site avec du trafic, vous allez recevoir beaucoup de rapports (les extensions navigateur déclenchent souvent des violations). Personnellement je vous conseille de stocker les rapports en base et de les agréger par &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blocked-uri&lt;/code&gt; et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;violated-directive&lt;/code&gt; pour repérer rapidement les patterns significatifs et filtrer le bruit.&lt;/p&gt;

&lt;h3 id=&quot;lapproche-progressive&quot;&gt;L’approche progressive&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Déployez votre CSP en mode Report-Only.&lt;/li&gt;
  &lt;li&gt;Analysez les rapports pendant quelques jours ou semaines.&lt;/li&gt;
  &lt;li&gt;Ajustez les directives en fonction des violations légitimes.&lt;/li&gt;
  &lt;li&gt;Une fois la politique stabilisée, passez en mode actif avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vous pouvez d’ailleurs utiliser les deux en-têtes simultanément : garder votre CSP active en production et tester une politique plus stricte en Report-Only. C’est l’approche incrémentale idéale pour renforcer progressivement votre sécurité sans jamais prendre le risque de casser des fonctionnalités.&lt;/p&gt;

&lt;h2 id=&quot;les-erreurs-qui-rendent-votre-csp-inutile&quot;&gt;Les erreurs qui rendent votre CSP inutile&lt;/h2&gt;

&lt;p&gt;Avoir un en-tête CSP ne signifie pas que votre site est protégé. Une CSP mal configurée donne un faux sentiment de sécurité. Voici les erreurs les plus fréquentes.&lt;/p&gt;

&lt;h3 id=&quot;utiliser-unsafe-inline-pour-les-scripts&quot;&gt;Utiliser unsafe-inline pour les scripts&lt;/h3&gt;

&lt;p&gt;C’est l’erreur la plus courante et la plus grave. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src &apos;unsafe-inline&apos;&lt;/code&gt; autorise l’exécution de n’importe quel script inline dans votre page. Or, c’est exactement le vecteur d’attaque principal des XSS. Avec cette directive, votre CSP ne protège plus contre grand-chose.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/* À ne surtout pas faire */
Content-Security-Policy: script-src &apos;self&apos; &apos;unsafe-inline&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Si vous avez besoin d’exécuter des scripts inline (et c’est souvent le cas avec des frameworks ou des outils analytics), préférez l’approche par &lt;strong&gt;nonce&lt;/strong&gt; ou par &lt;strong&gt;hash&lt;/strong&gt; plutôt que d’ouvrir la porte avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unsafe-inline&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le nonce&lt;/strong&gt; est une valeur aléatoire générée à chaque requête par le serveur. Elle est ajoutée à la fois dans l’attribut &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nonce&lt;/code&gt; du script et dans la directive CSP. Le navigateur n’exécute que les scripts dont le nonce correspond :&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;nonce=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;abc123random&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Ce script sera autorisé car le nonce correspond&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Content-Security-Policy: script-src &apos;self&apos; &apos;nonce-abc123random&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Le nonce doit impérativement être unique à chaque réponse HTTP. Si vous réutilisez le même nonce, un attaquant qui le découvre peut l’exploiter pour injecter ses propres scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le hash&lt;/strong&gt; fonctionne différemment : au lieu d’un token aléatoire, vous calculez l’empreinte SHA du contenu exact du script. Le navigateur compare le hash du script inline avec celui déclaré dans la CSP. Si ça correspond, le script s’exécute.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Bienvenue&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pour générer le hash, vous calculez le SHA-256 du contenu du script (ici &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var message = &quot;Bienvenue&quot;;&lt;/code&gt;) puis vous l’encodez en base64. La directive ressemble à ça :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Content-Security-Policy: script-src &apos;self&apos; &apos;sha256-xyz...base64...&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Quand utiliser l’un ou l’autre ? Le nonce est plus adapté quand vos scripts inline changent régulièrement ou sont générés dynamiquement côté serveur. Le hash convient mieux aux scripts inline qui ne changent jamais (un snippet analytics figé, par exemple). Dans les deux cas, c’est nettement plus sûr que &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unsafe-inline&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;utiliser-unsafe-eval&quot;&gt;Utiliser unsafe-eval&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unsafe-eval&lt;/code&gt; autorise les fonctions comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eval()&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;new Function()&lt;/code&gt;, ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setTimeout&lt;/code&gt; avec une chaîne de caractères. Ces fonctions permettent d’exécuter du code JavaScript généré dynamiquement, ce qui est un vecteur d’attaque classique. Il faut éviter cette directive sauf nécessité absolue.&lt;/p&gt;

&lt;h3 id=&quot;oublier-default-src&quot;&gt;Oublier default-src&lt;/h3&gt;

&lt;p&gt;Sans &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src&lt;/code&gt;, toute directive non explicitement définie n’a aucune restriction. Si vous définissez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src&lt;/code&gt; et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;style-src&lt;/code&gt; mais oubliez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default-src&lt;/code&gt;, les images, polices, iframes et connexions réseau ne sont pas contrôlées. Un attaquant pourrait par exemple utiliser un élément &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;object&amp;gt;&lt;/code&gt; pour exécuter du code malveillant.&lt;/p&gt;

&lt;h3 id=&quot;utiliser-des-wildcards-trop-larges&quot;&gt;Utiliser des wildcards trop larges&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src *&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src https:&lt;/code&gt; reviennent à ne rien restreindre du tout. Même &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;script-src *.cdn.com&lt;/code&gt; peut poser problème si l’attaquant trouve un sous-domaine vulnérable ou un endpoint JSONP sur ce CDN.&lt;/p&gt;

&lt;p&gt;Soyez aussi spécifique que possible dans vos sources autorisées. Listez les domaines exacts plutôt que d’utiliser des patterns trop permissifs.&lt;/p&gt;

&lt;h2 id=&quot;mettre-en-place-csp-concrètement&quot;&gt;Mettre en place CSP concrètement&lt;/h2&gt;

&lt;p&gt;La configuration se fait au niveau du serveur web. Voici les exemples les plus courants.&lt;/p&gt;

&lt;h3 id=&quot;nginx&quot;&gt;Nginx&lt;/h3&gt;

&lt;div class=&quot;language-nginx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;add_header&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Content-Security-Policy&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;default-src&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;self&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;script-src&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;self&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;style-src&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;self&apos;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;unsafe-inline&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;img-src&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;self&apos;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;data:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;object-src&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;none&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;frame-ancestors&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;self&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;always&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;apache&quot;&gt;Apache&lt;/h3&gt;

&lt;div class=&quot;language-apache highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;Header&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;set&lt;/span&gt; Content-Security-Policy &quot;default-src &apos;self&apos;; script-src &apos;self&apos;; style-src &apos;self&apos; &apos;unsafe-inline&apos;; img-src &apos;self&apos; data:; object-src &apos;none&apos;; frame-ancestors &apos;self&apos;;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;balise-meta-alternative&quot;&gt;Balise meta (alternative)&lt;/h3&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;http-equiv=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Content-Security-Policy&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;default-src &apos;self&apos;; script-src &apos;self&apos;; style-src &apos;self&apos; &apos;unsafe-inline&apos;; img-src &apos;self&apos; data:; object-src &apos;none&apos;;&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Gardez en tête que la balise meta ne supporte pas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;frame-ancestors&lt;/code&gt; ni les directives de reporting. L’en-tête HTTP reste la méthode à privilégier.&lt;/p&gt;

&lt;h3 id=&quot;lapproche-itérative&quot;&gt;L’approche itérative&lt;/h3&gt;

&lt;p&gt;Il faut éviter de vouloir tout verrouiller d’un coup. Voici une approche pragmatique :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Commencez large&lt;/strong&gt; : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy-Report-Only: default-src &apos;self&apos; https: &apos;unsafe-inline&apos;&lt;/code&gt;. Ça ne bloque rien mais vous donne une base de départ.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Analysez les rapports&lt;/strong&gt; : identifiez les scripts tiers, les styles inline, les ressources externes légitimes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Restreignez progressivement&lt;/strong&gt; : remplacez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https:&lt;/code&gt; par les domaines exacts, remplacez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;unsafe-inline&apos;&lt;/code&gt; par des nonces si possible.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Passez en mode actif&lt;/strong&gt; : une fois la politique stabilisée, basculez sur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Content-Security-Policy&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Surveillez en continu&lt;/strong&gt; : gardez le reporting actif même après le déploiement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Maintenant que nous avons vu les bases, n’oubliez pas que CSP ne fonctionne pas en isolation. C’est une couche de défense parmi d’autres. Combinée avec HTTPS, HSTS, la validation des entrées, et des headers comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Frame-Options&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X-Content-Type-Options&lt;/code&gt;, elle participe à une stratégie de sécurité cohérente. CSP n’empêchera pas toutes les attaques, mais elle réduit considérablement la surface d’exploitation, et c’est déjà beaucoup.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Obsidian : le second cerveau taillé pour les développeurs</title>
     <link href="https://kandran.fr/obsidian-second-cerveau-developpeur/"/>
     <updated>2026-02-08T00:00:00+00:00</updated>
     <id>https://kandran.fr/obsidian</id>
     <content type="html">&lt;p&gt;Nous avons tous le même problème : des notes éparpillées entre des fichiers texte, des signets oubliés, des bouts de documentation perdus dans Slack et des idées griffonnées quelque part qu’on ne retrouve jamais. En tant que développeur, la quantité d’informations techniques à retenir est colossale. Langages, frameworks, configurations serveur, commandes obscures qu’on utilise deux fois par an… Impossible de tout garder en tête.&lt;/p&gt;

&lt;p&gt;C’est exactement là qu’intervient le concept de &lt;strong&gt;second cerveau&lt;/strong&gt; : un système externe pour capturer, organiser et retrouver ses connaissances. Et parmi les outils disponibles, Obsidian se démarque nettement pour les profils techniques. Pas parce qu’il est à la mode, mais parce que sa philosophie colle parfaitement avec notre façon de travailler.&lt;/p&gt;

&lt;h2 id=&quot;sommaire&quot;&gt;Sommaire&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#cest-quoi-obsidian-exactement&quot;&gt;C’est quoi Obsidian exactement&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#le-second-cerveau-pourquoi-cest-pertinent-pour-un-developpeur&quot;&gt;Le second cerveau : pourquoi c’est pertinent pour un développeur&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#repenser-le-classement-les-liens-plutot-que-les-dossiers&quot;&gt;Repenser le classement : les liens plutôt que les dossiers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#la-vue-graphe-visualiser-ses-connaissances&quot;&gt;La vue graphe : visualiser ses connaissances&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#obsidian-vs-notion-comparaison-pragmatique&quot;&gt;Obsidian vs Notion : comparaison pragmatique&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#les-plugins-essentiels-pour-les-developpeurs&quot;&gt;Les plugins essentiels pour les développeurs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ce-qui-peut-manquer&quot;&gt;Ce qui peut manquer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#pour-qui-obsidian-est-fait-et-pour-qui-il-ne-lest-pas&quot;&gt;Pour qui Obsidian est fait, et pour qui il ne l’est pas&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;cest-quoi-obsidian-exactement&quot;&gt;C’est quoi Obsidian exactement&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://obsidian.md/&quot; rel=&quot;nofollow&quot;&gt;Obsidian&lt;/a&gt; est un éditeur de notes basé sur le &lt;strong&gt;Markdown&lt;/strong&gt;. Jusque-là, rien de révolutionnaire. Ce qui change la donne, c’est son approche : vos notes sont de simples fichiers &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md&lt;/code&gt; stockés en local sur votre machine, dans un dossier classique. Pas de base de données propriétaire, pas de cloud obligatoire, pas de format fermé.&lt;/p&gt;

&lt;p&gt;Concrètement, votre &lt;strong&gt;vault&lt;/strong&gt; (coffre-fort en anglais) est un répertoire sur votre disque. Vous pouvez l’ouvrir avec n’importe quel éditeur de texte, le versionner avec Git, le synchroniser comme vous voulez. Et c’est là que réside la vraie force du modèle : même si Obsidian disparaît demain, vos fichiers restent parfaitement lisibles. Tant que vous avez l’application, tout tourne en local sans aucune dépendance extérieure. Et au pire, sans l’application, vos fichiers &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md&lt;/code&gt; sont du texte brut que vous pouvez ouvrir avec n’importe quel éditeur. Vous ne perdez jamais rien.&lt;/p&gt;

&lt;p&gt;L’interface est sobre et rapide. On lance l’application, on écrit en Markdown, on crée des liens entre les notes avec la syntaxe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[nom de la note]]&lt;/code&gt;, et c’est parti. Pas besoin de passer trois heures à configurer des bases de données ou des templates avant de commencer à écrire.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026/02/obsidian/obsidian.jpg&quot; alt=&quot;Interface d&apos;Obsidian avec l&apos;éditeur Markdown et la prévisualisation&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;le-second-cerveau--pourquoi-cest-pertinent-pour-un-développeur&quot;&gt;Le second cerveau : pourquoi c’est pertinent pour un développeur&lt;/h2&gt;

&lt;p&gt;Le concept de second cerveau, popularisé par Tiago Forte, repose sur une idée simple : &lt;strong&gt;externaliser sa mémoire&lt;/strong&gt; dans un système fiable et interrogeable. Au lieu de compter sur sa mémoire pour retenir une commande Docker, une config Nginx ou les subtilités d’une requête SQL, on les capture dans un système qu’on peut fouiller instantanément.&lt;/p&gt;

&lt;p&gt;Pour un développeur, c’est particulièrement puissant parce que notre métier consiste à jongler entre des dizaines de technologies. Personnellement je vous conseille de voir votre second cerveau comme une documentation vivante. Pas un wiki figé qu’on met à jour une fois par trimestre, mais un espace organique où chaque note peut se connecter à une autre.&lt;/p&gt;

&lt;p&gt;Prenons un exemple concret. Vous tombez sur un problème de performance MySQL. Vous creusez, vous trouvez la solution, vous la notez dans Obsidian. Trois mois plus tard, vous travaillez sur l’optimisation d’une API et vous tombez sur cette note en cherchant autre chose. Vous créez un lien. Six mois après, vous rédigez un article sur les bonnes pratiques SQL et vous avez déjà toute une toile de notes interconnectées sur le sujet. C’est ça, un second cerveau : une base de connaissances qui &lt;strong&gt;grandit et se structure au fil du temps&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;repenser-le-classement--les-liens-plutôt-que-les-dossiers&quot;&gt;Repenser le classement : les liens plutôt que les dossiers&lt;/h2&gt;

&lt;p&gt;C’est un changement de paradigme qui déstabilise au début. Dans un système classique, on passe un temps fou à se demander “je range cette note où ?”. Est-ce que ma note sur l’optimisation MySQL va dans le dossier “Base de données”, “Performance” ou “Projet X” ? Avec Obsidian, &lt;strong&gt;cette question perd de son importance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le vrai classement se fait par les &lt;strong&gt;liens entre les notes&lt;/strong&gt;, pas par l’arborescence de dossiers. Une note sur l’optimisation MySQL peut être liée à votre fiche projet, à votre note sur les index SQL, et à votre checklist de performance. Elle existe dans plusieurs contextes à la fois sans avoir besoin d’être dupliquée. C’est la vue graphe qui révèle ces relations, pas l’explorateur de fichiers.&lt;/p&gt;

&lt;p&gt;Cela ne veut pas dire qu’il faut abandonner toute structure de dossiers. En pratique, une organisation de base reste utile pour s’y retrouver. Voici un exemple d’architecture de vault qui fonctionne bien :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;01_INBOX&lt;/strong&gt; : point d’entrée de toutes les nouvelles notes, à trier ensuite&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;02_RESSOURCES&lt;/strong&gt; : documentation technique, références, fiches outils&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;03_PROJECT&lt;/strong&gt; : notes liées à des projets en cours&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;04_PERMANENT&lt;/strong&gt; : notes mûries, retravaillées, qui constituent le cœur du second cerveau&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;05_MOC&lt;/strong&gt; : Maps of Content, des notes d’index qui regroupent des liens thématiques&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;06_ARCHIVES&lt;/strong&gt; : projets terminés, notes obsolètes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;07_TEMPLATE&lt;/strong&gt; : modèles de notes réutilisables&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;08_ASSETS&lt;/strong&gt; : images, pièces jointes, fichiers annexes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;09_READWISE&lt;/strong&gt; : notes importées depuis vos lectures (si vous utilisez Readwise)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le tout chapeauté par une note &lt;strong&gt;00_Index&lt;/strong&gt; qui sert de point d’entrée vers les MOC principaux.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026/02/obsidian/structure.png&quot; alt=&quot;Architecture d&apos;un vault Obsidian avec dossiers numérotés de 01_INBOX à 09_READWISE&quot; /&gt; &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;L’idée c’est que les dossiers servent de &lt;strong&gt;grandes zones de travail&lt;/strong&gt;, mais c’est le réseau de liens et les MOC (Maps of Content) qui assurent la vraie navigation. Une note dans 04_PERMANENT peut être reliée à trois projets dans 03_PROJECT et référencée dans deux MOC différents. Le dossier devient secondaire, le lien devient primaire.&lt;/p&gt;

&lt;h2 id=&quot;la-vue-graphe--visualiser-ses-connaissances&quot;&gt;La vue graphe : visualiser ses connaissances&lt;/h2&gt;

&lt;p&gt;C’est probablement la fonctionnalité la plus impressionnante d’Obsidian et celle qui donne tout son sens au concept de second cerveau. La &lt;strong&gt;vue graphe&lt;/strong&gt; affiche toutes vos notes sous forme de nœuds reliés entre eux par des traits. Chaque lien &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[interne]]&lt;/code&gt; que vous créez dessine une connexion visible.&lt;/p&gt;

&lt;p&gt;Maintenant que nous avons vu comment les notes se connectent individuellement, imaginez le résultat avec des centaines de notes. La vue graphe révèle des &lt;strong&gt;clusters thématiques&lt;/strong&gt; : vous voyez émerger des groupes autour de vos sujets principaux. Un cluster Docker, un cluster sécurité, un cluster JavaScript… Et surtout, vous repérez les ponts entre ces clusters, ces notes qui font le lien entre deux domaines que vous n’aviez pas consciemment associés.&lt;/p&gt;

&lt;p&gt;Pour un développeur, cette visualisation est précieuse pour plusieurs raisons :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Elle identifie les &lt;strong&gt;zones de connaissance denses&lt;/strong&gt; et les zones vides, ce qui aide à orienter sa veille technique.&lt;/li&gt;
  &lt;li&gt;Elle met en lumière les &lt;strong&gt;connexions transversales&lt;/strong&gt; entre des technologies différentes.&lt;/li&gt;
  &lt;li&gt;Elle révèle les &lt;strong&gt;notes orphelines&lt;/strong&gt;, ces fichiers isolés qu’on a créés sans jamais les relier au reste.&lt;/li&gt;
  &lt;li&gt;Elle donne une vue d’ensemble de son expertise technique d’un seul coup d’œil.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La vue graphe supporte aussi les filtres et la coloration par dossier ou par tag, ce qui permet de se concentrer sur un sous-ensemble de notes quand le vault grossit.&lt;/p&gt;

&lt;h3 id=&quot;exemple-concret--cartographie-applicative-et-réseau&quot;&gt;Exemple concret : cartographie applicative et réseau&lt;/h3&gt;

&lt;p&gt;La vue graphe peut servir de &lt;strong&gt;cartographie légère&lt;/strong&gt; pour documenter une infrastructure. Imaginons que vous créez une note par composant de votre stack : une note &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[API Gateway]]&lt;/code&gt;, une note &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[Service Auth]]&lt;/code&gt;, une note &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[Service Paiement]]&lt;/code&gt;, une note &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[PostgreSQL Production]]&lt;/code&gt;, une note &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[Redis Cache]]&lt;/code&gt;. Dans chaque note, vous décrivez le composant et vous liez les notes entre elles selon les dépendances : l’API Gateway appelle le Service Auth, le Service Paiement tape dans PostgreSQL, le Redis Cache est utilisé par les deux services.&lt;/p&gt;

&lt;p&gt;Le même principe fonctionne pour une &lt;strong&gt;cartographie réseau&lt;/strong&gt; : une note par serveur, par VLAN ou par service. Vous notez les IP, les ports exposés, les règles firewall, et vous reliez le tout. La vue graphe vous montre alors d’un coup d’œil quel serveur communique avec quel autre et vous repérez rapidement un service isolé ou un point de convergence critique.&lt;/p&gt;

&lt;p&gt;Il faut être honnête : pour une cartographie complète et maintenue en production, des outils dédiés comme Netbox, DrawIO ou des solutions d’ITSM feront un meilleur travail. Mais pour une &lt;strong&gt;documentation personnelle rapide&lt;/strong&gt;, un mapping mental de votre infra ou la compréhension d’un nouveau SI quand vous arrivez sur un projet, Obsidian et sa vue graphe sont redoutablement efficaces. Le ratio effort/valeur est imbattable.&lt;/p&gt;

&lt;h2 id=&quot;obsidian-vs-notion--comparaison-pragmatique&quot;&gt;Obsidian vs Notion : comparaison pragmatique&lt;/h2&gt;

&lt;p&gt;Impossible de parler d’Obsidian sans évoquer Notion. Les deux outils sont souvent comparés, mais ils répondent à des philosophies radicalement différentes.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Critère&lt;/th&gt;
      &lt;th&gt;Obsidian&lt;/th&gt;
      &lt;th&gt;Notion&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Stockage&lt;/td&gt;
      &lt;td&gt;Local (fichiers .md)&lt;/td&gt;
      &lt;td&gt;Cloud (propriétaire)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Format&lt;/td&gt;
      &lt;td&gt;Markdown standard&lt;/td&gt;
      &lt;td&gt;Format propriétaire&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hors-ligne&lt;/td&gt;
      &lt;td&gt;Natif, toujours disponible&lt;/td&gt;
      &lt;td&gt;Limité, dépend du cache&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Vitesse&lt;/td&gt;
      &lt;td&gt;Très rapide&lt;/td&gt;
      &lt;td&gt;Peut être lent sur gros espaces&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Versioning Git&lt;/td&gt;
      &lt;td&gt;Natif (ce sont des fichiers)&lt;/td&gt;
      &lt;td&gt;Impossible&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Collaboration&lt;/td&gt;
      &lt;td&gt;Possible mais limitée&lt;/td&gt;
      &lt;td&gt;Excellente&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Courbe d&apos;apprentissage&lt;/td&gt;
      &lt;td&gt;Modérée&lt;/td&gt;
      &lt;td&gt;Faible&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Personnalisation&lt;/td&gt;
      &lt;td&gt;Totale (CSS, plugins JS)&lt;/td&gt;
      &lt;td&gt;Limitée aux blocs natifs&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Propriété des données&lt;/td&gt;
      &lt;td&gt;Totale&lt;/td&gt;
      &lt;td&gt;Chez Notion&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Notion excelle pour le &lt;strong&gt;travail collaboratif&lt;/strong&gt; et la gestion de projet en équipe. Il faut être honnête là-dessus. Si vous cherchez un espace partagé avec votre équipe pour gérer des sprints ou un wiki d’entreprise, Notion fait très bien le travail.&lt;/p&gt;

&lt;p&gt;Mais pour un usage personnel de &lt;strong&gt;base de connaissances technique&lt;/strong&gt;, Obsidian gagne sur quasiment tous les critères qui comptent pour un développeur : rapidité, hors-ligne, Git, Markdown pur, et surtout la certitude que vos données ne dépendent de personne. Le jour où Notion change ses tarifs, son API ou ferme boutique, vos données sont coincées. Avec Obsidian, ce problème n’existe pas.&lt;/p&gt;

&lt;h3 id=&quot;et-la-collaboration-avec-obsidian-&quot;&gt;Et la collaboration avec Obsidian ?&lt;/h3&gt;

&lt;p&gt;La collaboration est possible mais il faut être lucide : ce n’est pas le point fort d’Obsidian. Vous pouvez partager un vault via &lt;strong&gt;Google Drive&lt;/strong&gt;, &lt;strong&gt;Dropbox&lt;/strong&gt; ou un &lt;strong&gt;dépôt Git&lt;/strong&gt; partagé. Ça fonctionne, mais ce n’est pas toujours simple. Avec un partage cloud type Drive, les conflits de fichiers peuvent arriver si deux personnes éditent la même note en même temps. Avec Git, c’est plus propre grâce à la gestion des merges, mais ça suppose que tous les collaborateurs soient à l’aise avec Git.&lt;/p&gt;

&lt;p&gt;Pour un usage en binôme ou en petite équipe technique, le partage via Git reste la meilleure option. Pour de la vraie collaboration temps réel avec des profils non-techniques, il vaut mieux garder Notion ou un autre outil collaboratif à côté.&lt;/p&gt;

&lt;h2 id=&quot;les-plugins-essentiels-pour-les-développeurs&quot;&gt;Les plugins essentiels pour les développeurs&lt;/h2&gt;

&lt;p&gt;La force d’Obsidian réside aussi dans son &lt;strong&gt;écosystème de plugins communautaires&lt;/strong&gt;. Il en existe des centaines, mais voici ceux qui font la différence pour un profil technique.&lt;/p&gt;

&lt;h3 id=&quot;dataview&quot;&gt;Dataview&lt;/h3&gt;

&lt;p&gt;Dataview transforme votre vault en une base de données interrogeable. Vous écrivez des requêtes en pseudo-SQL directement dans vos notes pour afficher des tableaux dynamiques. Par exemple, lister toutes vos notes taguées &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#bug&lt;/code&gt; créées ce mois-ci, ou afficher un tableau de vos projets en cours avec leur statut. Pour quelqu’un qui pense en SQL, c’est naturel.&lt;/p&gt;

&lt;h3 id=&quot;git-obsidian-git&quot;&gt;Git (Obsidian Git)&lt;/h3&gt;

&lt;p&gt;Ce plugin automatise les commits et pushs de votre vault vers un dépôt Git. Vous configurez un intervalle (toutes les 10 minutes par exemple), et votre vault est versionné automatiquement. Historique complet, branches, diff… Tout ce qu’on aime avec Git, appliqué à ses notes. Cela dit, le plugin n’est pas obligatoire : vous pouvez très bien gérer vos commits manuellement en ligne de commande ou via un script cron. Le plugin ajoute simplement le confort de l’automatisation dans l’interface.&lt;/p&gt;

&lt;h3 id=&quot;templater&quot;&gt;Templater&lt;/h3&gt;

&lt;p&gt;Templater va plus loin que le système de templates natif, ce qui permet d’automatiser la création de notes avec des dates dynamiques etc. Idéal pour standardiser ses notes de debug, ses comptes-rendus de veille ou ses fiches projet.&lt;/p&gt;

&lt;h3 id=&quot;calendar-et-periodic-notes&quot;&gt;Calendar et Periodic Notes&lt;/h3&gt;

&lt;p&gt;Calendar affiche un calendrier dans la barre latérale qui permet de naviguer rapidement entre vos notes quotidiennes. Couplé à &lt;strong&gt;Periodic Notes&lt;/strong&gt;, vous pouvez mettre en place un système de journaling technique : une note par jour, par semaine ou par mois, générée automatiquement depuis un template. Pratique pour garder une trace de ce qu’on a fait, débugué ou appris chaque jour.&lt;/p&gt;

&lt;h3 id=&quot;les-plugins-du-quotidien&quot;&gt;Les plugins du quotidien&lt;/h3&gt;

&lt;p&gt;Quelques plugins plus discrets mais qui améliorent le confort au quotidien : &lt;strong&gt;Copy Button for Code Blocks&lt;/strong&gt; ajoute un bouton de copie sur chaque bloc de code (indispensable quand on documente des commandes), &lt;strong&gt;Editor Syntax Highlight&lt;/strong&gt; améliore la coloration syntaxique dans l’éditeur, &lt;strong&gt;Sliding Panes&lt;/strong&gt; permet d’afficher plusieurs notes côte à côte en panneaux glissants pour comparer ou croiser des informations, &lt;strong&gt;Tracker&lt;/strong&gt; permet de suivre des données au fil du temps (habitudes, métriques, objectifs), et &lt;strong&gt;Advanced Tables&lt;/strong&gt; rend l’écriture de tableaux Markdown supportable avec la navigation par tabulation et le formatage automatique.&lt;/p&gt;

&lt;p&gt;Si vous utilisez &lt;strong&gt;Readwise&lt;/strong&gt; pour centraliser vos highlights de lecture, le plugin &lt;strong&gt;Readwise Official&lt;/strong&gt; synchronise automatiquement vos annotations dans votre vault, prêtes à être liées au reste de vos notes.&lt;/p&gt;

&lt;h2 id=&quot;ce-qui-peut-manquer&quot;&gt;Ce qui peut manquer&lt;/h2&gt;

&lt;p&gt;Obsidian n’est pas parfait et il y a des points qui peuvent manquer selon votre usage. La &lt;strong&gt;recherche et remplacement globale&lt;/strong&gt; sur l’ensemble du vault est basique comparée à ce que propose un IDE. Le &lt;strong&gt;support mobile&lt;/strong&gt; fonctionne mais reste moins fluide que sur desktop, surtout avec un vault volumineux. Il n’y a &lt;strong&gt;pas de tableaux de bord natifs&lt;/strong&gt; comme dans Notion : il faut passer par Dataview pour obtenir quelque chose d’approchant, ce qui demande un temps d’apprentissage.&lt;/p&gt;

&lt;p&gt;Le &lt;strong&gt;partage de notes&lt;/strong&gt; vers l’extérieur n’est pas simple non plus. Si vous voulez publier une note en ligne, il faut soit payer pour Obsidian Publish, soit mettre en place un pipeline d’export (vers Jekyll, Hugo ou autre). Pas insurmontable, mais c’est du travail en plus.&lt;/p&gt;

&lt;p&gt;Enfin, la gestion des &lt;strong&gt;pièces jointes et images&lt;/strong&gt; peut vite devenir désordonnée si on ne configure pas un dossier dédié dès le départ (comme le dossier 08_ASSETS mentionné plus haut). Par défaut, Obsidian colle les images à la racine du vault, ce qui devient vite le bazar.&lt;/p&gt;

&lt;h2 id=&quot;pour-qui-obsidian-est-fait-et-pour-qui-il-ne-lest-pas&quot;&gt;Pour qui Obsidian est fait, et pour qui il ne l’est pas&lt;/h2&gt;

&lt;p&gt;Il faut éviter de tomber dans le piège du “c’est l’outil parfait pour tout le monde”. Obsidian a ses limites et il vaut mieux les connaître avant de migrer toutes ses notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obsidian est fait pour vous si :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Vous êtes à l’aise avec le Markdown.&lt;/li&gt;
  &lt;li&gt;Vous voulez garder le contrôle total sur vos données.&lt;/li&gt;
  &lt;li&gt;Vous cherchez un espace de notes personnel, pas un outil collaboratif.&lt;/li&gt;
  &lt;li&gt;Vous aimez personnaliser vos outils (CSS, plugins, raccourcis).&lt;/li&gt;
  &lt;li&gt;Vous avez besoin de travailler hors-ligne régulièrement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Obsidian n’est probablement pas pour vous si :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Vous avez besoin de collaboration en temps réel avec une équipe.&lt;/li&gt;
  &lt;li&gt;Vous ne voulez pas toucher au Markdown.&lt;/li&gt;
  &lt;li&gt;Vous cherchez un outil clé en main sans configuration.&lt;/li&gt;
  &lt;li&gt;Vous avez besoin de bases de données relationnelles complexes (Notion fait mieux ici).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personnellement, après plus de trois ans d’utilisation, le plus gros avantage reste la &lt;strong&gt;pérennité&lt;/strong&gt;. Mes notes d’il y a plusieurs années sont toujours là, toujours lisibles, toujours connectées. Aucun changement de tarif, aucune migration forcée, aucune fonctionnalité supprimée du jour au lendemain. Pour un second cerveau, la durabilité est un critère fondamental.&lt;/p&gt;

&lt;p&gt;Obsidian ne va pas transformer votre façon de travailler du jour au lendemain. Il faut accepter de construire son vault progressivement, note après note, lien après lien. Mais une fois que la masse critique est atteinte et que la vue graphe commence à dessiner les contours de votre expertise, l’outil devient indispensable. Le meilleur moment pour commencer, c’est maintenant. Créez un vault, prenez votre première note technique, et laissez votre second cerveau grandir avec vous.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Feature Flags : Maîtrisez le déploiement et l'activation de vos fonctionnalités</title>
     <link href="https://kandran.fr/feature-flags-guide-ultime"/>
     <updated>2025-04-13T00:00:00+00:00</updated>
     <id>https://kandran.fr/feature-flags</id>
     <content type="html">&lt;p&gt;Déployer de nouvelles fonctionnalités sans risquer de déstabiliser tout votre système peut rapidement devenir un casse-tête pour les équipes de développement. Les &lt;strong&gt;feature flags offrent une solution élégante&lt;/strong&gt; à ce problème en permettant d’activer ou désactiver des portions de code à la demande, même en environnement de production. Grâce à cette technique, les développeurs peuvent intégrer du code dans la branche principale tout en gardant le contrôle sur son activation, facilitant ainsi les tests utilisateurs et accélérant le cycle de déploiement des applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En résumé&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;🚀 Accélérez vos déploiements grâce aux feature flags : activez ou désactivez vos fonctionnalités sans risque.&lt;/li&gt;
  &lt;li&gt;✅ Réduisez les incidents en production avec les déploiements progressifs et sécurisés.&lt;/li&gt;
  &lt;li&gt;📊 Améliorez l’expérience utilisateur grâce aux tests A/B et à l’expérimentation continue.&lt;/li&gt;
  &lt;li&gt;🔑 Gérez précisément l’accès aux nouvelles fonctionnalités avec des contrôles avancés (accès anticipé, fonctionnalités premium).&lt;/li&gt;
  &lt;li&gt;🛡️ Protégez votre produit grâce à la désactivation immédiate des fonctionnalités critiques (kill switch).&lt;/li&gt;
  &lt;li&gt;⚠️ Anticipez les défis techniques liés aux feature flags (complexité du code, dette technique, impact sur les performances).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;sommaire&quot;&gt;Sommaire&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#quest-ce-que-les-feature-flags&quot;&gt;Qu’est-ce que les feature flags ?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#avantages-et-cas-dusage&quot;&gt;Avantages et cas d’usage des feature flags&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#implementation-des-feature-flags&quot;&gt;Implémentation des feature flags&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#outils-et-solutions&quot;&gt;Outils et solutions pour gérer les feature flags&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#cas-dusage-avances&quot;&gt;Cas d’usage avancés des feature flags&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#limitations-et-defis&quot;&gt;Limitations et défis des feature flags&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;quest-ce-que-les-feature-flags&quot;&gt;Qu&apos;est-ce que les feature flags ?&lt;/h2&gt;

&lt;h3 id=&quot;définition-et-principe-de-fonctionnement&quot;&gt;Définition et principe de fonctionnement&lt;/h3&gt;

&lt;p&gt;Les feature flags sont une technique de développement permettant d’&lt;strong&gt;activer ou désactiver des fonctionnalités&lt;/strong&gt; à la demande, sans nécessiter de nouveau déploiement de code en production.&lt;/p&gt;

&lt;p&gt;Le principe technique derrière les feature flags repose sur des &lt;strong&gt;structures conditionnelles intégrées&lt;/strong&gt; dans le code source de l’application. Ces interrupteurs virtuels vérifient l’état d’un flag (activé ou désactivé) et exécutent ensuite le code approprié selon cette condition.&lt;/p&gt;

&lt;h3 id=&quot;terminologie-et-appellations-alternatives&quot;&gt;Terminologie et appellations alternatives&lt;/h3&gt;

&lt;p&gt;Dans l’industrie du développement logiciel, les &lt;strong&gt;feature flags sont également connus&lt;/strong&gt; sous d’autres appellations comme “feature toggles”, “feature switches” ou “feature flippers”.&lt;/p&gt;

&lt;p&gt;Ces différentes terminologies désignent fondamentalement &lt;strong&gt;le même concept technique&lt;/strong&gt;, mais peuvent refléter des nuances dans leur utilisation selon les contextes d’entreprise ou les communautés de développeurs qui les emploient.&lt;/p&gt;

&lt;h3 id=&quot;types-de-feature-flags&quot;&gt;Types de feature flags&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type de Feature Flag&lt;/th&gt;
      &lt;th&gt;Objectif Principal&lt;/th&gt;
      &lt;th&gt;Cas d’Usage&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Release Flags&lt;/td&gt;
      &lt;td&gt;Séparer déploiement du code et mise en production&lt;/td&gt;
      &lt;td&gt;Déploiements progressifs, versions Canary&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Experimentation Flags&lt;/td&gt;
      &lt;td&gt;Tests A/B et validation des changements&lt;/td&gt;
      &lt;td&gt;Tests A/B, analyse de l’impact des fonctionnalités&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Operational Flags&lt;/td&gt;
      &lt;td&gt;Contrôle des aspects opérationnels du système&lt;/td&gt;
      &lt;td&gt;Gestion des incidents, maintenance du système&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Permission Flags&lt;/td&gt;
      &lt;td&gt;Gestion des accès aux fonctionnalités&lt;/td&gt;
      &lt;td&gt;Accès anticipé, tests bêta, fonctionnalités premium&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Légende&lt;/strong&gt; : Ce tableau compare les différents types de feature flags en fonction de leur objectif principal et de leurs cas d’usage typiques.&lt;/p&gt;

&lt;h3 id=&quot;feature-flags-vs-branching&quot;&gt;Feature flags vs branching&lt;/h3&gt;

&lt;p&gt;La différence &lt;strong&gt;fondamentale entre feature flags et branching&lt;/strong&gt; réside dans la manière dont le code est géré pendant le développement et le déploiement des fonctionnalités.&lt;/p&gt;

&lt;p&gt;Les feature flags présentent un avantage majeur dans un contexte DevOps car ils &lt;strong&gt;permettent d’intégrer le code plus fréquemment&lt;/strong&gt; dans la branche principale. Cette approche réduit considérablement les conflits de fusion tout en permettant aux équipes de tester en production de manière sécurisée grâce à l’activation sélective des fonctionnalités.&lt;/p&gt;

&lt;h2 id=&quot;avantages-et-cas-dusage&quot;&gt;Avantages et cas d&apos;usage des feature flags&lt;/h2&gt;

&lt;p&gt;L’utilisation des &lt;strong&gt;feature flags transforme profondément&lt;/strong&gt; la façon dont les équipes abordent le développement logiciel :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Réduction des risques&lt;/strong&gt; : minimise les risques associés aux déploiements.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Collaboration améliorée&lt;/strong&gt; : améliore la collaboration entre les équipes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gain de temps&lt;/strong&gt; : accélère les tests en production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les feature flags permettent notamment de découpler la livraison du code de l’activation des fonctionnalités, facilitant ainsi les campagnes marketing et la gestion des incidents.&lt;/p&gt;

&lt;h2 id=&quot;implementation-des-feature-flags&quot;&gt;Implémentation des feature flags&lt;/h2&gt;

&lt;h3 id=&quot;comment-intégrer-les-feature-flags-dans-le-code&quot;&gt;Comment intégrer les feature flags dans le code&lt;/h3&gt;

&lt;p&gt;L’implémentation consiste à placer des mécanismes conditionnels pour activer ou désactiver des fonctionnalités. Il faut éviter les imbrications complexes qui rendent le code difficile à maintenir.&lt;/p&gt;

&lt;h3 id=&quot;bonnes-pratiques-pour-la-gestion-des-feature-flags&quot;&gt;Bonnes pratiques pour la gestion des feature flags&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Nommer efficacement&lt;/strong&gt; : convention claire pour les flags.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Nettoyer régulièrement&lt;/strong&gt; : éliminer les flags obsolètes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Documenter&lt;/strong&gt; : garder une documentation précise de chaque flag.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;gérer-le-cycle-de-vie-des-feature-flags&quot;&gt;Gérer le cycle de vie des feature flags&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Étape&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Définition&lt;/td&gt;
      &lt;td&gt;Création du feature flag, aucune métrique détectée&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Développement&lt;/td&gt;
      &lt;td&gt;Métriques reçues en environnement de test&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Production&lt;/td&gt;
      &lt;td&gt;Premiers utilisateurs exposés au feature flag&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Nettoyage&lt;/td&gt;
      &lt;td&gt;Suppression après réalisation de l’objectif&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Archivage&lt;/td&gt;
      &lt;td&gt;Conservation pour référence future&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Légende&lt;/strong&gt; : Cycle complet de gestion d’un feature flag.&lt;/p&gt;

&lt;h3 id=&quot;tests-et-monitoring-avec-les-feature-flags&quot;&gt;Tests et monitoring avec les feature flags&lt;/h3&gt;

&lt;p&gt;Un monitoring rigoureux est nécessaire pour évaluer l’impact des activations en production, en surveillant performances et engagements utilisateurs.&lt;/p&gt;

&lt;h2 id=&quot;outils-et-solutions&quot;&gt;Outils et solutions pour gérer les feature flags&lt;/h2&gt;

&lt;h3 id=&quot;solutions-open-source&quot;&gt;Solutions open-source&lt;/h3&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Solution&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Avantages&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Unleash&lt;/td&gt;
      &lt;td&gt;Plateforme de gestion des fonctionnalités&lt;/td&gt;
      &lt;td&gt;Déploiement progressif, tests en production&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;OpenFeature&lt;/td&gt;
      &lt;td&gt;API indépendante du fournisseur&lt;/td&gt;
      &lt;td&gt;Flexibilité, changement de fournisseur facile&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;solutions-saas-et-commerciales&quot;&gt;Solutions SaaS et commerciales&lt;/h3&gt;

&lt;p&gt;Pour des besoins avancés, plusieurs plateformes SaaS offrent intégration et analyses poussées.&lt;/p&gt;

&lt;h3 id=&quot;intégration-avec-les-environnements-devops&quot;&gt;Intégration avec les environnements DevOps&lt;/h3&gt;

&lt;p&gt;Intégration transparente avec GitLab, GitHub, Jira pour une gestion complète depuis l’environnement habituel des équipes.&lt;/p&gt;

&lt;h3 id=&quot;développer-sa-propre-solution&quot;&gt;Développer sa propre solution&lt;/h3&gt;

&lt;p&gt;Option pertinente uniquement lorsque les solutions existantes ne répondent pas à des exigences spécifiques.&lt;/p&gt;

&lt;h2 id=&quot;cas-dusage-avances&quot;&gt;Cas d&apos;usage avancés des feature flags&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Déploiement progressif&lt;/strong&gt; : réduit les risques en activant progressivement les fonctionnalités.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tests A/B et expérimentation&lt;/strong&gt; : optimise l’engagement utilisateur grâce aux tests multiples.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gestion des accès utilisateurs&lt;/strong&gt; : contrôle précis des accès aux fonctionnalités.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Kill switch&lt;/strong&gt; : désactivation immédiate d’une fonctionnalité en cas d’incident critique.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;limitations-et-defis&quot;&gt;Limitations et défis des feature flags&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Complexité technique&lt;/strong&gt; : difficulté croissante du code et des tests.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dette technique&lt;/strong&gt; : nécessité d’une gestion stricte des flags obsolètes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Impact sur les performances&lt;/strong&gt; : surcharge potentielle due à l’évaluation constante.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Considérations organisationnelles&lt;/strong&gt; : besoin d’une collaboration étroite entre équipes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bonnes pratiques pour réduire ces défis&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Utilisation de la mise en cache&lt;/li&gt;
  &lt;li&gt;Évaluation conditionnelle limitée&lt;/li&gt;
  &lt;li&gt;Planification stratégique de l’intégration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les feature flags apportent flexibilité et sécurité au processus de déploiement, à condition d’être gérés rigoureusement pour éviter toute complexité inutile.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Gophish : Guide complet pour simuler des campagnes de phishing et renforcer la sécurité de votre entreprise</title>
     <link href="https://kandran.fr/gophish-campagne-phishing"/>
     <updated>2025-03-21T00:00:00+00:00</updated>
     <id>https://kandran.fr/gophish</id>
     <content type="html">&lt;div class=&quot;warning-block&quot;&gt;
  &lt;p&gt;⚠️ &lt;strong&gt;Avertissement :&lt;/strong&gt;&lt;/p&gt;
  &lt;p&gt;
    Cet article présente l’outil &lt;strong&gt;Gophish&lt;/strong&gt; dans un objectif strictement pédagogique  et préventif, visant exclusivement à sensibiliser les utilisateurs aux risques liés au phishing.
    &lt;br /&gt;
    L’usage de cet outil doit impérativement se faire dans un cadre légal précis, avec l’autorisation explicite de l’organisation concernée et en conformité totale avec la réglementation en vigueur (notamment le RGPD et le Code pénal).
    &lt;br /&gt;
    &lt;strong&gt;
      Toute utilisation à des fins malveillantes ou hors du cadre autorisé de sensibilisation constitue un délit et expose son auteur à des poursuites et sanctions pénales lourdes.
    &lt;/strong&gt;
  &lt;/p&gt;
  &lt;p&gt;
    L’auteur décline toute responsabilité en cas d’usage abusif ou illégal de l’information fournie dans cet article.
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Le phishing, &lt;strong&gt;véritable fléau de la cybersécurité&lt;/strong&gt;, constitue une menace persistante pour les organisations. Comment mesurer concrètement la sensibilité de vos collaborateurs à ces attaques ? Nous vous présentons ici &lt;strong&gt;Gophish&lt;/strong&gt;, &lt;strong&gt;solution open source permettant de simuler des campagnes d&apos;hameçonnage&lt;/strong&gt; et d&apos;améliorer la vigilance collective. De l&apos;installation à l&apos;analyse des résultats, cet outil offre &lt;strong&gt;une approche pragmatique pour tester vos dispositifs de sécurité&lt;/strong&gt;. Vous verrez notamment comment adapter les paramètres selon votre infrastructure et interpréter les statistiques pour des actions ciblées.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2025/03/gophish/gophish_campaign.png&quot; alt=&quot;Illustration interface campagne gophish&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;Sommaire&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#gophish-outil-simulation-phishing-educative&quot;&gt;Gophish : outil de simulation phishing à visée éducative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#installation-configuration-gophish&quot;&gt;Configuration et déploiement de Gophish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#creation-campagnes-simulations&quot;&gt;Création de campagnes de simulations réalistes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#analyse-resultats-amelioration&quot;&gt;Analyse des résultats et mesures d&apos;amélioration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bonnes-pratiques-securite&quot;&gt;Bonnes pratiques de sécurité opérationnelle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#alternatives-complementaires&quot;&gt;Alternatives et outils complémentaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#optimisation-avancee&quot;&gt;Optimisation avancée et veille technologique&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;gophish-outil-simulation-phishing-educative&quot;&gt;Gophish : outil de simulation phishing à visée éducative&lt;/h2&gt;
&lt;h3&gt;Définition et objectifs de la solution&lt;/h3&gt;
&lt;p&gt;Gophish est une solution conçue pour &lt;strong&gt;évaluer et améliorer la sensibilisation des utilisateurs aux risques de phishing&lt;/strong&gt;. Son rôle ? Aider les entreprises à &lt;strong&gt;organiser des simulations d&apos;attaques réalistes&lt;/strong&gt;, permettant d&apos;identifier les vulnérabilités humaines et techniques. Un atout précieux pour les équipes en charge de la sécurité des mails et des données sensibles.&lt;/p&gt;
&lt;p&gt;Signalons que Gophish se distingue par ses fonctionnalités techniques orientées vers l&apos;action concrète :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interface web intuitive&lt;/strong&gt; : La plateforme &lt;strong&gt;simplifie la configuration des campagnes&lt;/strong&gt; grâce à un tableau de bord centralisé. Les entreprises peuvent ainsi &lt;strong&gt;créer des pages de phishing réalistes&lt;/strong&gt; en quelques clics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personnalisation des mails&lt;/strong&gt; : L&apos;outil permet &lt;strong&gt;d&apos;adapter chaque message aux spécificités des utilisateurs ciblés&lt;/strong&gt;. Une fonctionnalité particulièrement utile pour simuler des attaques réaliste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion des destinataires&lt;/strong&gt; : L&apos;outil propose des fonctionnalité pour importer et gérer des listes de destinataires, facilitant ainsi le ciblage des campagnes.&amp;nbsp;Les campagnes peuvent ainsi &lt;strong&gt;segmenter les départements ou niveaux hiérarchiques&lt;/strong&gt; pour des tests plus pertinents. Gophish ne propose pas nativement l&apos;intégration avec Active Directory. Cependant, des scripts tiers, comme &lt;a href=&quot;https://github.com/MD-AlHowsa/GoLDAP&quot; target=&quot;_blank&quot; rel=&quot;noopener nofolow&quot;&gt;GoLDAP&lt;/a&gt;, permettent d&apos;importer des utilisateurs depuis Active Directory via le protocole LDAP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyse des résultats&lt;/strong&gt; : Chaque campagne génère &lt;strong&gt;des rapports détaillés sur les taux d&apos;ouverture de mails et les interactions avec les pages frauduleuses&lt;/strong&gt;. Ces données servent de base aux formations correctives.&lt;/li&gt;
&lt;li&gt;&lt;strong data-start=&quot;927&quot; data-end=&quot;956&quot;&gt;Étalement des campagnes :&lt;/strong&gt; Une campagne peut s&apos;exécuter rapidement, mais également être étalée sur une période plus longue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En pratique, les entreprises utilisent souvent Gophish en complément de tutoriels de sensibilisation. Cette combinaison permet de &lt;strong&gt;transformer chaque simulation en opportunité pédagogique&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Cadre légal et bonnes pratiques d&apos;utilisation&lt;/h3&gt;
&lt;p&gt;&lt;strong data-start=&quot;104&quot; data-end=&quot;119&quot;&gt;Attention :&lt;/strong&gt; les simulations de phishing doivent &lt;strong&gt;respecter strictement le RGPD ainsi que les règles et conventions internes&lt;/strong&gt; à l&apos;entreprise. Les collaborateurs doivent être informés clairement de la nature, des objectifs pédagogiques des tests, ainsi que du traitement prévu de leurs données personnelles. Cette information préalable peut prendre la forme de clauses contractuelles, de tutoriels ou de communications explicatives régulières.&lt;br data-start=&quot;547&quot; data-end=&quot;550&quot; /&gt;La collecte des données personnelles lors des simulations doit se limiter strictement aux informations nécessaires à l&apos;objectif poursuivi (principe de minimisation). De même, la durée de conservation de ces données doit être la plus courte possible, afin de réduire significativement les risques en cas de fuite ou d&apos;accès non autorisé. Enfin, il est recommandé d&apos;anonymiser systématiquement les résultats des campagnes afin de protéger la vie privée des utilisateurs et d&apos;éviter toute stigmatisation individuelle.&lt;/p&gt;
&lt;h3 data-start=&quot;543&quot; data-end=&quot;578&quot;&gt;Bonnes pratiques recommandées :&lt;/h3&gt;
&lt;p data-start=&quot;582&quot; data-end=&quot;739&quot;&gt;Parmi les conseils utiles il y&apos;a les suivant :&lt;/p&gt;
&lt;ul&gt;
&lt;li data-start=&quot;582&quot; data-end=&quot;739&quot;&gt;&lt;strong data-start=&quot;582&quot; data-end=&quot;615&quot;&gt;Anonymisation des résultats :&lt;/strong&gt; Pour préserver la transparence tout en évitant la stigmatisation individuelle, il est recommandé d&apos;anonymiser les résultats des simulations. Cette approche permet aux équipes de considérer les résultats de façon collective, sans pointer du doigt les erreurs individuelles&lt;/li&gt;
&lt;li data-start=&quot;582&quot; data-end=&quot;739&quot;&gt;&lt;span class=&quot;relative -mx-px my-[-0.2rem] rounded px-px py-[0.2rem]&quot;&gt;&lt;strong data-start=&quot;743&quot; data-end=&quot;769&quot;&gt;Absence de sanctions :&lt;/strong&gt; Il est déconseillé de sanctionner les employés ayant échoué aux tests de phishing. Des sanctions pourraient décourager les collaborateurs de signaler de véritables tentatives de phishing par crainte de représailles, compromettant ainsi la sécurité globale de l&apos;entreprise. En revanche, il est recommandé d&apos;accompagner systématiquement les échecs d&apos;une sensibilisation complémentaire afin de prévenir la répétition des erreurs.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;582&quot; data-end=&quot;739&quot;&gt;&lt;span class=&quot;relative -mx-px my-[-0.2rem] rounded px-px py-[0.2rem]&quot;&gt;&lt;strong&gt;Formation :&lt;/strong&gt; En parallèle il faut continuer la formation et la sensibilisation&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Intégration dans une stratégie de sécurité&lt;/h3&gt;
&lt;p&gt;Les résultats des campagnes alimentent directement les plans de formation. En &lt;strong&gt;croisant les données serveur et les comportements utilisateur&lt;/strong&gt;, les équipes sécurité peuvent &lt;strong&gt;prioriser les actions correctives&lt;/strong&gt;. On regardera le profils des utilisateurs n&apos;ayant pas réussi la simulation (compte a risque etc), les métriques de base (ouvertures, clic, remplissage) mais aussi les remontées. En effet la durée entre la premiere reception et la premiere remonté est un indicateur utile en cas de réelle attaque. Cela permet de voir le délais avant de pouvoir communiquer voire même couper l&apos;accès a certains liens malveillant.&lt;/p&gt;
&lt;h2 id=&quot;installation-configuration-gophish&quot;&gt;Configuration et déploiement de Gophish&lt;/h2&gt;
&lt;p&gt;Le déploiement de Gophish sur un serveur dédié nécessite une &lt;strong&gt;préparation minutieuse de l&apos;environnement technique&lt;/strong&gt;. Avant de lancer une campagne, vérifiez la &lt;strong&gt;compatibilité des systèmes d&apos;exploitation&lt;/strong&gt; (Linux, Windows, macOS) et les &lt;strong&gt;ressources mémoire requises&lt;/strong&gt;. Signalons que de nombreuses entreprises intègrent désormais cet outil à leurs &lt;strong&gt;infrastructures Microsoft existantes&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;&lt;caption&gt;Comparatif des méthodes d&apos;installation de Gophish&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Méthode d&apos;installation&lt;/th&gt;
&lt;th&gt;Avantages&lt;/th&gt;
&lt;th&gt;Inconvénients&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Manuelle&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Contrôle maximal sur le paramétrage et personnalisation avancée&lt;/strong&gt;. Idéal pour les serveurs critiques.&lt;/td&gt;
&lt;td&gt;Nécessite une formation technique poussée (dépendances système, configurations réseau).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Déploiement accéléré via une image pré-configurée&lt;/strong&gt;. Mises à jour simplifiées, comme le précise le tutoriel officiel.&lt;/td&gt;
&lt;td&gt;Implique une maîtrise préalable de l&apos;écosystème Docker.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Binaires pré-packagés&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Opération rapide par simple extraction de fichier&lt;/strong&gt;. Parfait pour des tests mail immédiats.&lt;/td&gt;
&lt;td&gt;Options de personnalisation réduites comparé à l&apos;approche manuelle.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pour sécuriser l&apos;interface d&apos;administration, un &lt;strong&gt;reverse proxy comme Nginx&lt;/strong&gt; s&apos;avère utile - particulièrement pour le &lt;strong&gt;chiffrement SSL&lt;/strong&gt;. Notons que cette configuration protège aussi les interactions utilisateur lors des campagnes de simulation.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Il ne faut toutefois pas oublier l&apos;aspect technique emailing telles que SPF, DKIM et DMARC. Un email non conforme risque de ne pas arriver en INBOX.&lt;/p&gt;
&lt;p&gt;Pensez à configurer correctement vos enregistrements SPF, DKIM et DMARC pour garantir la bonne délivrabilité des mails lors des campagnes. Une politique DMARC stricte limite aussi considérablement le risque que votre domaine soit utilisé à des fins malveillantes.&amp;nbsp;Vous trouverez plus d&apos;information sur l&apos;article : &lt;a href=&quot;https://kandran.fr/dmarc-securite-email/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DMARC : Sécurisez vos emails contre le phishing&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;creation-campagnes-simulations&quot;&gt;Création de campagnes de simulations réalistes&lt;/h2&gt;
&lt;h3&gt;Paramétrage des modèles d&apos;emails&lt;/h3&gt;
&lt;p&gt;La &lt;strong&gt;personnalisation des messages de phishing&lt;/strong&gt; reste une technique clé pour renforcer le réalisme des simulations. L&apos;ajout de &lt;strong&gt;variables dynamiques et de pièces jointes crédibles&lt;/strong&gt; rend les mails plus persuasifs pour les utilisateurs, surtout lorsqu&apos;on imite des formats Microsoft Outlook.&lt;/p&gt;
&lt;p&gt;Vous pouvez vous inspirer d&apos;un mail légitime, d&apos;un mail de phishing reçu ou partir de zero.&lt;/p&gt;
&lt;p&gt;Pour accélérer la préparation des campagnes, certaines solutions/répo github proposent des &lt;strong&gt;bibliothèques de templates sectoriels&lt;/strong&gt;. Ces modèles prédéfinis s&apos;adaptent rapidement aux spécificités métiers, tout en permettant des ajustements manuels si nécessaire.&lt;/p&gt;
&lt;h3&gt;Construction des pages de capture&lt;/h3&gt;
&lt;p&gt;Créer des interfaces convaincantes nécessite souvent de &lt;strong&gt;reproduire des pages web officielles&lt;/strong&gt;. L&apos;intégration de logos authentiques et le choix d&apos;outils de design adaptés contribuent à tromper la vigilance des utilisateurs moins avertis.&lt;/p&gt;
&lt;p&gt;Signalons que la &lt;strong&gt;sécurisation des données collectées&lt;/strong&gt; devient indispensable. Le &lt;strong&gt;chiffrement des identifiants dès la saisie sur le serveur&lt;/strong&gt;, couplé à leur anonymisation ultérieure, limite les risques de fuite accidentelle pendant la campagne.&lt;/p&gt;
&lt;p&gt;Pour des raisons éthiques et légales, il est fortement conseillé de ne jamais capturer de mots de passe réels lors des simulations. Si vous devez inclure un champ &quot;mot de passe&quot;, assurez-vous qu&apos;il ne stocke aucune donnée sensible.&lt;/p&gt;
&lt;p&gt;L&apos;activation de l&apos;option qui permet de rediriger l&apos;utilisateur sur une page précise dans le cas d&apos;un remplissage est importante voire essentielle : de mon coté c&apos;est un slide de sensibilisation et d&apos;explication.&lt;/p&gt;
&lt;h3&gt;Administration des listes de destinataires&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Différencier le niveau de difficulté selon les profils&lt;/strong&gt; permet d&apos;adapter les simulations. Un commercial recevra par exemple un mail différent d&apos;un comptable, avec des scénarios plus réalistes pour chaque utilisateur.&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Planification et déclenchement&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Éviter les envois massifs simultanés&lt;/strong&gt; s&apos;avère payant. En espaçant les mails sur plusieurs jours avec des horaires aléatoires, on reproduit mieux les tactiques des vraies attaques phishing. Creer une situation d&apos;urgence et d&apos;importance a un impact fort sur les résultats.&lt;/p&gt;
&lt;p&gt;Les &lt;strong&gt;dashboards de suivi en temps réel&lt;/strong&gt; offrent une vision claire de l&apos;avancement de la campagne. Couplés à des alertes paramétrables, ils permettent d&apos;intervenir rapidement pour corriger un taux d&apos;ouverture trop faible ou un problème technique sur une page de capture.&lt;/p&gt;
&lt;p&gt;Bon à savoir : de nombreux tutoriels existent pour maîtriser ces fonctionnalités. Les entreprises investissant dans ce type de formation voient généralement leur résilience augmenter.&lt;/p&gt;
&lt;h2 id=&quot;analyse-resultats-amelioration&quot;&gt;Analyse des résultats et mesures d&apos;amélioration&lt;/h2&gt;
&lt;h3&gt;Interprétation des rapports détaillés&lt;/h3&gt;
&lt;p&gt;L&apos;évaluation du &lt;strong&gt;taux de vulnérabilité&lt;/strong&gt; constitue une méthode centrale pour mesurer les risques organisationnels. Le &lt;strong&gt;risque relatif par département&lt;/strong&gt; révèle notamment les zones critiques face aux campagnes de phishing par mail.&lt;/p&gt;
&lt;p&gt;L&apos;analyse des &lt;strong&gt;comportements à risque&lt;/strong&gt; met en lumière des habitudes récurrentes, comme l&apos;ouverture systématique des pièces jointes. Curieusement, les postes exposés varient selon les pages consultées sur l&apos;intranet. Ces données guident l&apos;adaptation des tutoriels pour les prochaines campagnes de sensibilisation.&lt;/p&gt;
&lt;h3&gt;Conception de modules de remédiation&lt;/h3&gt;
&lt;p&gt;La création de &lt;strong&gt;contenus pédagogiques ciblés&lt;/strong&gt; s&apos;appuie sur les erreurs fréquentes observées dans les simulations de mail frauduleux. Le &lt;strong&gt;format des tutoriels vidéo&lt;/strong&gt; peut etre pas mal si vous avez le temps. Un exemple concret ? Les&amp;nbsp;&lt;strong&gt;quiz interactifs&lt;/strong&gt; peuvent faire des miracles.&lt;/p&gt;
&lt;h3&gt;Mesure d&apos;impact des formations&lt;/h3&gt;
&lt;p&gt;Le suivi des performances s&apos;appuie sur des &lt;strong&gt;indicateurs concrets&lt;/strong&gt; : temps de signalement des mails douteux, taux d&apos;erreur lors des simulations. Les entreprises peuvent comparer ces données d&apos;un mois sur l&apos;autre afin de voir une avancé de la sensibilisation.&lt;/p&gt;
&lt;p&gt;D&apos;expérience j&apos;ai tendance a voir de belles progressions et ce faire avoir rend le risque plus tangible. Dans la sensibilisation n&apos;hesitez pas a citer des exemples d&apos;impact ayant eu lieu, si possible dans votre secteur d&apos;activité&lt;/p&gt;
&lt;h2 id=&quot;bonnes-pratiques-securite&quot;&gt;Bonnes pratiques de sécurité opérationnelle&lt;/h2&gt;
&lt;h3&gt;Suivi des vulnérabilités&lt;/h3&gt;
&lt;p&gt;La &lt;strong&gt;surveillance des CVE liés à Gophish&lt;/strong&gt; doit être intégrée au processus de formation des administrateurs. Plutôt que de se contenter des mises à jour automatiques, établissez un &lt;strong&gt;calendrier de vérification mensuel&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;alternatives-complementaires&quot;&gt;Alternatives et outils complémentaires&lt;/h2&gt;
&lt;p&gt;Explorer des solutions complémentaires à &lt;strong&gt;Gophish&lt;/strong&gt; permet d&apos;enrichir votre &lt;strong&gt;campagne de sensibilisation au phishing&lt;/strong&gt;. Voyons les principaux éléments à considérer pour choisir des outils adaptés à vos besoins en matière de sécurité mail.&lt;/p&gt;
&lt;p&gt;Pour optimiser vos &lt;strong&gt;simulations de phishing&lt;/strong&gt;, il est utile de comparer différentes options disponibles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Solutions open source&lt;/strong&gt; : Des outils comme &lt;strong&gt;SET (Social-Engineer Toolkit)&lt;/strong&gt; ou &lt;strong&gt;KingPhisher&lt;/strong&gt; permettent de créer des campagnes de phishing réalistes. Certains tutoriels recommandent de les tester sur un serveur dédié pour évaluer leur efficacité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spécificités fonctionnelles&lt;/strong&gt; : La &lt;strong&gt;personnalisation des mails tests&lt;/strong&gt;, le suivi des interactions utilisateur et l&apos;analyse des statistiques varient selon les outils. Un tutoriel détaillé aide souvent à choisir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En pratique, cela implique de tester plusieurs options avant de lancer une campagne à grande échelle.&lt;/p&gt;
&lt;p&gt;Pour les entreprises, l&apos;enjeu consiste à &lt;strong&gt;articuler ces solutions avec leur existant technique&lt;/strong&gt;. Vérifiez notamment la capacité à &lt;strong&gt;exporter des rapports&lt;/strong&gt; depuis le serveur vers vos outils de supervision.&lt;/p&gt;
&lt;h2 id=&quot;optimisation-avancee&quot;&gt;Optimisation avancée et veille technologique&lt;/h2&gt;
&lt;h3&gt;Automatisation via l&apos;API REST&lt;/h3&gt;
&lt;p&gt;Gophish propose une API REST vous pouvez donc établir des &lt;strong&gt;workflows automatisés&lt;/strong&gt; qui simplifient notamment la création de&amp;nbsp;&lt;strong&gt;campagnes de phishing simulées&lt;/strong&gt; sur plusieurs serveurs.&lt;/p&gt;
&lt;p&gt;Toutefois l&apos;interface etant simple sur des petits volumes vous pouvez n&apos;utiliser que celle ci.&lt;/p&gt;
&lt;h3&gt;Veille sur les nouvelles techniques de phishing&lt;/h3&gt;
&lt;p&gt;Surveiller &lt;strong&gt;l&apos;évolution des attaques par mail&lt;/strong&gt; reste indispensable pour maintenir des simulations réalistes. Les équipes doivent identifier des &lt;strong&gt;sources fiables&lt;/strong&gt; pour adapter leurs pages de simulation aux &lt;strong&gt;dernières tendances&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Adapter les scénarios aux &lt;strong&gt;vecteurs récents&lt;/strong&gt; nécessite une formation régulière. Signalons que la &lt;strong&gt;fréquence des mises à jour des templates&lt;/strong&gt; dépend directement de l&apos;activité détectée sur les serveurs de collecte de données.&lt;/p&gt;
&lt;h3&gt;Contributions à la communauté open source&lt;/h3&gt;
&lt;p&gt;Soumettre des &lt;strong&gt;améliorations à Gophish&lt;/strong&gt; encourage son évolution collaborative. Les entreprises peuvent notamment partager leurs tutoriels ou modules complémentaires, à condition de respecter les &lt;strong&gt;guidelines techniques pour serveurs d&apos;entreprise&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Traiter les retours utilisateurs et publier une &lt;strong&gt;roadmap transparente&lt;/strong&gt; favorise l&apos;engagement communautaire. La communication via les &lt;strong&gt;canaux officiels&lt;/strong&gt; permet d&apos;ailleurs aux utilisateurs de proposer des formations ou des cas d&apos;usage concrets.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Linux 101 : Le guide accessible pour maîtriser les permissions</title>
     <link href="https://kandran.fr/permissions-linux-guide/"/>
     <updated>2025-02-15T00:00:00+00:00</updated>
     <id>https://kandran.fr/permissions-linux</id>
     <content type="html">&lt;p&gt;Linux offre un contrôle très personnalisé et fin sur l’accès aux fichiers et aux répertoires grâce à un système de permissions reposant sur des valeurs numériques et des attributs spécifiques.&lt;/p&gt;

&lt;p&gt;Ce guide vous expliquera comment fonctionnent les permissions classiques et avancées, comment les calculer avec les valeurs numériques, et vous alertera sur les risques associés à l’utilisation d’attributs comme le setuid et le setgid.&lt;/p&gt;

&lt;h2 id=&quot;1-comprendre-les-permissions-classiques&quot;&gt;1. Comprendre les permissions classiques&lt;/h2&gt;

&lt;p&gt;Chaque fichier ou répertoire est associé à un ensemble de permissions qui définissent trois actions fondamentales :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Read (r)&lt;/strong&gt; : Lire le contenu d’un fichier ou lister un répertoire.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Write (w)&lt;/strong&gt; : Modifier ou supprimer un fichier, ou ajouter/supprimer dans un répertoire.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Execute (x)&lt;/strong&gt; : Exécuter un fichier ou accéder à un répertoire.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;structure-des-permissions&quot;&gt;Structure des permissions&lt;/h3&gt;

&lt;p&gt;Les permissions sont attribuées à trois catégories d’utilisateurs :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;User (u)&lt;/strong&gt; : Le propriétaire.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Group (g)&lt;/strong&gt; : Un groupe d’utilisateurs partageant des droits communs.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Others (o)&lt;/strong&gt; : Tous les autres utilisateurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;notation-numérique--4-2-1&quot;&gt;Notation numérique : 4, 2, 1&lt;/h3&gt;

&lt;p&gt;Chaque permission est représentée par une valeur :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lecture = 4&lt;/li&gt;
  &lt;li&gt;Écriture = 2&lt;/li&gt;
  &lt;li&gt;Exécution = 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionnez ces valeurs pour chaque catégorie. Par exemple, pour un fichier avec les permissions &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;644&lt;/code&gt; :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Propriétaire : 6 = 4 (lecture) + 2 (écriture)&lt;/li&gt;
  &lt;li&gt;Groupe et autres : 4 = lecture seule&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette méthode offre un moyen rapide de définir des droits précis et reste très utilisée en administration système. 
C’est la notation de base vous devez vous y habituer même si l’on retrouve souvent les meme valeurs&lt;/p&gt;

&lt;h3 id=&quot;affectation-de-permission&quot;&gt;Affectation de permission&lt;/h3&gt;

&lt;p&gt;Pour changer les permissions d’un fichier nous utiliserons la commande &lt;strong&gt;chmod&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Par exemple, si l’on souhaite que le proprietaire ait tous les droits, les même du groupe associé au fichier uniquement la lecture et l’execution et la lecture uniquement pour les autres on devra affecter la valeur 754.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;7&lt;/strong&gt; (4+2+1) pour le propriétaire : lecture, écriture, exécution.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; (4+0+1) pour le groupe : lecture et exécution.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;4&lt;/strong&gt; pour les autres : lecture seule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On utilisera donc :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;754 mon_fichier
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez utiliser également comme notation non chiffré avec les modificateur suivant :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;+ ajout&lt;/li&gt;
  &lt;li&gt;- retrait&lt;/li&gt;
  &lt;li&gt;= affectation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et en precisant si besoin si c’est pour les autres (o), groupe (g) ou proprietaire u. Personellement je vous conseille de rester sur la version chiffré.&lt;/p&gt;

&lt;p&gt;Rappel : Pour changer le proprietaire ou le groupe d’un fichier on utilisera la commande chown.&lt;/p&gt;

&lt;h2 id=&quot;2-les-permissions-avancées&quot;&gt;2. Les permissions avancées&lt;/h2&gt;

&lt;p&gt;Linux propose aussi des attributs avancés pour répondre à des besoins spécifiques.&lt;/p&gt;

&lt;h3 id=&quot;sticky-bit&quot;&gt;Sticky Bit&lt;/h3&gt;

&lt;p&gt;Le sticky bit, activé sur un répertoire, empêche les utilisateurs de supprimer ou renommer des fichiers qui ne leur appartiennent pas, même s’ils ont accès au répertoire.&lt;br /&gt;
Par exemple, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt; utilise le sticky bit pour éviter les suppressions accidentelles ou malveillantes.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +t /tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;setuid-et-setgid&quot;&gt;Setuid et Setgid&lt;/h3&gt;

&lt;p&gt;Ces attributs modifient le comportement d’exécution, ne les utilisez pas a tout va car une mauvaise utilisation peut entrainer des failes de sécurité.
Si vous avez besoin des droits root, sudo est votre ami dans la majeure partie des cas.&lt;/p&gt;

&lt;h4 id=&quot;setuid&quot;&gt;Setuid&lt;/h4&gt;

&lt;p&gt;Lorsqu’un exécutable possède le setuid, il s’exécute avec les privilèges du propriétaire, et non de l’utilisateur qui lance le programme.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;u+s /usr/bin/passwd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Risques :&lt;/strong&gt;&lt;br /&gt;
Si un programme setuid comporte une vulnérabilité, un attaquant peut l’exploiter pour obtenir des privilèges élevés.&lt;br /&gt;
&lt;strong&gt;Conseils :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Utilisez le setuid uniquement sur les exécutables indispensables.&lt;/li&gt;
  &lt;li&gt;Mettez régulièrement à jour et auditez le code.&lt;/li&gt;
  &lt;li&gt;Si le setuid est mis, il ne faut pas :
    &lt;ul&gt;
      &lt;li&gt;Que des utilisateurs non proprietaires puissent modifier le script - sinon les modifications seront exécuté avec les droits du proprietaire&lt;/li&gt;
      &lt;li&gt;Utiliser d’alias dans le script, la encore une modification au niveau de l’alias peut permettre de changer un comportement meme sans modifier le fichier&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;setgid&quot;&gt;Setgid&lt;/h4&gt;

&lt;p&gt;Pour les fichiers, le setgid fonctionne comme le setuid mais pour le groupe. Pour les répertoires, il fait en sorte que tous les fichiers et sous-répertoires héritent du groupe du répertoire parent.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;g+s /var/www
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Risques :&lt;/strong&gt;&lt;br /&gt;
Le setgid sur un répertoire partagé peut faciliter l’accès à des fichiers sensibles si la gestion des groupes n’est pas rigoureuse.&lt;br /&gt;
&lt;strong&gt;Conseils :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Limitez l’appartenance aux groupes sensibles.&lt;/li&gt;
  &lt;li&gt;Revoyez régulièrement les droits et les membres des groupes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;3-calcul-et-application-des-permissions&quot;&gt;3. Calcul et application des permissions&lt;/h2&gt;

&lt;h3 id=&quot;exemples-de-calcul&quot;&gt;Exemples de calcul&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Commande &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chmod 755 fichier&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Propriétaire : 7 = 4+2+1 (lecture, écriture, exécution)&lt;/li&gt;
      &lt;li&gt;Groupe : 5 = 4+0+1 (lecture, exécution)&lt;/li&gt;
      &lt;li&gt;Autres : 5 = 4+0+1 (lecture, exécution)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Commande &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chmod 644 fichier&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Propriétaire : 6 = 4+2 (lecture, écriture)&lt;/li&gt;
      &lt;li&gt;Groupe et autres : 4 = lecture seule&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;scénarios-dutilisation&quot;&gt;Scénarios d’utilisation&lt;/h3&gt;

&lt;h4 id=&quot;serveur-web&quot;&gt;Serveur web&lt;/h4&gt;

&lt;p&gt;Pour un site web, séparez les fichiers accessibles publiquement de ceux sensibles :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;755 /var/www/html
&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;640 /etc/nginx/nginx.conf
&lt;span class=&quot;nb&quot;&gt;chown &lt;/span&gt;root:www-data /etc/nginx/nginx.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;répertoire-partagé&quot;&gt;Répertoire partagé&lt;/h4&gt;

&lt;p&gt;Dans un répertoire où chacun peut déposer des fichiers sans risque de suppression par autrui :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;1777 /srv/partage
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;outils-systèmes&quot;&gt;Outils systèmes&lt;/h4&gt;

&lt;p&gt;Certains outils, comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/bin/passwd&lt;/code&gt;, utilisent le setuid pour permettre aux utilisateurs de changer leur mot de passe en toute sécurité. Ces applications doivent être surveillées de près pour éviter toute faille.&lt;/p&gt;

&lt;h2 id=&quot;4-risques-et-vulnérabilités&quot;&gt;4. Risques et vulnérabilités&lt;/h2&gt;

&lt;h3 id=&quot;risques-du-setuid&quot;&gt;Risques du Setuid&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Escalade de Privilèges :&lt;/strong&gt;&lt;br /&gt;
Un programme vulnérable avec setuid peut permettre à un attaquant d’obtenir des droits root.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mesures de Protection :&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Limitez le nombre de programmes setuid.&lt;/li&gt;
      &lt;li&gt;Auditez régulièrement ces exécutables.&lt;/li&gt;
      &lt;li&gt;Appliquez les mises à jour de sécurité.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;risques-du-setgid&quot;&gt;Risques du Setgid&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Propagation des Droits :&lt;/strong&gt;&lt;br /&gt;
Les fichiers héritant du groupe d’un répertoire peuvent exposer des données sensibles.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mesures de Protection :&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Contrôlez strictement l’appartenance aux groupes.&lt;/li&gt;
      &lt;li&gt;Utilisez le principe du moindre privilège.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;risques-généraux&quot;&gt;Risques généraux&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Permissions trop libres :&lt;/strong&gt;&lt;br /&gt;
Évitez les permissions excessives (ex. 777) qui peuvent mener à des modifications ou suppressions non désirées. Typiquement si il y’a une faille coté application un attaquant pourrait s’en servir.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Utilisation incorrecte du Sticky Bit :&lt;/strong&gt;&lt;br /&gt;
Assurez-vous que le sticky bit soit appliqué sur des répertoires où il apporte réellement une valeur ajoutée.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;5-bonnes-pratiques-pour-la-gestion-des-permissions&quot;&gt;5. Bonnes Pratiques pour la gestion des permissions&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Principe du Moindre Privilège :&lt;/strong&gt;&lt;br /&gt;
Attribuez uniquement les droits nécessaires à chaque utilisateur ou groupe.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Audit Régulier :&lt;/strong&gt;&lt;br /&gt;
Utilisez des outils comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find&lt;/code&gt; et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls -l&lt;/code&gt; pour vérifier les permissions sur les fichiers sensibles.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Documentation et Formation :&lt;/strong&gt;&lt;br /&gt;
Tenez une documentation à jour et formez vos équipes sur les meilleures pratiques.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Outils de Sécurité :&lt;/strong&gt;&lt;br /&gt;
Intégrez des solutions telles que SELinux ou AppArmor pour renforcer les contrôles d’accès.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Utilisation des ACL :&lt;/strong&gt;&lt;br /&gt;
Pour des contrôles plus granulaires, envisagez d’utiliser les ACL (Access Control Lists).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;6-conclusion&quot;&gt;6. Conclusion&lt;/h2&gt;

&lt;p&gt;Maîtriser les permissions sous Linux est indispensable pour sécuriser vos environnements. En comprenant la notation numérique (4, 2, 1) et en appliquant correctement les permissions classiques et avancées, vous réduisez significativement les risques d’escalade de privilèges et de mauvaises configurations.&lt;/p&gt;

&lt;p&gt;En appliquant les bonnes pratiques et en surveillant régulièrement vos configurations, vous garantissez une meilleure protection des données et une stabilité accrue de vos systèmes. Testez toujours vos configurations dans un environnement de test avant de les déployer en production, et restez à jour avec les recommandations de sécurité de votre distribution Linux.&lt;/p&gt;

&lt;p&gt;N’hésitez pas à laisser vos commentaires ou questions pour approfondir ce sujet !&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Certificate Transparency: Surveillez TLS via crt.sh & CertStream</title>
     <link href="https://kandran.fr/certificate-transparency-crtsh-certstream"/>
     <updated>2025-01-26T00:00:00+00:00</updated>
     <id>https://kandran.fr/certificate-transparency-tls</id>
     <content type="html">&lt;h2 id=&quot;1-contexte-et-enjeux&quot;&gt;1. Contexte et enjeux&lt;/h2&gt;

&lt;p&gt;La sécurité des communications numériques ne se limite pas seulement à la navigation web. Même si l’on parle souvent de &lt;strong&gt;HTTPS&lt;/strong&gt; – qui encapsule le protocole HTTP dans une couche &lt;strong&gt;TLS&lt;/strong&gt; (Transport Layer Security) –, la &lt;strong&gt;TLS&lt;/strong&gt; peut être utilisée pour bien d’autres protocoles : messagerie (IMAP, SMTP), transfert de fichiers (FTPS), VPN, etc.&lt;/p&gt;

&lt;p&gt;Dans tous ces scénarios, les certificats TLS jouent un rôle primordial pour assurer l’authentification du serveur (ou du client) et le chiffrement des données échangées. Cependant, le système de confiance fondé sur ces certificats a déjà montré ses failles (certificats malveillants, erreurs d’émission, etc.). C’est ici qu’intervient la &lt;strong&gt;Certificate Transparency (CT)&lt;/strong&gt;, un mécanisme rendant publiques toutes les émissions de certificats afin de faciliter la détection d’anomalies.&lt;/p&gt;

&lt;h2 id=&quot;2-certificate-transparency--le-principe&quot;&gt;2. Certificate Transparency : le principe&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Fondements&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Les Autorités de Certification (CA) doivent consigner tout certificat émis dans des &lt;strong&gt;journaux publics&lt;/strong&gt; &lt;em&gt;append-only&lt;/em&gt;.&lt;/li&gt;
      &lt;li&gt;Une preuve d’enregistrement (SCT – &lt;em&gt;Signed Certificate Timestamp&lt;/em&gt;) est nécessaire pour que les certificats soient considérés valides par les principaux navigateurs web (Chrome, Firefox, etc.).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Pourquoi c’est crucial&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Transparence universelle&lt;/strong&gt; : Toute personne (ou machine) a la possibilité de vérifier les certificats émis pour un domaine donné, qu’il s’agisse d’un site web, d’un serveur de messagerie ou d’un autre service.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Détection rapide&lt;/strong&gt; : Si un certificat est délivré de manière frauduleuse ou sans autorisation, il devient plus aisé de le repérer et de le révoquer avant qu’il ne cause des dégâts.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Amélioration du système de confiance&lt;/strong&gt; : La CT rend le processus d’émission plus vérifiable, ce qui diminue les risques d’abus liés aux autorités de certification.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;HTTPS vs. TLS : une nuance importante&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; : Protocole web sécurisant la navigation entre un serveur et un navigateur.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;TLS&lt;/strong&gt; : Protocole plus général, qui peut protéger de nombreux autres services (email, transfert de fichiers, etc.).&lt;/li&gt;
      &lt;li&gt;Les principes de Certificate Transparency s’appliquent tout particulièrement à l’écosystème HTTPS, mais le contrôle des certificats vaut aussi pour d’autres usages de TLS.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;3-crtsh--loutil-de-référence&quot;&gt;3. crt.sh : l’outil de référence&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://crt.sh/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;crt.sh&lt;/a&gt;&lt;/strong&gt;, maintenu par Sectigo (ex-Comodo), s’impose comme un portail majeur d’accès aux journaux de Certificate Transparency :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Interface Web&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Recherche par nom de domaine&lt;/strong&gt; : Entrez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mondomaine.fr&lt;/code&gt; pour afficher l’historique de tous les certificats associés, qu’ils soient actifs ou expirés.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Informations détaillées&lt;/strong&gt; : Numéro de série, émetteur, date d’émission/expiration, algorithme de chiffrement, etc.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;API non officielle&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Permet d’automatiser la requête de la base de données.&lt;/li&gt;
      &lt;li&gt;Nécessite souvent des requêtes SQL adaptables en HTTP.&lt;/li&gt;
      &lt;li&gt;Avantage : Intégrer directement dans un &lt;strong&gt;pipeline CI/CD&lt;/strong&gt; ou un script de supervision pour surveiller vos certificats en continu.&lt;/li&gt;
      &lt;li&gt;Limite : Puisqu’elle est non officielle, des changements soudains peuvent casser les scripts en production.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Cas d’usage DevOps&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Surveillance d’infrastructure&lt;/strong&gt; : Vérifier la création de nouveaux certificats (par ex. sous-domains, environnements de test) et éviter des surprises ou des sous-domaines “fantômes”.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Cycle de vie Let’s Encrypt&lt;/strong&gt; : S’assurer que les certificats générés par &lt;strong&gt;ACME&lt;/strong&gt; sont bien enregistrés et qu’aucun certificat indésirable n’a été émis.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Audit de la concurrence&lt;/strong&gt; : Surveiller les domaines de vos concurrents pour repérer l’apparition de nouveaux services (sous-domaines révélateurs de tests ou de futures offres).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;4-certstream--la-surveillance-en-temps-réel&quot;&gt;4. CertStream : la surveillance en temps réel&lt;/h3&gt;

&lt;p&gt;Outre les recherches ponctuelles ou régulières sur crt.sh, vous pouvez automatiser une &lt;strong&gt;surveillance temps réel&lt;/strong&gt; via &lt;strong&gt;&lt;a href=&quot;https://certstream.calidog.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CertStream&lt;/a&gt;&lt;/strong&gt; :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Qu’est-ce que CertStream ?&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Un service offrant un &lt;strong&gt;flux en direct&lt;/strong&gt; de tous les certificats ajoutés aux journaux de Certificate Transparency.&lt;/li&gt;
      &lt;li&gt;Agrège plusieurs sources, couvrant la plupart des CA (Let’s Encrypt, DigiCert, Sectigo, etc.).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Comment ça marche ?&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;API WebSocket&lt;/strong&gt; : Vous pouvez vous y connecter depuis un script ou un programme, et recevoir automatiquement chaque nouvel événement (certificat émis).&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Filtrage&lt;/strong&gt; : Surveillez spécifiquement les domaines ou expressions régulières qui vous intéressent (ex. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.mondomaine.fr&lt;/code&gt;), afin d’être alerté en quasi temps réel.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Bénéfices&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Réactivité&lt;/strong&gt; : Identifier un certificat émis de manière abusive ou un sous-domaine non autorisé quelques instants après son apparition.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Complémentarité&lt;/strong&gt; : Comparé à crt.sh où la requête est “pull” (vous interrogez le service), CertStream fonctionne en “push” (vous recevez immédiatement les infos).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;5-au-delà-du-web--tls-dans-dautres-environnements&quot;&gt;5. Au-delà du web : TLS dans d’autres environnements&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Messagerie&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Protocoles IMAP, POP, SMTP peuvent être protégés par TLS.&lt;/li&gt;
      &lt;li&gt;Les certificats émis pour ces services sont également enregistrés dans les journaux CT s’ils sont signés par une CA publique.&lt;/li&gt;
      &lt;li&gt;Le même principe de détection s’applique : un certificat SMTP frauduleux serait immédiatement repérable.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;VPN, FTP, etc.&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;TLS peut aussi chiffrer des connexions VPN (OpenVPN, par exemple) ou FTP (FTPS).&lt;/li&gt;
      &lt;li&gt;Qu’il s’agisse du web ou non, tant que vous utilisez un certificat public, il apparaîtra dans les logs CT.&lt;/li&gt;
      &lt;li&gt;Les risques de fraude existent aussi dans ce contexte, d’où l’intérêt de la Certificate Transparency.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Let’s Encrypt et ACME&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Même si Let’s Encrypt est très utilisé pour les sites web, il peut aussi fournir des certificats pour d’autres usages (comme un serveur IMAP, un reverse proxy SSL, etc.).&lt;/li&gt;
      &lt;li&gt;Tous ces certificats figureront de la même façon dans les journaux CT, avec la même transparence.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;6-cas-pratiques--surveiller-ses-certificats-et-sa-concurrence&quot;&gt;6. Cas pratiques : surveiller ses certificats et sa concurrence&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Détection de sous-domaines inconnus&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;En interrogeant régulièrement crt.sh ou via CertStream, vous pouvez découvrir rapidement des sous-domaines inattendus (par exemple, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dev.mondomaine.fr&lt;/code&gt;).&lt;/li&gt;
      &lt;li&gt;Utile pour vérifier qu’aucun service n’a été créé en dehors des procédures internes.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Analyse concurrentielle&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Appliquez la même méthode aux domaines de vos concurrents.&lt;/li&gt;
      &lt;li&gt;Vous pourriez repérer un sous-domaine révélant un projet en cours, comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beta.concurrent.fr&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;À manier avec discernement : la transparence vaut dans les deux sens, vos sous-domaines aussi sont visibles.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Scripts et notifications&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Via l’API non officielle de crt.sh, vous pouvez créer un &lt;strong&gt;cron job&lt;/strong&gt; qui interroge la base toutes les heures, puis envoie un e-mail Slack/Teams si de nouveaux certificats sont détectés.&lt;/li&gt;
      &lt;li&gt;Avec CertStream, recevez des &lt;strong&gt;webhooks&lt;/strong&gt; en temps réel, facilitant une réaction instantanée en cas de menace.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;7-limites-bonnes-pratiques-et-optimisations&quot;&gt;7. Limites, bonnes pratiques et optimisations&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Limites&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Délai de propagation&lt;/strong&gt; : Même avec CertStream, il peut y avoir quelques secondes ou minutes de décalage.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Faux positifs&lt;/strong&gt; : Certains certificats émis pour des tests internes ou expirés peuvent apparaître. Vérifier avant de tirer la sonnette d’alarme.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;API non officielle&lt;/strong&gt; (crt.sh) : Peut changer sans préavis, nécessitant une maintenance régulière de vos scripts.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Bonnes pratiques&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Revue périodique&lt;/strong&gt; : Mettre en place un processus de vérification (journalier ou hebdomadaire) pour votre domaine, vos sous-domaines et vos services non-web.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Politique de cycle de vie&lt;/strong&gt; : Consolider les pratiques de renouvellement (via Let’s Encrypt ou un autre CA) et s’assurer que chaque certificat émis est connu et validé.&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Sensibilisation&lt;/strong&gt; : Informer vos équipes que toute émission de certificat TLS public (web, mail, VPN…) sera visible publiquement dans la CT.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;La &lt;strong&gt;Certificate Transparency&lt;/strong&gt; a marqué un tournant dans la gestion et la surveillance des certificats TLS. Qu’il s’agisse de sites web (HTTPS) ou de services divers (mail, VPN, FTP…), l’ensemble des certificats émis par des CA publics se retrouve dans des journaux consultables par tous.&lt;/p&gt;

&lt;p&gt;Des outils comme &lt;strong&gt;&lt;a href=&quot;https://crt.sh/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;crt.sh&lt;/a&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;a href=&quot;https://certstream.calidog.io/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;CertStream&lt;/a&gt;&lt;/strong&gt; permettent aux professionnels de la sécurité, aux DevOps et aux administrateurs système de :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Surveiller&lt;/strong&gt; en continu leur propre domaine, en repérant de nouveaux sous-domaines ou des certificats non autorisés.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Analyser&lt;/strong&gt; la concurrence pour anticiper les éventuels lancements de nouveaux services.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Renforcer&lt;/strong&gt; la posture de sécurité globale en réagissant instantanément à toute anomalie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans un contexte où la &lt;strong&gt;confiance&lt;/strong&gt; et la &lt;strong&gt;sécurité&lt;/strong&gt; sont indispensables, la CT contribue à la fiabilité de l’écosystème TLS bien au-delà de la seule sphère du web.&lt;/p&gt;

&lt;p&gt;Pour completer je vous conseille de lire cette récente publication de l’ANSSI sur : &lt;a href=&quot;https://cyber.gouv.fr/publications/automatisation-de-la-gestion-des-certificats-avec-acme&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;
Automatisation de la gestion des certificats avec ACME&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt; : Qu’est-ce que la Certificate Transparency (CT) ?&lt;br /&gt;
&lt;strong&gt;R&lt;/strong&gt; : C’est un ensemble de journaux publics &lt;em&gt;append-only&lt;/em&gt; où les CA publient les certificats qu’ils émettent. Cela facilite la détection d’anomalies ou de fraudes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt; : À quoi sert CertStream ?&lt;br /&gt;
&lt;strong&gt;R&lt;/strong&gt; : CertStream fournit un flux en temps réel des nouveaux certificats ajoutés aux journaux CT. Il permet de réagir très rapidement à l’émission d’un certificat suspect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q&lt;/strong&gt; : TLS est-il uniquement pour le web ?&lt;br /&gt;
&lt;strong&gt;R&lt;/strong&gt; : Non. TLS peut aussi sécuriser des protocoles comme SMTP, IMAP, FTPS, VPN, etc. Dès lors qu’un certificat public est émis, il peut apparaître dans les logs CT.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>TickTick Avis : L'application ultime pour une organisation sans faille ?</title>
     <link href="https://kandran.fr/ticktick-gestion-taches"/>
     <updated>2024-12-29T00:00:00+00:00</updated>
     <id>https://kandran.fr/tick-tick</id>
     <content type="html">&lt;p&gt;S’organiser efficacement devient souvent un casse-tête quand nos tâches s’accumulent dans tous les sens. TickTick attire l’attention comme solution pour gérer ce chaos quotidien, mais cette application de gestion de tâches est-elle vraiment à la hauteur des attentes ? Dans cet avis complet sur TickTick, nous examinerons ses &lt;strong&gt;fonctionnalités principales, son interface et son rapport qualité-prix&lt;/strong&gt; pour déterminer si elle mérite sa réputation d’outil d’organisation performant. À travers notre évaluation détaillée, vous découvrirez si cette application pourrait transformer votre productivité ou si d’autres alternatives répondraient mieux à vos besoins.&lt;/p&gt;

&lt;h2&gt;Sommaire&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#resume-avis-ticktick&quot;&gt;Résumé de notre avis sur TickTick&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#tarifs-ticktick&quot;&gt;Tarifs de TickTick&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ticktick-pour-qui&quot;&gt;TickTick : pour qui ?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#liste-fonctionnalites&quot;&gt;Liste des fonctionnalités&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#avis-clients&quot;&gt;Avis clients&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#comparatif&quot;&gt;Comparatif avec d&apos;autres outils de productivité&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#avis-final&quot;&gt;Avis final&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#comment-commencer&quot;&gt;Comment commencer avec TickTick ?&lt;/a&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;h2 id=&quot;resume-avis-ticktick&quot;&gt;Résumé de notre avis sur TickTick&lt;/h2&gt;

&lt;p&gt;TickTick se présente comme un &lt;strong&gt;gestionnaire de tâches complet&lt;/strong&gt; qui aide à structurer votre quotidien personnel et professionnel. Cette application multiplateforme offre une synchronisation cloud efficace entre tous vos appareils. Sa force réside dans son interface intuitive, son calendrier intégré et son timer Pomodoro qui favorisent une meilleure organisation.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 20px 0; background-color: #f8f8f8; padding: 20px;&quot;&gt;
  &lt;a href=&quot;https://ticktick.com/r?c=c5klrp9g&quot; style=&quot;display: inline-block; padding: 15px 30px; background-color: #28a745; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold;&quot;&gt;
    Découvrez dès maintenant comment TickTick peut booster votre productivité !
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Avantages et inconvénients de TickTick&lt;/strong&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Avantages&lt;/th&gt;
      &lt;th&gt;Inconvénients&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;✅ Interface conviviale et intuitive&lt;/td&gt;
      &lt;td&gt;❌ Service payant pour accéder aux fonctionnalités avancées (non essentiel)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;✅ Disponible sur plus de 10 plateformes&lt;/td&gt;
      &lt;td&gt;❌ Service client parfois peu réactif&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;✅ Synchronisation cloud efficace&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;✅ Calendrier intégré et Pomodoro Timer&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;✅ Copie facile des listes de tâches depuis emails&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;✅ Fonctionnalités de collaboration et partage&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;tarifs-ticktick&quot;&gt;Tarifs de TickTick&lt;/h2&gt;

&lt;h3 id=&quot;les-différentes-formules&quot;&gt;Les différentes formules&lt;/h3&gt;

&lt;p&gt;TickTick propose deux options tarifaires pour répondre aux besoins variés des utilisateurs. La version gratuite offre déjà de nombreuses fonctionnalités importantes pour commencer à gérer vos tâches efficacement. Pour les utilisateurs ayant besoin d’outils plus avancés, la &lt;strong&gt;formule Premium&lt;/strong&gt; est disponible au prix de 35,99 $ par an, soit moins de 3 $ par mois.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparaison des fonctionnalités : Version Gratuite vs. Version Premium de TickTick&lt;/strong&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Fonctionnalité&lt;/th&gt;
      &lt;th&gt;Version Gratuite&lt;/th&gt;
      &lt;th&gt;Version Premium&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Nombre de listes&lt;/td&gt;
      &lt;td&gt;Jusqu’à 9&lt;/td&gt;
      &lt;td&gt;Jusqu’à 299 (listes fermées exclues)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Tâches par liste (tâches fermée exclues)&lt;/td&gt;
      &lt;td&gt;Jusqu’à 99&lt;/td&gt;
      &lt;td&gt;Jusqu’à 999&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Sous-tâches par tâche&lt;/td&gt;
      &lt;td&gt;Jusqu’à 19&lt;/td&gt;
      &lt;td&gt;Jusqu’à 199&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Rappels par tâche&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Membres par liste partagée&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;29 par liste&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Pièces jointes par jour&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Filtres&lt;/td&gt;
      &lt;td&gt;Non&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Vues du calendrier&lt;/td&gt;
      &lt;td&gt;Vue Liste&lt;/td&gt;
      &lt;td&gt;Toutes les vues (Liste, Mois, Jour, 3-Jours, Semaine)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Planification des tâches&lt;/td&gt;
      &lt;td&gt;2 planifications par semaine&lt;/td&gt;
      &lt;td&gt;Planification illimitée&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;La version Premium débloque des &lt;strong&gt;fonctionnalités exclusives qui améliorent notablement l’expérience utilisateur&lt;/strong&gt;. Vous accédez aux vues de calendrier avancées, aux filtres personnalisés pour organiser vos tâches selon vos critères, et au suivi détaillé de vos habitudes. Les listes intelligentes permettent également de filtrer automatiquement vos tâches selon des paramètres comme les dates d’échéance ou les priorités.&lt;/p&gt;

&lt;p&gt;Toutefois, l’utilisation est largement utilisable même gratuitement.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://ticktick.com/r?c=c5klrp9g&quot;&gt;Testez &lt;strong&gt;TickTick ici&lt;/strong&gt; ✔&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;mon-avis-sur-le-prix-de-ticktick&quot;&gt;Mon avis sur le prix de TickTick&lt;/h3&gt;

&lt;p&gt;Comparé à d’autres applications de productivité similaires, TickTick offre un &lt;strong&gt;excellent rapport qualité-prix&lt;/strong&gt;. Pour moins de 3 $ par mois (ou 36 $ à l’année), les utilisateurs obtiennent un outil complet de gestion de tâches avec des fonctionnalités avancées qui justifient amplement l’investissement. La note de 4,6/5 sur GetApp pour le rapport qualité-prix confirme cette impression partagée par de nombreux utilisateurs.&lt;/p&gt;

&lt;h2 id=&quot;ticktick-pour-qui&quot;&gt;TickTick : pour qui ?&lt;/h2&gt;

&lt;p&gt;TickTick s’adresse particulièrement aux professionnels cherchant à optimiser leur gestion des tâches quotidiennes. Cette application de productivité offre un &lt;strong&gt;système d’organisation efficace&lt;/strong&gt; avec ses différentes vues de calendrier et sa technique Pomodoro qui divise le travail en intervalles de 25 minutes. Sa bibliothèque d’habitudes permet également de suivre vos progrès quotidiens dans l’atteinte de vos objectifs personnels et professionnels.&lt;/p&gt;

&lt;p&gt;Pour bien cerner qui profitera le plus de TickTick, voici &lt;strong&gt;une liste des profils types&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Professionnels occupés&lt;/strong&gt; : TickTick est idéal pour les professionnels qui jonglent avec de nombreux projets et tâches. L’application permet une gestion efficace de l’emploi du temps et aide à maintenir une organisation rigoureuse au quotidien.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Étudiants&lt;/strong&gt; : organiser cours, devoirs et examens. L’application favorise également le développement de bonnes habitudes d’étude et permet de mieux gérer le temps.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Indépendants&lt;/strong&gt; : TickTick offre aux indépendants la possibilité de se fixer des objectifs clairs et de séparer leur vie personnelle de leur vie professionnelle. L’application aide à éviter de trop s’éparpiller et à maintenir une discipline de travail régulière.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Personnes atteintes de TDAH&lt;/strong&gt; : L’interface simple et personnalisable de TickTick, ainsi que ses rappels constants, peuvent être particulièrement utiles pour les personnes atteintes de TDAH. L’application aide à structurer les tâches, à définir des échéances et à suivre les progrès au fil du temps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les personnes atteintes de TDAH trouvent dans TickTick un outil &lt;strong&gt;utile&lt;/strong&gt; grâce à son interface simple qui maintient l’ordre sans nécessiter une configuration complexe. Les rappels persistants sont particulièrement utiles pour ceux qui ont des difficultés à se souvenir des tâches, tandis que la vue structurée aide à organiser les pensées et responsabilités.&lt;/p&gt;

&lt;p&gt;Dans le monde de l’entreprise, TickTick facilite la collaboration en permettant le partage de listes avec collègues et collaborateurs. La &lt;strong&gt;synchronisation en temps réel&lt;/strong&gt; sur toutes les plateformes (téléphone, ordinateur, tablette) garantit que chaque membre de l’équipe reste connecté et informé des avancements de projets communs.&lt;/p&gt;

&lt;h2 id=&quot;liste-fonctionnalites&quot;&gt;Liste des fonctionnalités&lt;/h2&gt;

&lt;h3 id=&quot;gestion-des-tâches-et-des-listes&quot;&gt;Gestion des tâches et des listes&lt;/h3&gt;

&lt;p&gt;TickTick propose un système complet de gestion des tâches qui constitue le cœur de cette application. Vous pouvez créer rapidement des tâches avec différents niveaux de priorité et des échéances personnalisables. L’application reconnaît même le langage naturel pour définir automatiquement les dates lorsque vous tapez. Les sous-tâches permettent de découper vos projets en étapes plus digestes tandis que les options de répétition s’avèrent idéales pour les activités récurrentes. &lt;strong&gt;Cette organisation intuitive&lt;/strong&gt; vous aide à garder la vue d’ensemble sur tous vos projets sans jamais vous sentir débordé.&lt;/p&gt;

&lt;p&gt;Les &lt;strong&gt;listes intelligentes représentent&lt;/strong&gt; l’une des fonctionnalités les plus appréciées de TickTick Premium. Elles filtrent automatiquement vos tâches selon des critères comme les dates d’échéance, les étiquettes ou les priorités. Par exemple, vous pouvez créer une liste qui affiche uniquement les tâches à haute priorité devant être accomplies cette semaine. Les tags permettent quant à eux de catégoriser vos tâches par thème ou par contexte, facilitant leur recherche ultérieure.&lt;/p&gt;

&lt;h3 id=&quot;calendrier-intégré-et-planification&quot;&gt;Calendrier intégré et planification&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;calendrier intégré se synchronise&lt;/strong&gt; parfaitement avec les tâches que vous créez. Chaque nouvelle échéance apparaît automatiquement dans votre agenda, offrant une vision claire de votre emploi du temps. Vous pouvez également faire glisser vos tâches directement sur le calendrier pour planifier votre journée ou votre semaine. La synchronisation bidirectionnelle avec Google Calendar ou Outlook permet de centraliser tous vos rendez-vous et obligations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Types de vues calendrier disponibles dans TickTick et leurs utilisations&lt;/strong&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Vue du Calendrier&lt;/th&gt;
      &lt;th&gt;Description&lt;/th&gt;
      &lt;th&gt;Utilisation Optimale&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Liste&lt;/td&gt;
      &lt;td&gt;Affiche les tâches sous forme de liste chronologique.&lt;/td&gt;
      &lt;td&gt;Visualiser rapidement les tâches à venir et leur échéance.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Mois&lt;/td&gt;
      &lt;td&gt;Offre un aperçu général de l’ensemble du mois.&lt;/td&gt;
      &lt;td&gt;Planification à long terme et identification des périodes chargées.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Jour&lt;/td&gt;
      &lt;td&gt;Se concentre sur les tâches et événements d’une seule journée.&lt;/td&gt;
      &lt;td&gt;Organisation détaillée de la journée et gestion du temps.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3-Jours&lt;/td&gt;
      &lt;td&gt;Présente les tâches et événements sur une période de trois jours.&lt;/td&gt;
      &lt;td&gt;Avoir une vue d’ensemble des prochains jours et de leur charge de travail.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Semaine&lt;/td&gt;
      &lt;td&gt;Fournit une vue d’ensemble de la semaine en cours.&lt;/td&gt;
      &lt;td&gt;Planification hebdomadaire et suivi des progrès.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;technique-pomodoro-et-suivi-du-temps&quot;&gt;Technique Pomodoro et suivi du temps&lt;/h3&gt;

&lt;p&gt;Le Timer Pomodoro intégré à TickTick divise votre travail en &lt;strong&gt;sessions de 25 minutes&lt;/strong&gt; pour améliorer votre concentration. Cette technique vous encourage à vous consacrer pleinement à une tâche pendant un court intervalle, suivi d’une pause bien méritée. Vous pouvez associer le minuteur directement à vos tâches pour suivre le temps consacré à chaque projet et identifier vos moments de productivité optimale.&lt;/p&gt;

&lt;p&gt;L’application propose également des outils d’analyse qui mesurent le temps passé sur chaque catégorie de tâches. Ces données &lt;strong&gt;révèlent comment vous distribuez vos efforts&lt;/strong&gt; entre vos activités personnelles et professionnelles. Les graphiques visuels montrent votre progression au fil du temps et vous aident à identifier les tendances dans votre productivité.&lt;/p&gt;

&lt;h3 id=&quot;suivi-des-habitudes-et-objectifs&quot;&gt;Suivi des habitudes et objectifs&lt;/h3&gt;

&lt;p&gt;La fonction de suivi des habitudes dans TickTick va au-delà d’une simple liste de tâches en vous aidant à &lt;strong&gt;développer des routines positives&lt;/strong&gt;. Vous pouvez définir des objectifs quotidiens, hebdomadaires ou mensuels, puis suivre votre constance via des visualisations claires. L’application propose même une bibliothèque d’habitudes préétablies pour vous inspirer, des plus basiques comme boire suffisamment d’eau aux plus ambitieuses comme apprendre une nouvelle langue.&lt;/p&gt;

&lt;p&gt;Pour bien comprendre comment TickTick peut vous aider, voici une liste des &lt;strong&gt;habitudes et objectifs&lt;/strong&gt; que vous pouvez suivre efficacement :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Suivi des habitudes quotidiennes&lt;/strong&gt; : Suivez facilement des habitudes quotidiennes comme faire de l’exercice, lire, méditer ou boire de l’eau. Définissez des objectifs pour chaque habitude et suivez vos progrès.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Gestion des objectifs à long terme&lt;/strong&gt; : Définissez des objectifs à long terme, tels que terminer un projet, apprendre une nouvelle compétence ou atteindre un certain niveau de forme physique. L’application vous aide à décomposer ces objectifs en étapes plus petites.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Amélioration de la productivité&lt;/strong&gt; : Suivez votre temps de travail et identifiez les tâches qui prennent le plus de temps. Utilisez le minuteur Pomodoro pour améliorer votre concentration.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Développement de routines positives&lt;/strong&gt; : Développez des routines en recevant des rappels pour les tâches importantes et en suivant vos progrès. Créez des listes de contrôle pour vos routines quotidiennes et hebdomadaires.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;fonctionnalités-collaboratives&quot;&gt;Fonctionnalités collaboratives&lt;/h3&gt;

&lt;p&gt;TickTick facilite le travail en équipe grâce à ses options de partage de listes. Vous pouvez inviter des collaborateurs ou des membres de votre famille à accéder à des listes spécifiques, puis assigner des tâches à différentes personnes. La version Premium autorise jusqu’à 30 membres par liste partagée, contre seulement 2 dans la version gratuite. Les mises à jour se synchronisent en temps réel, garantissant que tous les participants disposent des informations les plus récentes.&lt;/p&gt;

&lt;h2 id=&quot;avis-clients&quot;&gt;Avis clients&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TickTick récolte des notes impressionnantes&lt;/strong&gt; sur les plateformes d’évaluation spécialisées. Sur GetApp, l’application obtient une moyenne de 4,7 étoiles basée sur 124 avis d’utilisateurs. Cette même note se retrouve sur Capterra, confirmant la satisfaction générale des utilisateurs envers ce logiciel de gestion de tâches.&lt;/p&gt;

&lt;p&gt;Les utilisateurs apprécient particulièrement &lt;strong&gt;l’interface intuitive de TickTick&lt;/strong&gt; qui facilite la gestion des projets. La possibilité d’organiser les tâches avec des étiquettes et des dates d’échéance est souvent citée comme un point fort. Le calendrier intégré et la matrice d’Eisenhower pour prioriser les tâches sont également très appréciés dans les évaluations.&lt;/p&gt;

&lt;p&gt;Parmi les points négatifs mentionnés, on trouve principalement les &lt;strong&gt;limitations de la version gratuite&lt;/strong&gt;. Certains utilisateurs regrettent que les fonctionnalités avancées, comme les vues de calendrier complètes ou les filtres personnalisés, soient réservées à la version Premium. D’autres signalent des problèmes occasionnels avec le service client.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“TickTick est un logiciel de gestion et de suivi de tâches avec une interface très conviviale et surtout multiplateforme”, note un utilisateur sur Capterra.&lt;br /&gt;
“C’est le meilleur rapport qualité-prix. Il offre tout ce dont vous avez besoin d’une application de tâches, plus de nombreuses fonctionnalités utiles”, commente un autre.&lt;br /&gt;
Un troisième apprécie particulièrement la facilité de copier des listes depuis les emails : “L’application sépare automatiquement toutes les lignes en tâches distinctes”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;comparatif&quot;&gt;Comparatif avec d&apos;autres outils de productivité&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Fonctionnalité&lt;/th&gt;
      &lt;th&gt;TickTick&lt;/th&gt;
      &lt;th&gt;Todoist&lt;/th&gt;
      &lt;th&gt;Microsoft To Do&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Gestion des sous-tâches&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Timer Pomodoro&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Non&lt;/td&gt;
      &lt;td&gt;Non&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Suivi d’habitudes&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Non&lt;/td&gt;
      &lt;td&gt;Non&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Intégration calendrier&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Version gratuite complète&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
      &lt;td&gt;Oui&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ce comparatif permet d’illustrer clairement les atouts spécifiques de TickTick par rapport à ses concurrents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;avis-final&quot;&gt;Avis final&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TickTick se distingue par sa polyvalence&lt;/strong&gt; remarquable en matière d’organisation. L’application excelle grâce à son interface intuitive et sa synchronisation multiplateforme. Ses fonctionnalités de gestion des tâches permettent de structurer efficacement projets personnels et professionnels. Le calendrier intégré et la technique Pomodoro constituent des atouts majeurs pour améliorer la productivité quotidienne. La version gratuite offre déjà une expérience complète, tandis que l’abonnement Premium débloque des options avancées pour les utilisateurs exigeants.&lt;/p&gt;

&lt;p&gt;Malgré ses nombreux points forts, TickTick présente quelques limitations. Le service client peut manquer de réactivité face aux problèmes signalés, et certains utilisateurs mentionnent des soucis occasionnels avec la facturation. Pour les équipes nécessitant des fonctionnalités collaboratives avancées, d’autres logiciels comme Asana ou ClickUp pourraient mieux convenir. La &lt;strong&gt;courbe d’apprentissage&lt;/strong&gt; peut également sembler un peu raide pour les débutants.&lt;/p&gt;

&lt;p&gt;Pour conclure, TickTick représente véritablement &lt;strong&gt;un outil performant&lt;/strong&gt; pour améliorer son organisation personnelle et professionnelle. Son approche équilibrée entre simplicité et fonctionnalités avancées en fait une solution idéale pour la plupart des utilisateurs. L’application répond particulièrement aux besoins des professionnels occupés, des étudiants et des personnes souffrant de TDAH grâce à ses rappels et sa planification. La version gratuite permet déjà d’expérimenter l’essentiel de ses capacités, offrant une bonne introduction avant éventuellement de passer à l’abonnement Premium.&lt;/p&gt;

&lt;div style=&quot;text-align: center; margin: 20px 0; background-color: #f8f8f8; padding: 20px;&quot;&gt;
  &lt;a href=&quot;https://ticktick.com/r?c=c5klrp9g&quot; style=&quot;display: inline-block; padding: 15px 30px; background-color: #28a745; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold;&quot;&gt;
    Testez Ticktick ici
  &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;comment-commencer&quot;&gt;Comment commencer avec TickTick ?&lt;/h2&gt;

&lt;p&gt;Pour démarrer rapidement et exploiter pleinement l’application, suivez ces quelques étapes :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Téléchargez l’application&lt;/strong&gt; sur votre plateforme préférée (iOS, Android, Windows, macOS ou via le web).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Créez un compte&lt;/strong&gt; gratuit ou connectez-vous avec votre compte Google, Facebook ou Apple.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Commencez par créer une première liste&lt;/strong&gt;, par exemple « Tâches quotidiennes » pour organiser vos priorités.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Explorez les fonctionnalités Premium&lt;/strong&gt; grâce à l’essai gratuit proposé lors de l’inscription.&lt;/li&gt;
&lt;/ol&gt;

&lt;div style=&quot;text-align: center; margin: 20px 0; background-color: #f8f8f8; padding: 20px;&quot;&gt;
  &lt;a href=&quot;https://ticktick.com/r?c=c5klrp9g&quot; style=&quot;display: inline-block; padding: 15px 30px; background-color: #28a745; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold;&quot;&gt;
    Profitez de TickTick gratuitement !
  &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;

&lt;h3 id=&quot;ticktick-est-il-sûr-pour-mes-données-personnelles-&quot;&gt;TickTick est-il sûr pour mes données personnelles ?&lt;/h3&gt;

&lt;p&gt;La sécurité des données personnelles avec TickTick suscite certaines interrogations, notamment en raison de son origine chinoise et d’un manque de transparence perçu. Bien que &lt;strong&gt;TickTick utilise Amazon Web Services (AWS)&lt;/strong&gt; pour le stockage des données – garantissant une infrastructure sécurisée –, cela ne signifie pas nécessairement que l’entreprise ne peut pas consulter les données des utilisateurs.&lt;/p&gt;

&lt;p&gt;Certains utilisateurs craignent que TickTick ne soit un “&lt;strong&gt;programme espion chinois&lt;/strong&gt;” et hésitent à y confier des informations sensibles. Le manque d’informations claires sur l’entreprise et sa direction alimente également ces inquiétudes.&lt;/p&gt;

&lt;h3 id=&quot;quelles-sont-les-options-de-partage-et-de-collaboration-de-ticktick-&quot;&gt;Quelles sont les options de partage et de collaboration de TickTick ?&lt;/h3&gt;

&lt;p&gt;TickTick propose des options de partage et de collaboration efficaces. Il permet le &lt;strong&gt;partage de listes avec des amis et des collègues&lt;/strong&gt;, facilitant ainsi l’attribution et le suivi des tâches.&lt;br /&gt;
Les utilisateurs peuvent suivre l’avancée des travaux, assigner ou récupérer des tâches, et mettre à jour le statut en temps réel selon l’évolution des projets.&lt;/p&gt;

&lt;h3 id=&quot;ticktick-est-il-totalement-gratuit-ou-y-a-t-il-des-coûts-cachés-&quot;&gt;TickTick est-il totalement gratuit ou y a-t-il des coûts cachés ?&lt;/h3&gt;

&lt;p&gt;TickTick propose une &lt;strong&gt;version gratuite&lt;/strong&gt; qui offre de nombreuses fonctionnalités permettant d’organiser, gérer et collaborer sur les tâches. Toutefois, pour accéder à des fonctionnalités plus avancées, il est nécessaire de passer à la &lt;strong&gt;version Premium payante&lt;/strong&gt;.&lt;br /&gt;
La version Premium offre notamment un &lt;strong&gt;nombre accru de listes et de tâches&lt;/strong&gt;, la possibilité d’ajouter plus de rappels par tâche, le partage de listes avec davantage de membres, ainsi que l’accès à des vues de calendrier avancées.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Gestion des dates et timezones MySQL : optimisation et index</title>
     <link href="https://kandran.fr/gestion-dates-timezones-mysql"/>
     <updated>2024-11-30T00:00:00+00:00</updated>
     <id>https://kandran.fr/gestion-date-timezone-mysql</id>
     <content type="html">&lt;p&gt;La gestion des dates et des timezones dans MySQL est une problématique incontournable pour les applications modernes. 
Que ce soit pour synchroniser des données entre plusieurs régions ou optimiser vos requêtes, une approche réfléchie est essentielle.&lt;/p&gt;

&lt;p&gt;Combien de fois vos requêtes SQL ont-elles ralenti à cause d’un mauvais filtre sur les dates ?
Dans cet article, nous explorons les subtilités des dates et des timezones, en abordant des exemples pratiques, des astuces d’optimisation et des solutions avancées comme la création d’index dérivés.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2024/11/gestion-dates-timezones-mysql/gestion-dates-timezones-thumbnail.jpg&quot; alt=&quot;Illustration sur la gestion des dates et timezones&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;1-pourquoi-la-gestion-des-dates-et-timezones-est-cruciale&quot;&gt;1. Pourquoi la gestion des dates et timezones est cruciale&lt;/h2&gt;

&lt;p&gt;Dans les bases de données modernes, travailler avec des dates implique souvent de jongler avec des fuseaux horaires différents.&lt;/p&gt;

&lt;p&gt;Cela peut devenir problématique lorsque :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Vous devez afficher les dates dans le fuseau horaire de l’utilisateur.&lt;/li&gt;
  &lt;li&gt;Les comparaisons ou filtrages impliquent des transformations sur des colonnes datetime.&lt;/li&gt;
  &lt;li&gt;Les performances de vos requêtes se dégradent à cause de la perte d’indexation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MySQL offre des outils puissants pour gérer ces problématiques, mais leur mauvaise utilisation peut entraîner des impacts significatifs sur les performances.&lt;/p&gt;

&lt;h2 id=&quot;2-les-timezones-dans-mysql&quot;&gt;2. Les timezones dans MySQL&lt;/h2&gt;

&lt;h3 id=&quot;21-utiliser-convert_tz&quot;&gt;2.1 Utiliser &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONVERT_TZ()&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;La fonction &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONVERT_TZ()&lt;/code&gt; permet de convertir une date d’un fuseau horaire à un autre.&lt;/p&gt;

&lt;p&gt;C’est une fonctionnalité essentielle pour s’assurer que vos dates sont interprétées correctement en fonction du contexte utilisateur.&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONVERT_TZ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30 12:00:00&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;UTC&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Europe/Paris&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;converted_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pour que cette fonction fonctionne correctement, assurez-vous que vos tables &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;time_zone&lt;/code&gt; sont configurées dans MySQL :&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; root mysql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;22-vérifier-et-modifier-les-timezones&quot;&gt;2.2 Vérifier et modifier les timezones&lt;/h3&gt;

&lt;p&gt;Vous pouvez vérifier la timezone actuelle utilisée par le serveur MySQL :&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;@@&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time_zone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;@@&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time_zone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pour changer la timezone au niveau session ou global :&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time_zone&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Europe/Paris&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;23-now-vs-utc_timestamp&quot;&gt;&lt;strong&gt;2.3 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NOW()&lt;/code&gt; vs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UTC_TIMESTAMP()&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NOW()&lt;/code&gt; : retourne la date/heure locale selon la timezone du serveur MySQL.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UTC_TIMESTAMP()&lt;/code&gt; : retourne toujours la date/heure en UTC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;3-optimiser-les-formats-de-date-avec-date_format&quot;&gt;3. Optimiser les formats de date avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT()&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;La fonction &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT()&lt;/code&gt; permet de personnaliser le format de vos dates pour les rendre plus lisibles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple d’utilisation :&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DATE_FORMAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;%W, %D %M %Y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formatted_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;-- Résultat : Saturday, 30th November 2024&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Spécificateurs utiles :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%Y&lt;/code&gt; : Année sur quatre chiffres.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%m&lt;/code&gt; : Mois sur deux chiffres.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%d&lt;/code&gt; : Jour du mois sur deux chiffres.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%H&lt;/code&gt; : Heure (24h).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%i&lt;/code&gt; : Minutes.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%s&lt;/code&gt;: Secondes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;4-impact-sur-les-index&quot;&gt;4. Impact sur les index&lt;/h2&gt;

&lt;p&gt;Lorsque vous utilisez &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT()&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONVERT_TZ()&lt;/code&gt; dans une clause &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WHERE&lt;/code&gt;, MySQL ne peut pas tirer parti des index sur la colonne datetime. Cela peut entraîner des ralentissements, notamment sur des tables volumineuses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple problématique :&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;orders&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DATE_FORMAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dans cet exemple, l’utilisation de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT()&lt;/code&gt; force MySQL à effectuer une transformation sur chaque ligne, ce qui empêche l’utilisation d’un index.&lt;/p&gt;

&lt;p&gt;Les performences sont dont fortement dégradé des l’augmentation du volume.&lt;/p&gt;

&lt;h2 id=&quot;5-optimisations&quot;&gt;5. Optimisations&lt;/h2&gt;

&lt;h3 id=&quot;51-utiliser-un-pre-filtre&quot;&gt;5.1 Utiliser un &lt;em&gt;pre-filtre&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Pour optimiser vos requêtes tout en tenant compte des timezones, il est souvent plus efficace d’utiliser une approche en deux étapes. D’abord, filtrez avec une plage plus large qui utilise l’index, puis affinez le résultat avec une conversion de timezone.&lt;/p&gt;

&lt;p&gt;Par exemple pour passer de UTC jusqu’a Europe/Paris on sait qu’on va avoir un décalage de une ou deux heures (en fonction de la periode).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Petit tips : Faites attention le changement d’heure change en fonctions des années et ca n’a pas toujours été régis par une regle fixe comme dernier samedi de mars ou d’octobre&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour eviter tout soucis je vous conseille de voir toujours un peu plus large&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;events&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;event_date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30 08:10:00&apos;&lt;/span&gt; 
  &lt;span class=&quot;k&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;event_date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30 16:10:00&apos;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONVERT_TZ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;event_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;UTC&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Europe/Paris&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30 12:00:00&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONVERT_TZ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;event_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;UTC&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Europe/Paris&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30 14:00:00&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Il s’agit d’une solution que j’utilise régulierement de mon coté quand je dois transformer des dates pour des resultats statistique.&lt;/p&gt;

&lt;h3 id=&quot;52-créer-des-index-dérivés-pour-optimiser-les-transformations&quot;&gt;5.2 Créer des index dérivés pour optimiser les transformations&lt;/h3&gt;

&lt;p&gt;Pour pallier les limitations des fonctions comme &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT()&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONVERT_TZ()&lt;/code&gt;, il est également possible de créer des colonnes calculées et de leur appliquer un index. Cette méthode permet de conserver des requêtes rapides tout en manipulant facilement les dates.&lt;/p&gt;

&lt;h4 id=&quot;521-ajouter-une-colonne-calculée&quot;&gt;5.2.1 Ajouter une colonne calculée&lt;/h4&gt;

&lt;p&gt;Ajoutez une colonne dérivée pour stocker le résultat de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT()&lt;/code&gt; ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CONVERT_TZ()&lt;/code&gt; et indexez-la.&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;orders&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COLUMN&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formatted_date&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;GENERATED&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ALWAYS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DATE_FORMAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;%Y-%m-%d&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;STORED&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;INDEX&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx_formatted_date&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;ON&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;orders&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;formatted_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dans cet exemple :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;formatted_date&lt;/code&gt; contient le résultat de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DATE_FORMAT(order_date, &apos;%Y-%m-%d&apos;)&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;L’index &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;idx_formatted_date&lt;/code&gt; optimise les recherches sur cette colonne.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;521-utilisation-dans-une-requête&quot;&gt;5.2.1 Utilisation dans une requête&lt;/h4&gt;

&lt;p&gt;Une fois l’index appliqué, vos requêtes sont bien plus performantes :&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;orders&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;formatted_date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;2024-11-30&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;avantages-et-inconvénients&quot;&gt;Avantages et inconvénients&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Les requêtes sont optimisées grâce à l’index sur la colonne dérivée.&lt;/li&gt;
      &lt;li&gt;Moins de transformations sont effectuées lors de l’exécution des requêtes.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Cela augmente légèrement la taille de la table.&lt;/li&gt;
      &lt;li&gt;Nécessite de recalculer la colonne dérivée lors des mises à jour.&lt;/li&gt;
      &lt;li&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personellement je n’utilise quasiment jamais cette solution.&lt;/p&gt;

&lt;h2 id=&quot;6-conseils-pratiques-pour-maximiser-les-performances&quot;&gt;6. Conseils pratiques pour maximiser les performances&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Évitez d’utiliser des fonctions sur les colonnes indexées dans vos clauses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WHERE&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Préférez les colonnes dérivées ou des solutions de filtre en deux etapes.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Stockez les dates en UTC dans la base de données.&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Cela garantit une cohérence globale et simplifie les conversions.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Maintenez vos timezones à jour.&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Les règles de fuseau horaire évoluent (changements d’heure, nouvelles lois). Assurez-vous que vos tables MySQL sont à jour avec :&lt;/p&gt;

        &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; root mysql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Ajoutez des colonnes supplémentaires si nécessaire.&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Par exemple, une colonne pré-calculée avec la timezone locale pour accélérer les requêtes fréquemment exécutées.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Usez et abusez de EXPLAIN&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Ca vous permettra de verifier la bonne utilisation de vos index (je vous conseille de toujours vous en servir)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;faq--gestion-des-dates-et-timezones-en-mysql&quot;&gt;FAQ : gestion des dates et timezones en MySQL&lt;/h2&gt;

&lt;p&gt;Pour répondre rapidement aux questions fréquentes sur ce sujet, voici une FAQ résumant les points essentiels de l’article.&lt;/p&gt;

&lt;h3 id=&quot;comment-mysql-gère-t-il-les-timezones-par-défaut-&quot;&gt;Comment MySQL gère-t-il les timezones par défaut ?&lt;/h3&gt;
&lt;p&gt;Par défaut, MySQL utilise la timezone du système d’exploitation. Vous pouvez la modifier avec une commande comme :&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time_zone&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Europe/Paris&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;quelle-est-la-meilleure-pratique-pour-stocker-des-dates-dans-mysql-&quot;&gt;Quelle est la meilleure pratique pour stocker des dates dans MySQL ?&lt;/h3&gt;
&lt;p&gt;Toujours stocker les dates en UTC et effectuer les conversions nécessaires au niveau de l’application. Cela garantit la cohérence des données et simplifie leur gestion dans des systèmes distribués.&lt;/p&gt;

&lt;h3 id=&quot;pourquoi-utiliser-explain-dans-vos-requêtes-sql-&quot;&gt;Pourquoi utiliser EXPLAIN dans vos requêtes SQL ?&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EXPLAIN&lt;/code&gt; est un outil essentiel pour vérifier si vos requêtes utilisent les index efficacement. Il permet d’identifier les goulots d’étranglement et d’optimiser vos requêtes en conséquence.&lt;/p&gt;

&lt;h2 id=&quot;6-conclusion&quot;&gt;6. Conclusion&lt;/h2&gt;

&lt;p&gt;La gestion des dates et des timezones en MySQL nécessite une attention particulière pour garantir la précision des données tout en optimisant les performances. En adoptant des solutions comme les colonnes dérivées indexées, vous pouvez :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Gérer efficacement les fuseaux horaires.&lt;/li&gt;
  &lt;li&gt;Maintenir une base de données performante même avec de gros volumes de données.&lt;/li&gt;
  &lt;li&gt;Éviter les pièges classiques des transformations sur colonnes datetime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec ces bonnes pratiques, vous serez prêt à relever les défis liés à la gestion des dates et timezones dans vos projets SQL.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>5 outils gratuits pour booster votre productivité en dev web</title>
     <link href="https://kandran.fr/outils-productivite-developpeur-web/"/>
     <updated>2024-11-21T00:00:00+00:00</updated>
     <id>https://kandran.fr/outils-productivite-developpeur-web</id>
     <content type="html">&lt;p&gt;En tant que développeur web, il est crucial d’utiliser les bons outils pour optimiser votre temps et améliorer vos performances. Heureusement, il existe des solutions gratuites qui couvrent tous les aspects du développement : édition de code, gestion de projets, collaboration ou encore tests d’API. Voici ma sélection des &lt;strong&gt;5 outils gratuits incontournables&lt;/strong&gt; pour tout développeur web.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;1-visual-studio-code-vs-code&quot;&gt;1. &lt;strong&gt;Visual Studio Code (VS Code)&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;pourquoi-lutiliser-&quot;&gt;Pourquoi l’utiliser ?&lt;/h4&gt;
&lt;p&gt;Cet éditeur de code gratuit est une référence dans le monde du développement grâce à sa légèreté et ses nombreuses extensions. Que vous travailliez sur du PHP, du JavaScript ou d’autres langages, VS Code s’adapte parfaitement à vos besoins.&lt;/p&gt;

&lt;p&gt;C’est probablement le meilleur IDE gratuit, en alternative payante les outils jetbrains sont vraiment incroyable.&lt;/p&gt;

&lt;h4 id=&quot;fonctionnalités-clés-&quot;&gt;Fonctionnalités clés :&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Intégration Git native pour un suivi des versions.&lt;/li&gt;
  &lt;li&gt;Extensions comme &lt;em&gt;Prettier&lt;/em&gt; (formatage automatique) ou &lt;em&gt;PHP Intelephense&lt;/em&gt; (autocomplétion avancée).&lt;/li&gt;
  &lt;li&gt;Mode collaboratif avec &lt;em&gt;Live Share&lt;/em&gt; pour coder simultanément avec vos collègues.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Personnalisez votre environnement avec des thèmes comme &lt;em&gt;Dracula&lt;/em&gt; ou &lt;em&gt;One Dark Pro&lt;/em&gt; pour un confort visuel optimal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;2-trello&quot;&gt;2. &lt;strong&gt;Trello&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;pourquoi-lutiliser--1&quot;&gt;Pourquoi l’utiliser ?&lt;/h4&gt;
&lt;p&gt;Trello est un outil simple et visuel basé sur des tableaux Kanban. Il est parfait pour organiser vos tâches et suivre l’avancement de vos projets de développement.&lt;/p&gt;

&lt;h4 id=&quot;fonctionnalités-clés--1&quot;&gt;Fonctionnalités clés :&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Création de tableaux pour gérer vos tâches par étape (ex. : “À faire”, “En cours”, “Terminé”).&lt;/li&gt;
  &lt;li&gt;Intégrations avec des outils comme Slack ou Google Drive.&lt;/li&gt;
  &lt;li&gt;Version gratuite suffisante pour la plupart des projets individuels ou en équipe.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Utilisez des étiquettes colorées pour prioriser vos tâches selon leur urgence ou leur importance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;3-postman&quot;&gt;3. &lt;strong&gt;Postman&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;pourquoi-lutiliser--2&quot;&gt;Pourquoi l’utiliser ?&lt;/h4&gt;
&lt;p&gt;Postman est un outil incontournable pour tester et déboguer vos API. Il permet d’envoyer facilement des requêtes HTTP et d’analyser les réponses.&lt;/p&gt;

&lt;h4 id=&quot;fonctionnalités-clés--2&quot;&gt;Fonctionnalités clés :&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Testez des requêtes GET, POST, PUT ou DELETE en quelques clics.&lt;/li&gt;
  &lt;li&gt;Créez et partagez des collections d’API avec votre équipe.&lt;/li&gt;
  &lt;li&gt;Simulez différents environnements (local, staging, production).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Automatisez vos tests directement dans Postman pour vérifier la stabilité de vos API après chaque mise à jour.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;J’ai eu la chance de faire une présentation au /dev/var de l’outil : &lt;a src=&quot;https://kandran.fr/presentations/slides-postman-devvar15&quot; target=&quot;_blank&quot;&gt; Découvrir la présentation de postman &lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;4-figma&quot;&gt;4. &lt;strong&gt;Figma&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;pourquoi-lutiliser--3&quot;&gt;Pourquoi l’utiliser ?&lt;/h4&gt;
&lt;p&gt;Pour les développeurs front-end ou ceux qui collaborent avec des designers, Figma est une solution collaborative puissante pour créer et partager des maquettes interactives.&lt;/p&gt;

&lt;h4 id=&quot;fonctionnalités-clés--3&quot;&gt;Fonctionnalités clés :&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Travaillez en temps réel avec votre équipe sur les mêmes designs.&lt;/li&gt;
  &lt;li&gt;Exportez facilement les assets nécessaires au développement front-end.&lt;/li&gt;
  &lt;li&gt;Accédez à une bibliothèque communautaire de templates gratuits via &lt;em&gt;Figma Community&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Utilisez Figma pour créer rapidement des wireframes avant de vous lancer dans le code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;5-github&quot;&gt;5. &lt;strong&gt;GitHub&lt;/strong&gt;&lt;/h3&gt;

&lt;h4 id=&quot;pourquoi-lutiliser--4&quot;&gt;Pourquoi l’utiliser ?&lt;/h4&gt;
&lt;p&gt;GitHub n’est pas seulement une plateforme de gestion de version ; c’est aussi un outil collaboratif puissant pour partager votre code et travailler en équipe sur des projets open source ou privés.&lt;/p&gt;

&lt;h4 id=&quot;fonctionnalités-clés--4&quot;&gt;Fonctionnalités clés :&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Hébergez gratuitement vos dépôts publics ou privés.&lt;/li&gt;
  &lt;li&gt;Utilisez les &lt;em&gt;Issues&lt;/em&gt; et &lt;em&gt;Projects&lt;/em&gt; pour gérer les tâches liées à chaque projet.&lt;/li&gt;
  &lt;li&gt;Automatisez vos workflows avec &lt;em&gt;GitHub Actions&lt;/em&gt; (tests CI/CD).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Explorez les dépôts open source populaires sur GitHub pour apprendre de nouvelles techniques et contribuer à la communauté.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Ces outils gratuits sont essentiels pour tout développeur web souhaitant améliorer sa productivité. Ils couvrent tous les aspects critiques du métier : édition de code, gestion de projet, test d’API, conception UI/UX et collaboration. Essayez-les dès aujourd’hui et transformez votre workflow !&lt;/p&gt;

&lt;p&gt;Et vous ? Quels sont vos outils préférés ? Partagez-les dans les commentaires ! 😊&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>DMARC : Sécurisez vos emails contre le phishing</title>
     <link href="https://kandran.fr/dmarc-securite-email/"/>
     <updated>2024-10-27T00:00:00+00:00</updated>
     <id>https://kandran.fr/dmarc-securite-email</id>
     <content type="html">&lt;h2 id=&quot;dmarc-spf-dkim--les-clés-de-la-sécurité-de-lemailing&quot;&gt;DMARC, SPF, DKIM : Les Clés de la Sécurité de l’Emailing&lt;/h2&gt;

&lt;p&gt;Les attaques de &lt;strong&gt;phishing&lt;/strong&gt; sont un problème majeur en &lt;strong&gt;cybersécurité&lt;/strong&gt;, affectant des milliers d’entreprises et d’individus chaque année par des &lt;strong&gt;e-mails frauduleux&lt;/strong&gt;. Une bonne gestion de la sécurité des e-mails est essentielle pour prévenir ces menaces, et cela passe par la mise en place de protocoles tels que &lt;strong&gt;DMARC&lt;/strong&gt;, &lt;strong&gt;SPF&lt;/strong&gt;, et &lt;strong&gt;DKIM&lt;/strong&gt;. Ces technologies, lorsque bien configurées, permettent de renforcer la crédibilité de vos &lt;strong&gt;communications par email&lt;/strong&gt; et de protéger votre domaine contre les attaques.&lt;/p&gt;

&lt;h3 id=&quot;quest-ce-que-dmarc-spf-et-dkim-&quot;&gt;Qu’est-ce que DMARC, SPF et DKIM ?&lt;/h3&gt;

&lt;h4 id=&quot;spf-sender-policy-framework&quot;&gt;SPF (Sender Policy Framework)&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;SPF&lt;/strong&gt; est un protocole qui permet de définir les serveurs autorisés à envoyer des emails en votre nom. Cela empêche les attaquants d’utiliser votre domaine pour envoyer des e-mails malveillants, réduisant ainsi les risques d’usurpation d’identité.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;SPF Policy Types&lt;/strong&gt; :
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-all&lt;/code&gt; : Rejette tous les emails non autorisés.&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~all&lt;/code&gt; : Soft fail (les e-mails non autorisés seront marqués comme suspects).&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?all&lt;/code&gt; : Neutre (aucune action spécifique, laisse le serveur du destinataire décider).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour tester et vérifier votre configuration SPF, vous pouvez utiliser des outils en ligne comme &lt;a href=&quot;https://mxtoolbox.com/SPFRecordLookup.aspx&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;MXToolbox&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;dkim-domainkeys-identified-mail&quot;&gt;DKIM (DomainKeys Identified Mail)&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;DKIM&lt;/strong&gt; ajoute une signature numérique unique à chaque email envoyé, permettant au destinataire de vérifier que l’email est bien authentique et qu’il n’a pas été modifié durant son transit. Cette authentification assure l’intégrité des messages et contribue à établir la confiance.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;DKIM Configuration&lt;/strong&gt; : La signature est générée par une paire de clés publique/privée. La clé publique est publiée dans les enregistrements DNS, et la clé privée est utilisée par le serveur d’envoi pour signer les emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;dmarc-domain-based-message-authentication-reporting--conformance&quot;&gt;DMARC (Domain-based Message Authentication, Reporting &amp;amp; Conformance)&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;DMARC&lt;/strong&gt; se base sur les protocoles SPF et DKIM pour offrir une politique de validation unifiée. Il permet au propriétaire du domaine de définir la manière dont les emails non conformes doivent être traités (par exemple, rejeter, mettre en quarantaine). En plus de cette validation, DMARC fournit des rapports sur les échecs de vérification, ce qui permet une meilleure supervision et ajustement de la sécurité.&lt;/p&gt;

&lt;h3 id=&quot;exemples-de-configuration-pour-dmarc-spf-et-dkim&quot;&gt;Exemples de Configuration pour DMARC, SPF et DKIM&lt;/h3&gt;

&lt;h4 id=&quot;exemple-de-configuration-spf&quot;&gt;Exemple de Configuration SPF&lt;/h4&gt;

&lt;p&gt;Pour configurer SPF, vous devez ajouter un enregistrement TXT à votre DNS. Voici un exemple :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;v=spf1 include:_spf.google.com -all&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dans cet exemple :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v=spf1&lt;/code&gt; indique la version du SPF.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;include:_spf.google.com&lt;/code&gt; signifie que Google est autorisé à envoyer des e-mails au nom de votre domaine.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-all&lt;/code&gt; définit que tout autre serveur non spécifié sera rejeté.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;exemple-de-configuration-dkim&quot;&gt;Exemple de Configuration DKIM&lt;/h4&gt;

&lt;p&gt;DKIM implique de générer une paire de clés publique/privée. La clé publique doit être ajoutée à vos enregistrements DNS :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC... (clé publique abrégée)&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v=DKIM1&lt;/code&gt; : Version du DKIM.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;k=rsa&lt;/code&gt; : Type de chiffrement utilisé.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;p=&lt;/code&gt; : La clé publique qui sera utilisée pour vérifier la signature DKIM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La clé privée est installée sur le serveur de messagerie, qui signe les e-mails sortants.&lt;/p&gt;

&lt;h4 id=&quot;exemple-de-configuration-dmarc&quot;&gt;Exemple de Configuration DMARC&lt;/h4&gt;

&lt;p&gt;Pour DMARC, un enregistrement TXT doit être ajouté à votre DNS, comme ci-dessous :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;v=DMARC1; p=reject; rua=mailto:dmarc-reports@votre-domaine.com; ruf=mailto:dmarc-failures@votre-domaine.com; pct=100&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;v=DMARC1&lt;/code&gt; : Version de DMARC.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;p=reject&lt;/code&gt; : Politique appliquée aux e-mails non conformes (ici, rejet total des e-mails non validés).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rua&lt;/code&gt; : Adresse e-mail de rapport agrégé.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ruf&lt;/code&gt; : Adresse pour les rapports de forensic (rapports détaillés).&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pct=100&lt;/code&gt; : Pourcentage d’e-mails auxquels appliquer la politique.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;comprendre-les-différentes-politiques-dmarc&quot;&gt;Comprendre les Différentes Politiques DMARC&lt;/h3&gt;

&lt;p&gt;Lors de la configuration de &lt;strong&gt;DMARC&lt;/strong&gt;, vous avez le choix entre trois politiques : &lt;strong&gt;none&lt;/strong&gt;, &lt;strong&gt;quarantine&lt;/strong&gt;, et &lt;strong&gt;reject&lt;/strong&gt;. Une politique en “&lt;strong&gt;none&lt;/strong&gt;” est souvent utilisée lors des premières phases de mise en place, car elle permet de collecter des informations sans impacter la délivrabilité des e-mails. Cette phase est cruciale pour évaluer les résultats et ajuster la configuration des protocoles SPF et DKIM. Cependant, une politique en “none” n’offre aucune protection réelle contre les e-mails frauduleux.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; : Le domaine n’exige aucune action sur les e-mails non conformes, mais reçoit des rapports pour observer le trafic. Cela permet de comprendre la provenance des problèmes avant de passer à des mesures plus strictes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Quarantine&lt;/strong&gt; : Les e-mails non conformes sont mis en quarantaine (par exemple, redirigés vers le dossier spam).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reject&lt;/strong&gt; : Les e-mails non conformes sont tout simplement rejetés et n’atteignent jamais la boîte de réception du destinataire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il est recommandé de passer progressivement de “none” à “reject” afin d’assurer une protection maximale contre les cyberattaques par e-mail, tout en évitant les interruptions involontaires de la délivrabilité.&lt;/p&gt;

&lt;h3 id=&quot;dmarc-et-la-cybersécurité--prévenir-les-attaques-de-phishing&quot;&gt;DMARC et la Cybersécurité : Prévenir les Attaques de Phishing&lt;/h3&gt;

&lt;p&gt;Une des principales menaces pour les entreprises aujourd’hui est le &lt;strong&gt;phishing&lt;/strong&gt;, où des attaquants envoient des e-mails qui semblent provenir de sources fiables dans le but de voler des informations sensibles. &lt;strong&gt;DMARC&lt;/strong&gt; joue un rôle essentiel dans la prévention du phishing en évitant que des attaquants n’usurpent votre domaine pour envoyer ces faux e-mails.&lt;/p&gt;

&lt;p&gt;Un exemple récent de campagne de &lt;strong&gt;phishing&lt;/strong&gt; concerne les e-mails frauduleux visant les usagers de l’&lt;strong&gt;ANTS&lt;/strong&gt; (Agence Nationale des Titres Sécurisés). Ces messages étaient conçus pour ressembler à des communications officielles afin de soutirer des informations personnelles. Si l’ANTS avait mis en place une politique stricte DMARC (comme “reject”), il aurait été possible d’empêcher la grande majorité de ces e-mails frauduleux d’atteindre leur cible.&lt;/p&gt;

&lt;p&gt;En effet, de par la politique dmarc en none de france-identite.gouv.fr les attaquant on eu la possibilité d’envoyer des mails avec en expéditeur noreply@france-identite.gouv.fr ce qui est vraiment sensible. En effet le domaine utilisé est le bon et a part en regardant les headers c’est difficile de le voir (meme si gmail montre le relais de mémoire).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://ants.gouv.fr/toute-l-actualite/alerte-a-la-fraude-campagne-de-phishing&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Lien vers l’alerte officielle ANTS concernant cette campagne de phishing&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;bonnes-pratiques-en-emailing-pour-une-meilleure-sécurité&quot;&gt;Bonnes Pratiques en Emailing pour une Meilleure Sécurité&lt;/h3&gt;

&lt;p&gt;Pour assurer la sécurité de vos campagnes d’&lt;strong&gt;emailing&lt;/strong&gt; et éviter que votre domaine soit utilisé à des fins malveillantes, il est important de suivre certaines bonnes pratiques :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Commencez par une phase de surveillance avec une politique DMARC en “none”&lt;/strong&gt;, pour analyser les rapports et identifier les problèmes. Evidement si vous êtes sur un nouveaux domaine vous pouvez directement passer en reject (il n’ya pas de soucis de potentiellement casser l’existant).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Configurez correctement SPF et DKIM&lt;/strong&gt; afin de garantir l’authenticité de vos e-mails.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Passez progressivement à une politique de “quarantine” puis de “reject”&lt;/strong&gt;, pour renforcer la sécurité de vos e-mails et minimiser les risques de phishing.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Vérifiez régulièrement les rapports DMARC&lt;/strong&gt; afin de maintenir une bonne délivrabilité et assurer une protection optimale.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notons qu’actuellement DMARC est obligatoire pour envoyer des mails vers gmail ou yahoo (il faut l’enregistrement même en none)&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;La mise en place de &lt;strong&gt;DMARC&lt;/strong&gt;, &lt;strong&gt;SPF&lt;/strong&gt;, et &lt;strong&gt;DKIM&lt;/strong&gt; est essentielle pour protéger les communications par email et améliorer la &lt;strong&gt;cybersécurité&lt;/strong&gt; de votre organisation. En suivant une approche progressive, vous pouvez renforcer votre &lt;strong&gt;emailing&lt;/strong&gt; et réduire considérablement les risques d’attaques par &lt;strong&gt;phishing&lt;/strong&gt;. Comme l’illustre l’exemple de l’ANTS, des mesures strictes peuvent éviter des conséquences importantes pour les utilisateurs et les entreprises.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Partitionnement MySQL : Optimiser les performances des tables</title>
     <link href="https://kandran.fr/mysql-partionnement-intro/"/>
     <updated>2018-12-31T00:00:00+00:00</updated>
     <id>https://kandran.fr/mysql-partionnement-introduction</id>
     <content type="html">&lt;p&gt;Avec le temps, de nombreuses tables MySQL deviennent volumineuses, ce qui rallonge les temps de recherche, même avec des index bien choisis. 
Une solution efficace à ce problème est le &lt;strong&gt;partitionnement&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;partitionnement-mysql--quest-ce-que-cest-&quot;&gt;Partitionnement MySQL : Qu’est-ce que c’est ?&lt;/h2&gt;

&lt;p&gt;Imaginez une bibliothèque avec toutes les informations dans un seul livre. Malgré un bon index, la recherche reste lente.&lt;/p&gt;

&lt;p&gt;Si le livre est divisé en plusieurs tomes et que vous ne cherchez que dans un seul, l’index devient beaucoup plus rapide. 
Le partitionnement MySQL fonctionne de la même manière, mais pour les tables.&lt;/p&gt;

&lt;p&gt;Cet article se concentre sur le partitionnement &lt;strong&gt;horizontal&lt;/strong&gt; (par ligne).&lt;/p&gt;

&lt;h2 id=&quot;quand-et-comment-appliquer-le-partitionnement-à-vos-tables-&quot;&gt;Quand et comment appliquer le partitionnement à vos tables ?&lt;/h2&gt;

&lt;p&gt;Pour vérifier si le partitionnement est activé :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;SHOW&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PLUGINS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Vous devez voir “partition” avec le statut &lt;strong&gt;ACTIVE&lt;/strong&gt;. Certaines tables ne peuvent pas être partitionnées :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tables avec un index &lt;strong&gt;full text&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Tables avec des &lt;strong&gt;clés étrangères&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Tables qui sont des références de clés étrangères pour d’autres tables&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;choisir-la-clé-de-partitionnement&quot;&gt;Choisir la clé de partitionnement&lt;/h2&gt;

&lt;p&gt;La clé de partitionnement doit respecter ces conditions :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Être numérique&lt;/li&gt;
  &lt;li&gt;Faire partie de la &lt;strong&gt;clé primaire&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;types-de-partitionnement-mysql&quot;&gt;Types de Partitionnement MySQL&lt;/h2&gt;

&lt;h3 id=&quot;partitionnement-par-range&quot;&gt;Partitionnement par Range&lt;/h3&gt;

&lt;p&gt;Les lignes sont réparties selon des zones définies. 
On ne peut pas utiliser directement de dates, mais des fonctions MySQL comme &lt;strong&gt;YEAR&lt;/strong&gt; sont autorisées.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;RANGE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;LESS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;THAN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;LESS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;THAN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p2&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;LESS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;THAN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p3&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;LESS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;THAN&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;MAXVALUE&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;partitionnement-par-list&quot;&gt;Partitionnement par List&lt;/h2&gt;

&lt;p&gt;Les valeurs de la clé de partitionnement doivent correspondre à une des valeurs définies dans la liste.
Si la valeur n’est présente dans aucune liste, alors l’insertion est perdue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Il n’y a pas de valeur de catch !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cette methode s’adapte bien pour des clefs fixes et bien définies.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;store_id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LIST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;store_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pNorth&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;17&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pEast&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pWest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;13&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pCentral&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;VALUES&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;IN&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;partitionnement-par-hash&quot;&gt;Partitionnement par Hash&lt;/h2&gt;

&lt;p&gt;La valeur dans le HASH doit etre entière. 
On peut utiliser une fonction mysql mais pour une valeur précise la valeur de sortie doit être identique.&lt;/p&gt;

&lt;p&gt;L’expression de la partition est calculée par &lt;strong&gt;valeurDuHash % nombreDePartitions&lt;/strong&gt;.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;example_date&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;DATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;1970-01-01&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;store_id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HASH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;YEAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;example_date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;PARTITIONS&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;partitionnement-par-key&quot;&gt;Partitionnement par Key&lt;/h2&gt;

&lt;p&gt;La clef n’est pas obligatoirement numérique, key utilise une fonction de hash propre a mysql (basé sur password).&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;example&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;store_id&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;INT&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;PARTITIONS&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h2 id=&quot;partitionnement-linear&quot;&gt;Partitionnement Linear&lt;/h2&gt;

&lt;p&gt;Le calcul de la partition se fait différemment via la fonction suivante :&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;    &lt;span class=&quot;n&quot;&gt;V&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;POWER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CEILING&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LOG&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;column_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;V&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;While&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;Set&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;V&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CEIL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;V&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;Set&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;V&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Ou :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;num : nombre de partitions&lt;/li&gt;
  &lt;li&gt;F(column_list) : Valeur de la fonction de hashage&lt;/li&gt;
  &lt;li&gt;N : partition selectionné&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contrairement a ce que dit le nom la répartition n’est pas linéaire.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;pruning-des-partitions&quot;&gt;Pruning des partitions&lt;/h2&gt;

&lt;p&gt;Le pruning des partitions permet à MySQL d’ignorer certaines partitions lors de l’exécution d’une requête, réduisant ainsi le volume de données à traiter. 
Seulement les partitions utiles seront lues.
Cela se traduit par un temps d’exécution plus rapide et une utilisation mémoire optimisée.&lt;/p&gt;

&lt;h2 id=&quot;actions-sur-les-partitions&quot;&gt;Actions sur les partitions&lt;/h2&gt;

&lt;h3 id=&quot;optimisation-des-partitions&quot;&gt;Optimisation des partitions&lt;/h3&gt;

&lt;p&gt;Lors suppression de ligne ou changement de taille des colonnes, il peut y avoir une fragmentation des données on peu alors 
lancer une optimisation par partition.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_table_partitioned&lt;/span&gt; 
&lt;span class=&quot;n&quot;&gt;OPTIMIZE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;partition_name_to_optimize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;réparation-des-partitions&quot;&gt;Réparation des partitions&lt;/h3&gt;

&lt;p&gt;En cas d’erreur sur les données ou les index on peut reparer par partion&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_table_partitioned&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;CHECK&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;suppression-de-partition&quot;&gt;Suppression de Partition&lt;/h3&gt;

&lt;p&gt;Grâce au partitionnement on peut supprimer des partitions directement. Ainsi la suppression d’un enregistrement par 
rapport a la date peut se faire rapidement même sur des gros volumes de données.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_table_partitioned&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;DROP&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;partition_name_to_drop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;ajout-de-partition&quot;&gt;Ajout de partition&lt;/h3&gt;

&lt;p&gt;On peut aussi ajouter des partitions&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_table_partitioned&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;PARTITION&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;partition_name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PARTITION_DESCRIPTION&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : Sur du partitionnement par range on ne peut pas ajouter de participation apres notre partition fourre-tout 
(celle en MAXVALUE ). Il faudra dont la supprimer au préalable, puis ajouter la nouvelle et la recréer. Bien sûr, il faut faire cela
avec quelle ne commence a se remplir.&lt;/p&gt;

&lt;h2 id=&quot;contraintes-mémoires&quot;&gt;Contraintes mémoires&lt;/h2&gt;

&lt;p&gt;Dans le cas des tables MyISAM, chaque partition utilise deux file descriptor qui doivent être ouvertes pour accéder aux données, 
et ceci est bien sûr par partition.&lt;/p&gt;

&lt;p&gt;Voici un petit aperçu du partitionnement, de son utilisation pour augmenter les performances sur des tables assez volumineuse.&lt;/p&gt;

</content>
   </entry>
   
 
   
   <entry>
     <title>Migration de Blog vers Jekyll : Guide et Avantages</title>
     <link href="https://kandran.fr/migration-sous-jekkyl/"/>
     <updated>2017-04-12T00:00:00+00:00</updated>
     <id>https://kandran.fr/blog-migration</id>
     <content type="html">&lt;p&gt;Comme je l’ai évoqué dans l’article bilan du début d’année j’ai migré ce blog de wordpress vers Jekkyl.
Je vais dès à présent vous donner plus d’information sur ce choix ainsi que sa mise en oeuvre.&lt;/p&gt;

&lt;h2 id=&quot;pourquoi-migrer-&quot;&gt;Pourquoi migrer ?&lt;/h2&gt;

&lt;p&gt;Le blog était sous wordpress, l’un des projets de blogging open source parmi les plus utilisés. Wordpress c’est bien, il y a pas mal de plugins, thèmes et j’en passe. L’éditeur est pas mal, la programmation d’article existe, des mises à jour régulières…&lt;/p&gt;

&lt;p&gt;Jusque là on peut se demander pourquoi quitter cette solution.&lt;/p&gt;

&lt;p&gt;Mais wordpress c’est aussi, plus ou moins lent, selon les plugins. Une surveillance constante des mises à jour (par rapport aux potentiels problèmes de sécurité). Pour résumer il y avait pas mal d’entretien à faire.&lt;/p&gt;

&lt;p&gt;J’ai alors décidé de partir sur un blog statique, via l’utilisation de jekyll. Alors, certes je perds l’interface d’admin et son éditeur, mais étant le seul rédacteur passer sur l’écriture d’article au format markdown n’est pas un soucis. De plus, ça me permet d’avoir un site assez léger et rapide (notamment via le fait que j’utilise cloudflare) et peu couteux (hébergement en github page - je paye donc uniquement le nom de domaine).&lt;/p&gt;

&lt;h2 id=&quot;étapes-de-migration&quot;&gt;Étapes de migration&lt;/h2&gt;

&lt;p&gt;Ce blog n’ayant que peu de commentaire j’ai pris la décision de ne pas les exporter lors de la migration, de ce fait je ne traiterai pas de cette partie dans cet article. N’hésitez pas à demander en commentaire (&lt;em&gt;je sais que c’est assez ironique&lt;/em&gt; ) si vous voulez plus d’information à propos de ce sujet.&lt;/p&gt;

&lt;h3 id=&quot;export-des-articles&quot;&gt;Export des articles&lt;/h3&gt;

&lt;p&gt;Pour exporter mes articles j’ai utilisé le plugin &lt;a href=&quot;https://wordpress.org/plugins/jekyll-exporter/&quot; target=&quot;_blank&quot;&gt;Jekyll Exporter&lt;/a&gt;. 
C’est assez simple, dans le menu “Outils” il y a un lien &lt;strong&gt;Export to Jekyll&lt;/strong&gt;.
Ça vous fait télécharger une archive zip avec vos articles et médias&lt;/p&gt;

&lt;h3 id=&quot;nettoyage-de-lexport&quot;&gt;Nettoyage de l’export&lt;/h3&gt;

&lt;p&gt;Bien que l’export via le plugin fasses quasiment 90 % du travail il faut effectuer une relecture pour corriger divers problèmes.&lt;/p&gt;

&lt;p&gt;Pour ma part j’ai eu des problèmes sur les articles possédant des shortcodes, en effet lors de l’export il y avait le shortcode au format texte uniquement. De même certains articles ayant des scripts inline (dans mon cas gist) ont eu un export sans le script.&lt;/p&gt;

&lt;p&gt;Enfin je suis aussi repassé sur les urls, afin de leur donner une structure correcte vis a vis de jekyll - à savoir via le fichier de configuration etc.&lt;/p&gt;

&lt;p&gt;C’est l’étape la plus longue de la migration, surtout si vous avez beaucoup d’articles à vérifier.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Sécuriser les données en JS : Chiffrement et confidentialité</title>
     <link href="https://kandran.fr/securite-et-confidentialite-en-javascript/"/>
     <updated>2017-01-22T00:00:00+00:00</updated>
     <id>https://kandran.fr/securite-et-confidentialite-en-javascript</id>
     <content type="html">&lt;p&gt;Lors de cet article je vais faire un compte rendu (que je compléterai en partie) d’un article du MISC 88 concernant la sécurité et
confidentialité des données en JavaScript.&lt;/p&gt;

&lt;p&gt;Vous pouvez bien entendu trouver l’article complet sur le &lt;a href=&quot;https://boutique.ed-diamond.com/anciens-numeros/1087-misc-88.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;site de l’éditeur&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;les-enjeux-de-la-sécurité-des-données-en-javascript&quot;&gt;Les enjeux de la sécurité des données en JavaScript&lt;/h2&gt;

&lt;p&gt;Avec le développement des nouvelles API JavaScript les sites web possèdent de plus en plus de données personnelles et 
critiques sur les utilisateurs.&lt;/p&gt;

&lt;p&gt;Certes parmi ces API nombreuses requièrent l’utilisation d’un certificat SSL pour pouvoir être utilisé - et encore cela 
dépend des navigateurs - il convient de constater que les informations ne sont pas toujours gérées de manière sécurisées 
côté serveur.&lt;/p&gt;

&lt;p&gt;En effet, même si cela semble impensable de nombreux sites web stockes les mots de passe en clair. Et même dans les 
rares cas où il y a du chiffrement côté serveur la confidentialité n’est pas pour autant totalement assuré. Maintenant 
imaginons que le serveur ne fait que stocker une partie des informations sans pouvoir les manipuler ou interpréter 
directement, car le chiffrement serait effectué côté client. On pourrait avoir dans ce cas-ci un niveau de 
confidentialité plus élevé.&lt;/p&gt;

&lt;h2 id=&quot;optimisation-des-performances-avec-asmjs&quot;&gt;Optimisation des performances avec ASM.js&lt;/h2&gt;

&lt;p&gt;ASM.js est un sous ensemble de JavaScript ayant pour but de manipuler des structures de données avec des performances 
correctes s’approchant de celles obtenues par du code natif dans l’idéal. Toutefois, il faut prendre en compte que cet 
ensemble dépends du navigateur et du moteur JavaScript utilisé.&lt;/p&gt;

&lt;p&gt;Concrètement ASM.js nous permet d’allouer un buffer pour ensuite le manipuler via des vues typées ce qui sera essentiel 
pour l’utilisation d’api de chiffrement JavaScript&lt;/p&gt;

&lt;h2 id=&quot;webcrypto-api--chiffrement-authentification-et-gestion-des-clés&quot;&gt;WebCrypto API : Chiffrement, authentification et gestion des clés&lt;/h2&gt;

&lt;p&gt;Il est possible depuis peu d’utiliser l’api &lt;a href=&quot;https://www.w3.org/TR/2016/PR-WebCryptoAPI-20161215/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Web Cryptography API&lt;/a&gt; dans les cas suivants :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Authentification multiples facteurs&lt;/li&gt;
  &lt;li&gt;Échange de documents&lt;/li&gt;
  &lt;li&gt;Stockage de données dans le cloud&lt;/li&gt;
  &lt;li&gt;Signature de document électronique&lt;/li&gt;
  &lt;li&gt;Protection de l’intégrité des données&lt;/li&gt;
  &lt;li&gt;Messagerie sécurisée&lt;/li&gt;
  &lt;li&gt;JavaScript Object Signing and Encryption (JOSE)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette API est basé sur le concept de &lt;em&gt;future&lt;/em&gt; c’est-à-dire une interface qui définie un contrat asynchrone 
(ECMAScript 6). Les communications sont faites via deux paramètres de callback - un en cas du succès et l’autre pour l’échec.&lt;/p&gt;

&lt;p&gt;On peut accéder à cette interface via le bout de code suivant&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;    &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;crypto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subtle&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Cette interface permet d’accéder à quatre familles d’opérations :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;hashage&lt;/li&gt;
  &lt;li&gt;gestion des clés cryptographiques&lt;/li&gt;
  &lt;li&gt;chiffrement&lt;/li&gt;
  &lt;li&gt;authentification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De plus, l’api &lt;em&gt;window.crypto&lt;/em&gt; permet de générer un vecteur de valeur aléatoire. Par exemple si nous voulons 10 valeurs 
aléatoire nous pouvons utiliser le code suivant&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;// get a vector of 10 unsigned int value (32bits)
&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;randomValues&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Uint32Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// randomize values
&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;crypto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getRandomValues&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;randomValues&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Nous allons à présent voir les différentes familles d’opération plus en détail.&lt;/p&gt;

&lt;h3 id=&quot;hashage-avec-webcrypto--sha-256-et-autres-algorithmes&quot;&gt;Hashage avec WebCrypto : SHA-256 et autres algorithmes&lt;/h3&gt;

&lt;p&gt;Pour utiliser les fonctions de hash nous devons utiliser la méthode &lt;em&gt;digest&lt;/em&gt; qui permet le hashage via les méthodes suivantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;del&gt;SHA-1&lt;/del&gt; &lt;strong&gt;à ne pas utiliser !&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;SHA-256&lt;/li&gt;
  &lt;li&gt;SHA-384&lt;/li&gt;
  &lt;li&gt;SHA-512&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je vais donner un exemple que j’avais réalisé en SHA-256&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sha256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;buffer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TextEncoder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;utf-8&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;crypto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subtle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;digest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SHA-256&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;hex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;hex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;hexCodes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[];&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;view&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;DataView&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;byteLength&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;view&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getUint32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stringValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;padding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;00000000&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;paddedValue&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;padding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stringValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;hexCodes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;paddedValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;hexCodes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;sha256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;digest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;digest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;On remarque que le simple fait de faire un sha-256 neccessite plusieurs fonctions et se relève complexe avec notamment 
un traitement des données.&lt;/p&gt;

&lt;h3 id=&quot;comprendre-la-gestion-des-clés-dans-les-applications-sécurisées&quot;&gt;Comprendre la gestion des clés dans les applications sécurisées&lt;/h3&gt;

&lt;p&gt;Nous entrons maintenant dans la partie qui concerne les clés cryptographique. Ces clés seront utilisées dans pour les 
opérations suivantes il convient de voir leur gestion plus en détail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attention il y a une politique de même origine sur les clés, c’est-à-dire que deux sites ne peuvent se partager les 
clés directement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nous avons donc les méthodes suivantes :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;generateKey&lt;/em&gt; : génère une paire de clés pour l’algorithme ciblé&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;deriveKey&lt;/em&gt; : applique un algorithme de dérivation de clés (ECDH, DH, PBKDF2 et HKDF-CTR)&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;importKey&lt;/em&gt; importe une clé dans un format spécifique
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Algo Symétrique&lt;/strong&gt; : En plus du format JWK on peut importer en &lt;em&gt;raw&lt;/em&gt; via un arrayBuffer&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;Algo Asymétrique&lt;/strong&gt; : On a JWK et PKCS8&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;exportKey&lt;/em&gt; : exporte les clés dans l’un des formats ci-dessus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nous pouvons faire transiter les clés dans du JSON au format JWK (voir JOSE).&lt;/p&gt;

&lt;h3 id=&quot;chiffrement-des-données-avec-webcrypto-api&quot;&gt;Chiffrement des données avec WebCrypto API&lt;/h3&gt;

&lt;p&gt;L’utilisation de l’api de web cryptographie nous permet de chiffrer des données, bien entendu il faut au préalable importer les
clés avant.&lt;/p&gt;

&lt;p&gt;Nous pouvons effectuer du chiffrement symétrique et asymétrique.&lt;/p&gt;

&lt;p&gt;Le chiffrement symétrique est de l’AES-256 avec les modes CTR, CBC, GCM, CFB tandis qu’en asymétrique nous avons à
 disposition du RSA (attention les données en entrée doivent être dans un ArrayBuffer).&lt;/p&gt;

&lt;h3 id=&quot;méthodes-dauthentification-en-javascript--signatures-et-vérification&quot;&gt;Méthodes d’authentification en JavaScript : Signatures et vérification&lt;/h3&gt;

&lt;p&gt;Nous avons bien entendu la possibilité avec cette API d’effectuer de l’authentification de données. Pour cela nous
 pouvons signer et vérifier les données via les méthodes respectivement &lt;em&gt;sign&lt;/em&gt; et &lt;em&gt;verify&lt;/em&gt; .&lt;/p&gt;

&lt;p&gt;Là encore il convient de différencier le mode symétrique (HMAC et AES-CMAC) du mode asymétrique.
En asymétrique nous avons à disposition trois algorithmes (2 basé sur RSA et le dernier sur des courbes elliptiques) :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;RSA SSA-PK CS1-v1.5&lt;/li&gt;
  &lt;li&gt;RSA - PSS&lt;/li&gt;
  &lt;li&gt;ECDSA&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;résumé-et-perspectives-sur-la-sécurité-des-données-en-javascript&quot;&gt;Résumé et perspectives sur la sécurité des données en JavaScript&lt;/h2&gt;

&lt;p&gt;Nous pouvons voir que le web évolue de plus en plus vers une augmentation de la sécurité et confidentialité des clients 
toutefois ces API bien qu’utiles semblent à mon avis hélas trop complexe pour y voir une intégration massive dans les
diverses applications que nous pouvons utiliser.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Rétrospective 2016 : Projets, Avancées et Objectifs</title>
     <link href="https://kandran.fr/2016-in-review/"/>
     <updated>2017-01-15T00:00:00+00:00</updated>
     <id>https://kandran.fr/2016-in-review</id>
     <content type="html">&lt;p&gt;Je profite que l’année 2016 soit terminé afin de pouvoir commencer une retrospective sur celle ci et fixer mes objectifs 
pour 2017.&lt;/p&gt;

&lt;h2 id=&quot;retrospective-2016&quot;&gt;Retrospective 2016&lt;/h2&gt;

&lt;p&gt;En 2016 j’ai continué à travailler bénévolement sur le projets Blizzheart, en particulier lors de la migration de serveur
en aout où j’ai pu utiliser de manière plus approfondi l’outil ansible.&lt;/p&gt;

&lt;p&gt;En parallèle à ce projet j’ai commencé une réflexion sur un projet de site dans le dommaine du cosplay, le but étant de
proposer une alternative solide à facebook pour souder la communauté. Recherche de groupe, partages, aide par rapport aux
présences lors des divers salons…&lt;/p&gt;

&lt;p&gt;En tant que développeur il convient aussi de regarder mon année par rapport aux divers commits effectués :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2017/01/2016-in-review/github.PNG&quot; alt=&quot;commit github kandran&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On remarque que j’ai ete plus actif en début et fin d’année, ce qui corresponds essentiellement à mes phases de travails
sur les projets ci-dessus.&lt;/p&gt;

&lt;p&gt;Autre point qui est important de souligné est la migration de ce blog de wordpress vers Jekyll, ce qui me permet d’avoir
une gestion de celui ci plus simple et moins couteuse le tout étant hébergé en temps que page github. La migration fût
relativement simple, en effet à l’aide du plugin Jekyll Exporter j’ai pu obtenir l’ensemble de mes articles et assets. 
Il m’a resté à checker que la mise en page était bonne, modifier les url des assets et point plus génant remettre en place
les partie utilisant gist ou slideshare (en effet les script semble avoir disparu et logiquement les customs posts n’ont 
pas pu etre utilisés).&lt;/p&gt;

&lt;h2 id=&quot;programme-pour-2017&quot;&gt;Programme pour 2017&lt;/h2&gt;

&lt;p&gt;Je profite de cet article afin de pouvoir écrire mes principaux objectifs pour cette année - ce qui me servira de base
pour un futur bilan en 2018.&lt;/p&gt;

&lt;p&gt;Tout d’abord, j’ai prévu d’être plus actif sur ce blog, écrire plus d’article (au moins un par mois) principalement
orienté vers de la technique.&lt;/p&gt;

&lt;p&gt;De même je compte continuer à contribuer à participer au sein de l’équipe Blizzheart (fan de jeux blizzard je vous
conseille de jeter un oeil), il y’a pas mal de nouveauté à venir (nouvelle version du site, nouvelles fonctionnalités etc.).&lt;/p&gt;

&lt;p&gt;Bien entendue j’ai aussi prévu d’avancer sur mon projet de site relié au cosplay avec l’intention de pouvoir sortir une
beta dans la première partie de l’année.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Postman : L'outil essentiel pour tester et documenter vos APIs</title>
     <link href="https://kandran.fr/slides-postman-devvar15/"/>
     <updated>2016-11-01T15:54:03+00:00</updated>
     <id>https://kandran.fr/slides-postman-devvar15</id>
     <content type="html">&lt;p&gt;Postman est une plateforme puissante et intuitive dédiée au développement, au test et à la documentation des APIs. Utilisé par des millions de développeurs dans le monde, cet outil simplifie la gestion des APIs tout au long de leur cycle de vie.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;quest-ce-que-postman-&quot;&gt;&lt;strong&gt;Qu’est-ce que Postman ?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Postman permet aux développeurs de concevoir, tester et documenter des APIs grâce à une interface graphique conviviale. Il prend en charge différents types d’APIs comme REST, GraphQL ou SOAP, et offre des fonctionnalités qui facilitent la collaboration entre les équipes.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;avantages-de-postman&quot;&gt;&lt;strong&gt;Avantages de Postman&lt;/strong&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Interface intuitive&lt;/strong&gt; : Créez facilement des requêtes HTTP sans expertise technique avancée.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tests automatisés&lt;/strong&gt; : Scripts en JavaScript pour garantir la fiabilité des APIs.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Documentation intégrée&lt;/strong&gt; : Génération automatique de documentations claires et détaillées.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Mock servers&lt;/strong&gt; : Simulez des réponses API pour tester sans backend actif.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Collaboration d’équipe&lt;/strong&gt; : Partagez des collections et travaillez efficacement en équipe.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Intégration CI/CD&lt;/strong&gt; : Automatisez les tests dans vos pipelines de déploiement.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;inconvénients-de-postman&quot;&gt;&lt;strong&gt;Inconvénients de Postman&lt;/strong&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Consommation de ressources&lt;/strong&gt; : Peut ralentir les systèmes avec des collections volumineuses.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fonctionnalités payantes&lt;/strong&gt; : Certaines options avancées nécessitent un abonnement.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Support limité pour les APIs non-REST&lt;/strong&gt; : Moins performant avec SOAP ou GraphQL.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pas de tests de performance natifs&lt;/strong&gt; : Nécessite des outils tiers pour les tests de charge.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pourquoi-choisir-postman-&quot;&gt;&lt;strong&gt;Pourquoi choisir Postman ?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Postman est parfait pour centraliser la gestion des APIs, que ce soit pour leur conception, leur test ou leur documentation. Si vos besoins incluent une collaboration efficace et une interface accessible, cet outil est un choix incontournable. Toutefois, pour des tests intensifs de performance ou un support avancé d’APIs non-REST, envisagez des outils complémentaires.&lt;/p&gt;

&lt;p&gt;En conclusion, Postman se distingue par sa flexibilité, son écosystème riche et sa capacité à répondre aux besoins variés des développeurs modernes.&lt;/p&gt;

&lt;p&gt;Vous pouvez également voir &lt;a href=&quot;https://kandran.fr/presentations/slides-postman-devvar15&quot;&gt;mes slides de présentation de postman lors du dev/var&lt;/a&gt;.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Git Workflow : bonnes pratiques pour vos projets</title>
     <link href="https://kandran.fr/posts/git-workflow"/>
     <updated>2016-02-28T16:33:58+00:00</updated>
     <id>https://kandran.fr/posts/git-workflow</id>
     <content type="html">&lt;p&gt;De nos jours se lancer dans un projet sans outil de versionning est proche d’une folie. Toutefois ces outils ne sont pas toujours utilisé de manière optimale. Je vais donc présenter dans cet article une sorte de workflow que nous pouvons mettre en place avec un projet versionné par exemple sur github.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;présentation-générale-&quot;&gt;Présentation générale :&lt;/h2&gt;

&lt;p&gt;Pour ce ne connaissant pas git, il s’agit d’une solution permettant de versionner du code. Ainsi l’on a accès a toute les modifications ayant été faite sur le code. On peut donc aisément revenir en arrière etc.&lt;/p&gt;

&lt;h2 id=&quot;les-forks&quot;&gt;Les forks&lt;/h2&gt;

&lt;p&gt;Chaque projet sur github est hébergé en dans un dépôt, lorsque vous voulez avoir votre version vous pouvez soit :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Copier le contenu (zip) dans un nouveau dépôt – on perds alors la dépendance avec le projet initial&lt;/li&gt;
  &lt;li&gt;Faire une copie  qui est toujours relié au dépôt d’origine : on parle de fork.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C’est grâce a ce lien que l’on peut proposer ses modifications. Ceci est possible en utilisant le mécanisme de pull request que nous allons expliquer un peu plus bas.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Il est important de noter que si vous faites un fork d’un dépôt privé et que l’on vous retire les droits de lecture sur le dépôt d’origine,  votre fork disparaîtra obligatoirement.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Nos aurons donc trois principaux dépôt qu’il faudra prendre en compte :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;le dépôt local (physique sur la machine)&lt;/li&gt;
  &lt;li&gt;le dépôt distant (on le nommera origin)&lt;/li&gt;
  &lt;li&gt;le dépôt distant d’origine (on le nommera upstream)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;L’un des principaux avantage à l’utilisation des fork est que chaque développeur possède a la fois un dépôt local et distant qui lui sont dédié – ses modifications n’impacte que lui. Le troisième sert juste de base commune.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;les-branches&quot;&gt;Les branches&lt;/h2&gt;

&lt;p&gt;Une vision simpliste est de s’imaginer un projet comme ayant une unique avancé. En réalité des fonctionnalités sont ajouté sur des version parallèle (sorte de copie n’affectant pas la version principale) avant d’être fusionné avec la base principale. On parle de branche – chaque branche est une évolution différente du projet qui peuvent s’éloigner mais aussi se rejoindre (on parle de merge).&lt;/p&gt;

&lt;p&gt;Le nombre de branche varie totalement en fonction des projets, on retrouve généralement :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;La branche principale (codé utilisé en production) appelle master&lt;/li&gt;
  &lt;li&gt;Une branche de développement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il s’ajoute a ces branches quelquefois des branches dédié a l’étape de pre-prod et de test. Sur certain projet plus actif on a aussi une branche par fonctionnalité en cours de développement plutôt qu’une seule. Enfin des vieilles versions possède leurs propre branche – par exemple pour avoir toujours des mise a jour de sécurité.&lt;/p&gt;

&lt;p&gt;Afin de fusionner deux branches on utilise souvent le processus de merge. On fait un nouveau commit qui aura pour parent le dernier commit de chaque branche. A l’inverse on peu aussi utiliser le système de rebase qui lui prend les commit d’une branche et les “joue” a la suite de l’autre branche. &lt;img src=&quot;http://kandran.fr/assets/2016/02/merge-rebase.png&quot; alt=&quot;Utilisation de merge et rabase sur des branche git&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Personnellement je préfère utilisé les rebase pour deux raisons :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;on garde un historique linéaire&lt;/li&gt;
  &lt;li&gt;la gestion de conflit étant commit par commit est relativement plus aisé&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;pull-request-&quot;&gt;Pull Request :&lt;/h2&gt;

&lt;p&gt;Lorsque vous voulez que les modifications faites sur votre copie soient disponible pour tout le monde vous allez surement utiliser le principe de pull request. Vous choisissez une branche de votre distant, une du distant d’origine et proposez un merge entre les deux.  Les personnes ayant les droits d’écriture sur le dépôt d’origine peuvent accepter votre pull request ou vous demandez de faire quelques modifications avant. Dans certains cas votre demande sera refusé et votre pull request sera fermé.&lt;/p&gt;

&lt;p&gt;Quelques conseil pour avoir plus de chance de voir votre demande accepté :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Respecter les normes du projet ( souvent dans le wiki ou un fichier CONTRIBUTING)&lt;/li&gt;
  &lt;li&gt;Vérifier que les tests passent bien&lt;/li&gt;
  &lt;li&gt;Pull le dépôt upstream sur votre branche avant – ca évitera d’avoir des conflits et voir votre pull request impossible a accepter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Votre code sera potentiellement critiqué, analysé etc, n’hésitez pas a vous justifier quand besoin et voyez y une chance de vous améliorer. En effet il y’a beaucoup a apprendre des diverses codes review que l’on peut avoir.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;les-tags&quot;&gt;Les tags&lt;/h2&gt;

&lt;p&gt;La notion de branche ne suffit pas à définir un point particulier de l’évolution du code, on pourrait certes utiliser le numéro de commit mais il y’a un système bien plus pratique : les tags. Il s’agit de marqueur sur un état du code – a un commit bien précis. On peut se servir ce système comme systeme permettant de numéroter les versions. Cela à plusieurs avantages :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On peut voir facilement la date de création de chaque version&lt;/li&gt;
  &lt;li&gt;Idem pour les ajouts d’une version si la description est complète&lt;/li&gt;
  &lt;li&gt;On peut aussi gérer facilement le choix de version avec des outils d’import de librairies (composer …)&lt;/li&gt;
  &lt;li&gt;Si on utilise des numéro de version sémantique voir l’implication d’une mise a jour de version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour ceux n’étant pas au courant de ce qu’est un numéro de version sémantique il s’agit d’un numéro sous la forme de trois partie Major.Minor.Patch&lt;/p&gt;

&lt;p&gt;Le patch est un fix sans problème d’incompatibilité&lt;/p&gt;

&lt;p&gt;Le Minor est un ajout de fonctionnalité toujours sans incompatibilité&lt;/p&gt;

&lt;p&gt;Le Major implique de grande modification avec de potentiel problème d’incompatibilité.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Vous pouvez avoir plus d’information sur ce site &lt;a href=&quot;http://semver.org/lang/fr/&quot; target=&quot;_blank&quot;&gt;Gestion sémantique de version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;webhook-et-deploy-key&quot;&gt;WebHook et deploy key&lt;/h2&gt;

&lt;p&gt;Il s’agit la plus de fonctionnalités supplémentaires que l’on retrouve sur de nombreux service (github, bitbucket, gitlab etc).&lt;/p&gt;

&lt;p&gt;Le webhook sont des appels fait lors d’interaction spécifique, par exemple a chaque commit, pull request etc un appel est fait a un service externe qui pourra par exemple exécuter les tests. Ceci permet de faire  des actions de manière automatique. La deploy key est comme son nom l’indique une clef qui sera utilisé pour le déploiement uniquement. Je m’explique cette clef ssh permet d’avoir un accès en lecture au dépôt ainsi le serveur possédant la clef privé associé pourra récupérer le code avec celle ci – les serveurs n’ont donc pas besoin de compte et peuvent quand même être identifié a l’aide de leurs clef. Ce système est utile quand le déploiement est automatisé et qu’aucun compte utilisateur ne pourra être utilisé.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Pour conclure nous allons voir un exemple ou l’ensemble des méthodes décrite ci-dessus sont assemblé pour former une procédure complete dans un projet.&lt;/p&gt;

&lt;p&gt;Nous avons donc le projet dans son dépôt officiel, seul quelques personnes peuvent écrire sur ce dépôt –  typiquement les core développeur (souvent le lead dev en entreprise). Le reste des développeur ont un accès en lecture. Il font donc un fork qui leurs permet d’avoir leurs copies. Ils peuvent donc travailler sur les mêmes branches – disons dev sans avoir d’interaction. Lorsque un développeur a fini sa tâche il récupère le code de la branche principale (dépôt officiel), ainsi son code aura déjà eu la résolution de conflit avant le pull request. Lors du pull request une analyse du code statique est lancé, de même pour les tests. Si tout ce passe bien les core développeur peuvent vérifier le code puis après modification potentielle accepter la pull request. Alors on pourra déployer de manière automatique le code – en effet les serveurs ayant le droit de lecture sur le dépôt peut récupérer le code source.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Bien que cet article peut sembler un peu long, je ne traite pas de la totalité des éléments que l’on pourrait incorporer dans un workflow centré sur git, n’hésitez pas a compléter ou poser vos questions en commentaire.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Fusionner et Réorganiser les Commits Git : Guide Pratique</title>
     <link href="https://kandran.fr/git-fusionner-plusieurs-commit-ensemble/"/>
     <updated>2016-01-03T19:32:37+00:00</updated>
     <id>https://kandran.fr/git-fusionner-plusieurs-commit-ensemble</id>
     <content type="html">&lt;p&gt;Aujourd’hui nous allons voir comment fusionner plusieurs commit ensemble pour n’en former qu’un seul.&lt;/p&gt;

&lt;p&gt;Bien que cette manipulation soit relativement simple elle n’est pas souvent utilisé ce qui mène souvent a voir dans les branches master des commit sans ‘utilité’ fonctionnelle (commit de fix d’une erreur de syntaxe, plusieurs commit pour la même feature etc).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;pourquoi-fusionner-des-commits-dans-git-&quot;&gt;Pourquoi fusionner des commits dans git ?&lt;/h2&gt;

&lt;p&gt;Voyons tout d’abords les raisons qui peuvent nous amener a fusionner des commit :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Vous avez fait un commit, mais il y’a une modification manquante. (ex. fichier manquant, erreur de syntaxe)&lt;/li&gt;
  &lt;li&gt;Vous êtes sur un projet open source, vous faites des commits a chaque petites modifications. Il peut être utile de fusionner les commits en un seul pour éviter l’explosion du nombre de commit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Maintenant que nous avons vu les principales raisons pouvant nous amener a fusionner des commit ensemble nous allons voir la méthode pour les fusionner ensemble.&lt;/p&gt;

&lt;h2 id=&quot;comment-fusionner-des-commits-dans-git-&quot;&gt;Comment fusionner des commits dans git ?&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;J’ai initialisé un dépôt git avec deux commit : l’un pour le création d’un fichier squash.txt et le second après avoir renommé le fichier en git-squash.txt comme nous pouvons le voir dans l’image ci dessous.  J’ai fais un troisieme commit afin d’avoir un rebase plus visible pour la seconde partie (il n’est absolument pas nécessaire)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2016/01/git-squash-init.png&quot; alt=&quot;git-squash-init&quot; /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Etant donné que je travaille en local je souhaiterai fusionner ces deux commit. J’utilise donc la commande &lt;strong&gt;git rebase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour cela je fais un &lt;strong&gt;git rebase -i HEAD~2&lt;/strong&gt;   (git rebase, en mode interactif a partir des deux commit précédent le HEAD (inclus)).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2016/01/git-squash-rebase.png&quot; alt=&quot;git-squash-rebase&quot; /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;On voit donc nos commit (id et message) du plus vieux au plus récent dans un éditeur vim. Pour effectuer le rebase il faut modifier le fichier. Ici on veux fusionner le update (&lt;strong&gt;7cd2fe3&lt;/strong&gt;) avec le précédent on remplace donc son pick par squash (l’option qui nous est utile).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2016/01/git-squash-squash-1.png&quot; alt=&quot;git-squash-squash&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Puis l’on enregistre les modification (option wq de vim). On obtient a nouveau l’éditeur vim avec les messages de nos commit a fusionner. On enregistre le nouveau commit avec son message en enregistrant comme lors de l’étape principale.  Pour modifier le message il suffit de l’éditer directement (les lignes avec les # sont des commentaires).&lt;/p&gt;

&lt;p&gt; 
A la fin nous obtenons donc les commit suivant :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2016/01/git-squash-end.png&quot; alt=&quot;git-squash-end&quot; /&gt;&lt;/p&gt;

&lt;p&gt; 
Voila en espérant que cette astuce vous soit utile.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Introduction à Polymer : simplifiez vos web components</title>
     <link href="https://kandran.fr/web-component-introduction-a-polymer/"/>
     <updated>2015-11-22T19:24:02+00:00</updated>
     <id>https://kandran.fr/web-component-introduction-a-polymer</id>
     <content type="html">&lt;p&gt;Lors d’un précédent article je vous ai fait une &lt;a href=&quot;http://kandran.fr/web-component-presentation/&quot;&gt;présentation des web component&lt;/a&gt; lors de laquelle on a pu voir l’utilité de ceux ci mais leurs principal inconvénient : la compatibilité. Nous allons a présent voir que cette difficulté peut être facilement effacé et que l’écriture de web component avec polymer se trouve assez simplifié.
 &lt;/p&gt;

&lt;h2 id=&quot;vaincre-les-incompatibilités-&quot;&gt;Vaincre les incompatibilités :&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/11/polyfills.png&quot; alt=&quot;représentation polyfills&quot; /&gt;Comme vu précédemment chacun des piliers nécessaire au fonctionnement des web composant ne sont pas implémenté au même niveau au sein de chaque navigateur. Pour résoudre ce problème de différence et avoir ainsi des composant disponible sur chaque navigateur une surcouche javascript sera a mettre en amont : &lt;strong&gt;polyfills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pour obtenir polyfills vous pouvez simplement utiliser bower :&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/3aec8a9f90956da3c43e.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Enfin vous avez juste a inclure le fichier javascript dans vos pages utilisant les web composants :  
 &lt;script src=&quot;https://gist.github.com/kandran/c9465dac1f68adf672ba.js&quot;&gt;&lt;/script&gt;
 &lt;/p&gt;

&lt;h2 id=&quot;utiliser-polymer-pour-vos-composants-&quot;&gt;Utiliser polymer pour vos composants :&lt;/h2&gt;

&lt;p&gt;Polymer est un projet de l’entreprise Google datant de 2013. Il a pour but de permettre l’utilisation de web composant de maniéré simple grâce à une librairie javascript. Il est impératif de noter qu’il existe de nombreuse différence entre la version 0.7 et 1.0. Nous parlerons uniquement de la version 1.0 car il s’agit de la seule que j’ai eu a manipuler et surtout parce quelle est considéré comme production ready par google.&lt;/p&gt;

&lt;p&gt;Pour les plus curieux voici le dépôt github du projet : &lt;a href=&quot;https://github.com/polymer/polymer&quot; target=&quot;_blank&quot;&gt;polymer/polymer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3 id=&quot;installer-polymer-&quot;&gt;Installer polymer :&lt;/h3&gt;

&lt;p&gt;Rien de plus simple avec bower :&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/ec2cc736720b474015fc.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;L’un des principaux avantages de polymer hormis le fait de pouvoir facilement créer ces propres composant est bien entendu la grande variété de composant que l’on peut trouver sur le net et donc directement utilisable.&lt;/p&gt;

&lt;h3 id=&quot;composants-polymer-disponible-et-utilisable-&quot;&gt;Composants polymer disponible et utilisable :&lt;/h3&gt;

&lt;p&gt;Comme je l’ai dit dans l’article précédent l’une des forces de web composant est le fait de pouvoir ré-utiliser nos composant même dans d’autres projets du fait de leurs isolations. Les composant écrit avec polymer n’échappe pas a la règle. On peut donc trouver :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;des composants Google ( youtube, google map etc) pour pouvoir utiliser les services facilement&lt;/li&gt;
  &lt;li&gt;des composants dédié au material design (paper componant)&lt;/li&gt;
  &lt;li&gt;des composants utilitaires (iron composant)&lt;/li&gt;
  &lt;li&gt;des composants pour firebase permettant de faire du web temps réel&lt;/li&gt;
  &lt;li&gt;et bien d’autres ….&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;   Vous pouvez trouver vos composant sur les sites suivants :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://bit.ly/1J11JYE&quot;&gt;Polymer Element&lt;/a&gt; (composant plutôt officiel)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bit.ly/1J11s82&quot;&gt;Custom Element&lt;/a&gt; (banque de composant comme packagist)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;créons-un-composant-&quot;&gt;Créons un composant :&lt;/h3&gt;

&lt;p&gt;Nous allons donc créer un composant avec polymer. Le composant que l’on va faire affichera les informations relative a un stream sur twitch. Pour cela nous utiliserons l’api publique du service qui renvoie les informations nécessaire lorsque le stream est actif.   Commençons par établir la structure de notre composant et de la page l’utilisant :  &lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/3a50ae4df6c1ee079512.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;On a donc un composant vide et la page pouvant inclure notre composant. La première étape est de récupérer les données depuis l’api. Pour cela nous avons a exécuter une requête ajax.
  &lt;script src=&quot;https://gist.github.com/kandran/b68c4c48f5ed2c7b5e73.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Dans le fichier index on a rajouté un attribut stream-name qui corresponds a la propriété streamName dans notre composant. Dans le composant on forge l’url associé au stream a l’instanciation via la méthode ready. Notre appel ajax est fait par l’élément iron-ajax qui lors d’une réponse appelle la méthode hresponse. Il nous reste plus qu’a mettre en forme notre élément a partie des données reçues. Nous avons donc le code suivant :&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/38bae5ef508507fa6ec8.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;A noter :&lt;/p&gt;

&lt;p&gt;L’on utilisera des  pour afficher les variables, des la modification de la propriété la variable affiché change. Il faut que ces éléments soit isolé dans une balise ou attribut – les concaténation de fonctionne pas.&lt;/p&gt;

&lt;p&gt;L’aspect visuel est sinon géré en html classique ce qui permet d’avoir des composant de tout type.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;J’espère que cet article vous as donné envie d’utiliser des web composants, lors du prochain nous verrons un exemple un peu plus poussé avec les notions de boucles etc. N’hésitez pas a laisser un commentaire pour avoir plus d’information sur cette technologie.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Pourquoi utiliser des tests automatisés en développement</title>
     <link href="https://kandran.fr/pourquoi-utiliser-des-tests/"/>
     <updated>2015-11-15T19:52:50+00:00</updated>
     <id>https://kandran.fr/pourquoi-utiliser-des-tests</id>
     <content type="html">&lt;p&gt;Bien que souvent considéré comme fastidieux et peu utiles l’écriture de test automatisable pourra vous être d’un grand secourt.&lt;/p&gt;

&lt;p&gt;Ils sont en outre les garants de la qualité du code de l’application.&lt;/p&gt;

&lt;p&gt;Nous allons donc voir plus en détails quelles sont les diverses utilités des tests et pourquoi vous devez les utiliser.&lt;/p&gt;

&lt;p&gt;C’est hélas une partie négligé car pour beaucoup :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ça fait perdre du temps&lt;/li&gt;
  &lt;li&gt;je code super bien donc pas besoin de tests&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Bon que l’on soit clair je trouve toutes les raisons ci dessus nulles et a oublier au plus vite. Je vais donc vous dire a présent pourquoi je pense ainsi.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Alors le célèbre ça fait perdre du temps, certes écrire des tests prends du temps mais quand il vas y avoir un bug – et il y’en a toujours –  vous allez être content de le trouver rapidement avec ce test et la vous allez gagner du temps. Idem quand vous allez modifier le code plus tard ces tests automatisés vous aiderons bien a vérifier qu’il n’y a pas eu d’introduction de bug.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/11/costBug.jpg&quot; alt=&quot;cout d&apos;un bug&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Je tiens aussi a signaler que le coût d’un bug augmente au fur et a mesure du temps. En effet corriger un bug en phase de développement n’a pas le même cout qu’une fois en production.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour la partie du je code super bien … pas la peine de s’étaler sur le fait que personne ne peux être dur de ne jamais introduire de bug, de ne jamais zapper un cas d’utilisation – surtout qu’on a la fâcheuse tendance a toujours vouloir avoir le cas idéal et ne pas prendre en compte des cas totalement illogique.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Comme j’ai pu le dire les tests nous aide à vérifier que notre application fonctionne comme voulu, que l’on ne re-introduit pas de bug mais il faut quand même rester vigilent car il est possible que nos tests de soit pas complet (cas oublié, bug non testés etc) et doivent donc comme votre code vivre et &lt;strong&gt;rester à jour&lt;/strong&gt; sous risque de devenir plus néfaste que leurs absences.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Program testing can be used to show the presence of bugs, but never to show their absence!&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;cite&gt;Edsger W. Dijkstra&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Personnellement les tests sont aussi la comme documentation, en effet en regardant les tests on comprend souvent comment fonctionne l’application ce qui est plus rapide que devoir lire des pages et des pages de doc. Je vous invite à lire les tests autant que possible (en plus leurs absence n’est pas très bon signe sur la qualité du code selon moi).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;En résumé les tests :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;permette de vérifier que le fonctionnement est celui attendu&lt;/li&gt;
  &lt;li&gt;Eviter l’introduction de bug lors de modification ultérieure – et donc pouvoir toucher au code de manière sereine&lt;/li&gt;
  &lt;li&gt;Faire une sorte de documentation&lt;/li&gt;
  &lt;li&gt;Doivent vivre avec le code pour ne pas être inutiles et dangereux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Je vais bien entendu écrire des articles sur ce sujet (traitant le sujet d’un point de vu pratique) en parallèle de celui sur les web component.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Lectures : Introduction au Big Data et Machine Learning</title>
     <link href="https://kandran.fr/lectures-big-data-et-machine-learning/"/>
     <updated>2015-11-11T00:08:29+00:00</updated>
     <id>https://kandran.fr/lectures-big-data-et-machine-learning</id>
     <content type="html">&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/11/bigDataEtMachineLearning.jpg&quot; alt=&quot;bigDataEtMachineLearning&quot; /&gt;&lt;/p&gt;

&lt;p&gt;J’inaugure avec ce livre une catégorie sur les livres que j’ai lu ainsi que mon avis sur ceux ci. Il s’agit du dernier livre que j’ai fini.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Lorsque j’ai décidé d’acheter ce livre je n’avais pas de connaissance particulière dans le domaine du Big Data ni du Machine Learning mais j’ai été attiré par celui ci pour connaitre un peu plus ces domaines que l’on peut régulièrement retrouver.&lt;/p&gt;

&lt;p&gt;Je trouve ce livre assez bien découpé et donc facilement accessible.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Les principales parties sont :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Big Data ( origine, intérêt, noSql, algorithme et framework)&lt;/li&gt;
  &lt;li&gt;Machine Learning ( présentation du métier de data scientist, traitement des données, algorithme de machine learning, visualisation)&lt;/li&gt;
  &lt;li&gt;Outils du Big Data (Hadoop,  Pig, Hive, architecture  lambda, apache storm)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bien que majoritairement théorique ce livre est a mon gout intéressant pour tout ceux voulant avoir un aperçut de ces domaines – la dernière partie permet de ce pencher plus sur la pratique. Je le conseille donc a tout ceux voulant un livre d’introduction au Big Data et au Machine Learning.&lt;/p&gt;

&lt;p&gt;Auteurs : Pirmin Lemberger, Marc Batty, Médéric Morel, Jean-Luc Raffaëlli&lt;/p&gt;

&lt;p&gt;Vous pouvez trouver ce livre sur &lt;a href=&quot;http://www.amazon.fr/Big-Data-Machine-Learning-scientist/dp/2100720740&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Amazon&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Web Components : présentation et concepts essentiels</title>
     <link href="https://kandran.fr/web-component-presentation/"/>
     <updated>2015-11-05T08:00:40+00:00</updated>
     <id>https://kandran.fr/web-component-presentation</id>
     <content type="html">&lt;p&gt;Pour mon dernier jours au sein de mon ancienne société j’ai eu a présenter ma dernière Reutek. J’ai choisi comme sujet les web component et plus particulièrement l’implémentation a l’aide de Polymer. Etant donnée l’attrait de ceux-ci de la part de ceux présent a cette réunion – moi compris pourtant je ne suis pas très attiré par le développement front – je me suis dit qu’il faudrait que j’y consacre une série d’article.&lt;/p&gt;

&lt;p&gt;Dans ces articles je vais expliquer qu’est ce qu’un composant (et plus particulièrement un web composant) pour que vous puissiez simplifier vos pages html.&lt;/p&gt;

&lt;h2 id=&quot;quest-ce-quun-composant-&quot;&gt;Qu’est ce qu’un composant ?&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour résumer un composant est une portion identifiable d’un programme plus large qui a pour but d’apporter un ensemble particulier de fonctionnalités. Bon je l’accorde dit comme ça ce n’est pas très clair et pourtant en tant que développeur ce concept vous est familier j’en suis sur.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/10/lego-1-300x185.jpg&quot; style=&quot;float: right;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Prenons les lego ci-contre, certains sont différents en eux pourtant on peut les assembler ensemble pour effectuer une construction de notre choix. Chaque &lt;em&gt;type&lt;/em&gt;  de blocs a une fonction définie dans notre constructions et permettent ensemble d’avoir notre construction finale.&lt;/p&gt;

&lt;p&gt;Maintenant que vous avez compris la notion de composant je vais passer à la partie qui nous intéresse vraiment les web composant que j’appellerai souvent web component.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;les-composants-adaptés-au-monde-du-web&quot;&gt;Les composants adaptés au monde du web.&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Vous vous doutez bien que lorsque l’on peut isoler des blocs, les factoriser pour pouvoir s’en servir dans le futur sur divers projets on ne ce gène pas. Autant ne pas re-inventer la roue a chaque fois. En cela les web component peuvent être utiles.&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Toutefois je dois vous prévenir de ne pas les utiliser encore en production. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Les raisons sont simples :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Même si il s’agit d’un projet porté par un working group du W3C, il n’y a pas encore de norme arrêté – et ça risque de prendre un peu de temps avant de l’être&lt;/li&gt;
  &lt;li&gt;Seuls certains navigateurs sont compatibles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;les-templates&quot;&gt;Les templates&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Il s’agit des modèles de base, pour être plus exact il s’agit de la structure à dupliqué. Ce bloc html ne sera pas évalué.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/e184709262c868ad0f11.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Pour “l’instancier” nous avons besoin d’un peu de javascript. L’idée est de récuperer le contenu de celui ci pour l’injecter dans le DOM en tant qu’élément visible comme ceci par exemple :  &lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/77a14d5ebe065566ba35.js&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;le-shadow-dom&quot;&gt;Le shadow DOM&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Comme en programmation classique lorsque l’on encapsule une portion de code l’on souhaite que celle ci ne soit pas directement injecté dans les sources les polluants. Ceci reste vrai avec les web composant a l’aide du shadow DOM. Pour explique simplement il s’agit d’un nouvel arbre DOM totalement indépendant situé  dans un élément. De base il ne sont pas visible (on peut dans les réglages de l’inspecteur de code de chrome les voir en cochant &lt;strong&gt;show user agent shadow DOM&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;L’une des balises utilisant le shadow DOM la plus connue est la balise HTML5 video –  derrière cette simple balise se trouve un ensemble d’élément html définissant les divers boutons etc.)&lt;/p&gt;

&lt;p&gt;On entendra parler de Shady DOM par moment la différence est qu’au lieu d’être une fonctionnalité native comme le shadow DOM il s’agit d’élément dans le DOM classique avec une classe style-scope permettant d’émuler le shadow DOM.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;les-custom-element-&quot;&gt;Les custom element :&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Il s’agit de bloc englobant les Template ayant pour but de gérer le cycle de vie du composant. Ainsi l’on pourra avoir nos balises personnelle avec par exemple notions d”héritage.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;les-html-imports&quot;&gt;Les HTML Imports&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;On arrive sur une fonctionnalité bien pratique pour pouvoir réutiliser nos composant dans plusieurs projet. La notion d’import en effet il sera donc possible d’écrire notre composant dans un fichier html séparé et de juste l’importer avant l’utilisation. Ainsi on peut importer dans notre page des fichier externe – toutefois les import n’importerons pas le code HTML a proprement parlé juste les éléments et template.&lt;/p&gt;

&lt;p&gt;Pour cela rien de plus simple
&lt;script src=&quot;https://gist.github.com/kandran/77a14d5ebe065566ba35.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Les technologies de web composant on l’air vraiment intéressante mais entre la complexité de l’ensemble et les problèmes de compatibilité on peut vite se démoraliser et ne pas les utiliser. Mais n’ayez craintes il existe des librairies permettant d’utiliser les web composant de manière plus uniforme et simple. Notamment POLYMER qui fera l’objet de futur articles.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Installer un serveur TeamSpeak facilement : Guide pratique</title>
     <link href="https://kandran.fr/mise-en-place-dun-serveur-teamspeak-facilement/"/>
     <updated>2015-06-29T11:49:00+00:00</updated>
     <id>https://kandran.fr/mise-en-place-dun-serveur-teamspeak-facilement</id>
     <content type="html">&lt;p&gt;La communication est essentielle dans de nombreux jeux en ligne. Cependant, des solutions comme Skype montrent vite leurs limites lorsqu’il s’agit de gérer un grand nombre de participants. C’est pourquoi les chefs de guilde et les joueurs se tournent vers des outils comme TeamSpeak ou Mumble.
Mais louer un serveur TeamSpeak peut vite devenir coûteux (plus de 5€ par mois pour un petit 32 slots). Saviez-vous qu’il est possible de réduire considérablement ce coût en configurant votre propre serveur grâce à un &lt;strong&gt;VPS&lt;/strong&gt; ? Dans ce guide, nous vous montrons comment faire.&lt;/p&gt;

&lt;h2 id=&quot;étape-1--location-et-configuration-du-vps&quot;&gt;Étape 1 : Location et configuration du VPS&lt;/h2&gt;

&lt;p&gt;Un VPS est un serveur virtualisé sur lequel vous avez la main, ainsi vous pouvez installer votre teamspeak, mais aussi un bot pour celui ci et même le site de votre guilde. Et ce pour bien moins cher que la location d’un serveur teamspeak.&lt;/p&gt;

&lt;h3 id=&quot;comment-choisir-votre-vps-&quot;&gt;Comment choisir votre VPS ?&lt;/h3&gt;

&lt;p&gt;Loin de moi l’idée de faire de la pub mais avec 2,39€/mois vous pouvez avoir un vps chez ovh ( &lt;a href=&quot;https://www.ovh.com/fr/vps/vps-classic.xml&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;VPS classic 1&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Sur ce serveur libre a vous d’installer tout ce qui est utile – personnellement j’héberge le serveur teamspeak de ma guilde ainsi qu’un petit site web sans problème et j’ai encore de la marge.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;étape-2--installation-de-teamspeak&quot;&gt;Étape 2 : Installation de TeamSpeak&lt;/h2&gt;

&lt;p&gt;Maintenant que vous avez votre serveur vps, voici un dépot github qui va vous permettre d’installer votre serveur tres facilement  &lt;a href=&quot;https://github.com/stokes84/TeamSpeak-Installer&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;TeamSpeak-Installer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Suivez les consignes présent sur le dépôt (champs intall) et l’installation sera faite en même pas  5 minutes. Par contre pensez a noter les informations d’administration – le login pour être server admin query ainsi que le token pour vous donner les droit de serveur admin sur le teamspeak.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;étape-3--sécurisation-de-votre-serveur&quot;&gt;Étape 3 : Sécurisation de votre serveur&lt;/h2&gt;

&lt;p&gt;Si vous utilisez iptable pour filtrer les connexions a votre serveur (très fortement recommandé – obligatoire selon moi) voici les règles iptables a jouer pour autoriser le fonctionnement de votre serveur ( j’ai utilisé les ports par défaut uniquement)&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/e9658b4ade8d532feaa1.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Voila votre serveur teamspeak est enfin totalement opérationnel et vous pouvez a coter utiliser le serveur pour d’autre services.&lt;/p&gt;

&lt;h2 id=&quot;étape-4--étendre-la-capacité-de-votre-serveur&quot;&gt;Étape 4 : Étendre la capacité de votre serveur&lt;/h2&gt;

&lt;p&gt;Si la limite des 32 slots est gênante vous pouvez &lt;a href=&quot;http://npl.teamspeakusa.com/ts3npl.php&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;demander une NPL&lt;/a&gt; qui est gratuite pour étendre a 512 slots votre serveur toujours gratuitement – hormis les frais de vps.&lt;/p&gt;

&lt;h2 id=&quot;en-cas-de-problème&quot;&gt;En cas de problème&lt;/h2&gt;

&lt;p&gt;En cas de problème sur l’installation du serveur teamspeak sur votre vps ou même pour l’utilisation de votre vps n’hésitez pas a me contacter sur twitter.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;En utilisant un VPS pour héberger votre serveur TeamSpeak, vous économisez sur les coûts tout en gardant le contrôle total sur vos services. Ce guide vous permet de créer un serveur performant, sécurisé et adapté à vos besoins. Alors, prêt à commencer ?&lt;/p&gt;

</content>
   </entry>
   
 
   
   <entry>
     <title>Game-Scan : présentation d’un outil pour les api de jeux</title>
     <link href="https://kandran.fr/game-scan-presentation/"/>
     <updated>2015-06-27T00:01:36+00:00</updated>
     <id>https://kandran.fr/game-scan-presentation</id>
     <content type="html">&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/06/logo.png&quot; alt=&quot;logo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;De nombreux jeux proposent des API pour accéder aux informations sur le jeu lui même mais aussi sur les joueurs. C’est API ne sont pas souvent utilisé car peu connues ou alors parce que de nombreux projet n’ont pas l’envie et le temps de développer tout les éléments afin de pouvoir les utiliser. C’est la qu’intervient le projet game-scan.&lt;/p&gt;

&lt;p&gt;Game-Scan est un ensemble de module PHP qui permet d’appeler de manière simple les API des différents jeux. En effet chaque jeux possédera son propre module installable via composer – ainsi nous pouvons donc avoir un module principal gérant toutes les actions communes aux divers modules. Puis pour accéder aux différentes ressources de l’API il suffira après avoir renseigné les clefs api  d’instancier la classe associée puis naviguer dans l’objet afin de récupérer les informations voulues.&lt;/p&gt;

&lt;p&gt;Au fur et a mesure des modules – correspondant a un nouveau jeu avec ses api d’ouverte- seront implémenté et ceux présent se verront compléter de sorte a couvrir la totalité de l’API. Bien entendu les pré-requis pour ces modules sont minimaux, on évite au maximum les dépendances afin que ces modules puissent être utilisé dans des applications diverses et variées.&lt;/p&gt;

&lt;p&gt;L’ensemble du code source de ce projet sera bien entendu testé avec PHPUnit (on utilisera Travis pour lancer les tests) et la qualité du code sera effectué avec Scrutinizer, Insight…&lt;/p&gt;

&lt;p&gt;Apres une première analyse nous avons pour but d’implémenter les modules correspondants aux jeux suivant :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;WoW&lt;/li&gt;
  &lt;li&gt;Diablo 3&lt;/li&gt;
  &lt;li&gt;Starcraft 2&lt;/li&gt;
  &lt;li&gt;LoL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Vous pouvez retrouver l’ensemble des modules ainsi que les codes sources sur &lt;a href=&quot;https://github.com/Game-Scan&quot; target=&quot;_blank&quot;&gt;github&lt;/a&gt;. De même si certaines personnes souhaite participer au projet cela est totalement possible via le process de pull request etc.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Utiliser php-cs-fixer avec PHPStorm pour un code propre</title>
     <link href="https://kandran.fr/utiliser-php-cs-fixer-avec-phpstorm/"/>
     <updated>2015-05-21T18:00:24+00:00</updated>
     <id>https://kandran.fr/utiliser-php-cs-fixer-avec-phpstorm</id>
     <content type="html">&lt;p&gt;Les normes sont utiles afin que tous le monde puisse facilement lire du code source avec une certaines uniformité. Ainsi l’on repère facilement les différents blocs etc. Bien qu’elles devraient être obligatoire de nombreux développeur ne les utilises pas. Souvent parce que les contraintes de saut de lignes, d’indentations etc. sont trop nombreuses. Heureusement il existe des outils pour le faire de manière automatique. En PHP la norme est le PSR, nous allons donc voir comment utiliser php-cs-fixer pour pouvoir rendre votre code conforme.&lt;/p&gt;

&lt;h2 id=&quot;etape-1--pre-requis&quot;&gt;Etape 1 : Pre-requis&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour pouvoir utiliser cet outil vous devez avoir php d’installé sur votre PC, ainsi que php-cs-fixer.&lt;/p&gt;

&lt;p&gt;Vous pouvez récupérer php-cs-fixer &lt;a href=&quot;http://cs.sensiolabs.org/&quot;&gt;Ici&lt;/a&gt;. Personnellement j’ai récupéré l’archive phar.&lt;/p&gt;

&lt;h2 id=&quot;etape-2--configuration&quot;&gt;Etape 2 : Configuration&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Nous allons donc définir un external tools dans PHPStorm, pour cela on se rend dans les options ( ctrl + alt + S) puis dans l’onglet external tools. On en ajoute un nouveau et on rempli comme ci-dessous&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/05/php-external-tool.png&quot; alt=&quot;configuration phpcsfixer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dans program on met le lien vers l’exécutable php, j’ai utilisé la macro php de PHPStorm pour être plus générique, cela utilisé l’exécutable défini dans PHPStorm.&lt;/p&gt;

&lt;p&gt;Dans parameters on met le chemin vers le fichier php-cs-fixer (le .phar chez moi) le niveau a utiliser (psr2) l’option verbose le mot clef fix et surtout le chemin vers le fichier courant avec les macros afin de pouvoir s’en servir sur n’importe quel projet php ouvert avec l’ide.&lt;/p&gt;

&lt;p&gt;Voici mes paramètres, a adapter selon vos besoin bien entendu (surtout le chemin vers le fichier php-cs-fixer)&lt;/p&gt;

&lt;p&gt;Program&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$PhpExecutable$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Parameters&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;D:\Projets\php-cs-fixer.phar  --level=psr2  --verbose fix  $FileDir$/$FileName$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Working directory&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ProjectFileDir$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;etape-3--utilisation&quot;&gt;Etape 3 : Utilisation&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Maintenant vous pouvez vous en servir en allant dans Tools &amp;gt;  External Tool &amp;gt; PHP cs fixer (ou autre si vous avez changé le nom). Mais aussi lors du click droit sur un fichier/dossier en allant dans le sous menu external tools.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Je vous conseille par contre de mettre un raccourci (keymap -&amp;gt; external tools -&amp;gt; php cs fixer) pour pouvoir l’appliquer directement avec le clavier.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Pour automatiser cette options vous pouvez faire un hook avec git sur le pre-commit ou définir un file watcher dans PHPStrom. L’action sera faite au moment de la sauvegarde. &lt;a href=&quot;https://gist.github.com/kandran/2154e0ef49bd25d28e90&quot;&gt;Plus d’information ici&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Design pattern stratégie : principe et exemple en PHP</title>
     <link href="https://kandran.fr/design-pattern-strategie/"/>
     <updated>2015-05-14T18:00:51+00:00</updated>
     <id>https://kandran.fr/design-pattern-strategie</id>
     <content type="html">&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/05/strategie1.png&quot; alt=&quot;uml design pattern strategie&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Le design pattern stratégie permet d’appliquer un algorithme dynamiquement au sein de votre application. On a donc une famille d’algorithmes au sein d’objets interchangeables a l’aide d’une interface. Il est assez simple, et même probable que vous l’utilisait déjà sans le savoir. Nous allons donc voir un peu plus en détail le design pattern stratégie comme cela à été demandé il y a peu.&lt;/p&gt;

&lt;p&gt;Nous avons donc une interface qui contient toutes les méthodes communes a nos algorithmes. Ensuite dans un objet qui implémentera cette interface nous allons mettre le code correspondant a notre algorithme. Ainsi par exemple nous avons une collection d’objet implementant cette interface on peut leurs appliquer les méthodes communes sans avoir la moindre idée de la classe réelle.&lt;/p&gt;

&lt;p&gt;Le design pattern peut etre utilisé par exemple pour effectuer des tris. Ensuite dans les classes les implémentant nous pouvons donc utiliser des algorithmes totalement différent puis permettre leurs utilisations au sein d’un objet principal en utilisant l’interface.&lt;/p&gt;

&lt;p&gt;Pour expliquer ce design pattern nous allons utiliser des applications différentes pouvant être lancé par une classe principale qui ne sait pas quelle application elle va lancer. On utilise juste l’interface.
&lt;script src=&quot;https://gist.github.com/kandran/4b1f80698da9bad8602b.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Nous avons donc deux applications (A et B) ayant pour interface ApplicationInterface. Une classe principale qui appelle la méthode run d’un objet implémentant l’interface ApplicationInterface. Ainsi notre classe principale peut faire les différents appel sans avoir la connaissance de la classe réelle.&lt;/p&gt;

&lt;p&gt;Ceci permet d’avoir bien entendu un code plus souple et maintenable, bien entendu il est fortement conseillé de privilégier l’utilisation des interfaces a celle des classes. En effet cela vous permettra d’avoir dans un premier temps un code plus souple mais surtout cela vous permettra d’écrire plus facilement vos tests.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Retour d’expérience sur l’utilisation d’inbox by Gmail</title>
     <link href="https://kandran.fr/retour-dutilisation-dinbox/"/>
     <updated>2015-05-11T23:21:38+00:00</updated>
     <id>https://kandran.fr/retour-dutilisation-dinbox</id>
     <content type="html">&lt;p&gt;&lt;strong&gt;Note : Ce projet n’existe plus chez google, une bonne partie des fonctionnalités sont maintenant ingégré a gmail&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;J’ai pu avoir accès a la beta d’inbox by gmail il y a un peu plus d’une semaine. Je vais donc vous faire parvenir un petit retour sur ce service.&lt;/p&gt;

&lt;p&gt;Personnellement malgré quelques petits défaut j’accroche assez bien et je trouve que je gagne un peu de temps comparé a l’application web gmail.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Il s’agit d’un nouveau service proposé par Google pour lire ses messages etc. Par défaut il est obligatoirement synchronisé avec votre compte gmail. Les actions effectués au sein de chaque service ce répercute sur l’autre.&lt;/p&gt;

&lt;p&gt;L’interface a été totalement remanié pour être plus claire et mettre plus en avant vos mails. De même pour l’interface de vos contacts. Tout semble avoir rajeunie.&lt;/p&gt;

&lt;p&gt;Pour vous en servir vous pouvez soit envoyer un mail a inbox@google.com soit avoir une invitation de la part de quelqu’un utilisant déjà le service (il me reste quelques invitations si besoin).&lt;/p&gt;

&lt;p&gt;Un point important à préciser est que cette messagerie est faite pour avoir peu de message dans la boite de réception en effet il est possible de marquer les messages comme terminés (équivalent de archivé sur gmail) pour qu’il ne soit plus dans votre boite de réception bien que toujours présent et accessible via une recherche etc. De même les messages importants peuvent être épinglé pour pouvoir les retrouver facilement.&lt;/p&gt;

&lt;h2 id=&quot;les-points-positifs&quot;&gt;Les points positifs&lt;/h2&gt;
&lt;p&gt;Je vais maintenant vous dire pourquoi ce service m’a séduit.&lt;/p&gt;

&lt;h3 id=&quot;les-contenus-mis-en-avant-&quot;&gt;Les contenus mis en avant :&lt;/h3&gt;

&lt;p&gt;Certaines informations principales de vos mails sont souvent des pièces jointes, il faut alors accéder au mail pour les trouver. Avec inbox c’est fini avant même d’ouvrir un mail vous avez des informations sur les pièces jointes (nom, type et selon les types elles sont même visible directement).&lt;/p&gt;

&lt;p&gt;De même si votre mails contient des informations sur un vol, un restaurant etc les informations sont aussi mise en avant.&lt;/p&gt;

&lt;h3 id=&quot;le-tri-automatique&quot;&gt;Le tri automatique&lt;/h3&gt;

&lt;p&gt;Oui en fonction du contenu les messages sont trié dans des catégories par défaut ainsi que vos propres catégories a l’aide de filtre. Il sont ainsi regroupé et vous ne pouvez commencer votre tour que par l’essentiels. C’est assez pratique pour pouvoir ne se concentrer que sur l’utile au moment de la lecture. Un autre point assez intéressant qui viens avec le tri automatique est la possibilité de ne recevoir les mails d’une certaine catégorie que une fois par jours ou une fois par semaine si l’on le désire. Par défaut les mails sont disponible dès la réceptions.&lt;/p&gt;

&lt;h3 id=&quot;les-rappels&quot;&gt;Les rappels&lt;/h3&gt;

&lt;p&gt;Il s’agit la de la fonctionnalité qui m’a le plus séduit, en effet il est possible de placer de nombreux rappel au sein d’inbox. Le premier type de rappel est très simple il s’agit d’une simple todo list. Le message apparaîtra tant que vous ne l’avez pas mis comme terminé. Bien entendu vous pouvez faire en sorte qu’un rappel apparaisse dans la boite au lettre que a partir d’une certaine date ou lorsque l’on se trouve a une certaine position géographique (il faudra alors l’application mobile).&lt;/p&gt;

&lt;p&gt;Ainsi je peux le matin me créer un rappel a 8h00 mais ne l’avoir affiché que le soir a partir de 19h00. Le rappel est donc mis en attente pendant ce temps. Il est important de noter que en dessous de la tâche nous avons la durée depuis laquelle elle est mise en attente.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;La ou cela deviens merveilleux c’est que l’on peut mettre un mail en attente, il disparaît ainsi de la boite de réception pour ne réapparaître plus tard quand il sera utile ou lorsque il sera possible de le traiter. Ainsi plus de risque d’oublier un mail remis a plus tard mais aussi plus de culpabilité a voir ce mail sans réponse dans votre boite de réception.&lt;/p&gt;

&lt;h2 id=&quot;les-points-négatifs&quot;&gt;Les points négatifs&lt;/h2&gt;

&lt;p&gt;Comme de partout il y a quelques points négatifs.  Premièrement pour faire les tris automatiques etc il est évidents que vos mails sont analysé par des algorithmes appartenant a google – après il faut relativisé si le mail est sur votre adresse gmail avec ou sans inbox google a la possibilité d’y avoir accès.&lt;/p&gt;

&lt;p&gt;Mais plus important pour moi c’est une erreur d’ergonomie, en effet actuellement il est impossible de supprimer un mail en un clic. Il faut passer par un menu pour pouvoir enfin le supprimer. Cette action bien que courante va vous faire perdre du temps a chaque suppression.
 &lt;/p&gt;

&lt;p&gt;En conclusion je suis devenu assez fan de ce service qui me fait gagner du temps dans le tri de mes mails mais aussi me sert de todo-list. De plus c’est toujours agréable d’avoir 0 messages ou tâche en boite de réception car tout est terminé ou en attente et pouvoir profiter du beau soleil en fond d’inbox.&lt;/p&gt;

&lt;p&gt;Il me reste quelques invitations si jamais certains veulent tester le service eux aussi.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Utiliser Diff et Patch sous Linux : Guide Essentiel</title>
     <link href="https://kandran.fr/utilisez-diff-et-patch-pour-trouver-et-appliquer-vos-modifications/"/>
     <updated>2015-04-30T18:00:56+00:00</updated>
     <id>https://kandran.fr/utilisez-diff-et-patch-pour-trouver-et-appliquer-vos-modifications</id>
     <content type="html">&lt;p&gt;Vous avez déjà eu besoin de chercher les différences entre deux fichiers ?&lt;br /&gt;
Modifier un fichier et souhaité transmettre uniquement vos modifications ?&lt;br /&gt;
Ou bien appliquer des modifications sur un fichier ?&lt;/p&gt;

&lt;p&gt;Si vous avez répondu oui à l’une de ces questions, cet article est fait pour vous.&lt;/p&gt;

&lt;h2 id=&quot;la-commande-diff-sous-linux&quot;&gt;La commande diff sous Linux&lt;/h2&gt;

&lt;h3 id=&quot;introduction-à-la-commande-diff&quot;&gt;Introduction à la commande diff&lt;/h3&gt;

&lt;p&gt;Pour résumer la commande &lt;strong&gt;diff&lt;/strong&gt; permet de voir les différences entre plusieurs fichiers. Cette comparaison se fait ligne par ligne de manière séquentielle et comprends donc tout le fichier.&lt;/p&gt;

&lt;p&gt;Les cibles peuvent être&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;des fichiers&lt;/li&gt;
  &lt;li&gt;des dossiers&lt;/li&gt;
  &lt;li&gt;et même l’entrée standard (via le symbole -).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En fonction du type de cible le comportement varie un petit peu, surtout lors qu’il ne s’agit pas de deux fichier.&lt;/p&gt;

&lt;p&gt;Lorsque  l’une des cibles est un dossier et l’autre un fichier la comparaison est faites sur les fichiers de même nom.&lt;/p&gt;

&lt;p&gt;Pour le cas de deux dossiers les fichiers de même nom sont comparé un a un de manière séquentielle.  Par défaut il n’y a pas de récursivité, on ne compare que le premier niveau.&lt;/p&gt;

&lt;p&gt;La syntaxe est :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;diff [options] cible1 cible 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;options-utiles-pour-la-commande-diff&quot;&gt;Options utiles pour la commande Diff&lt;/h3&gt;

&lt;p&gt;Comme vous avez pu le voir dans la commande ci-dessous diff peut avoir des options.&lt;/p&gt;

&lt;p&gt;Voici les plus pratiques et utilisé :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;-b&lt;/strong&gt; ignore les différences du à des espaces blancs&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;-B&lt;/strong&gt; ignore les différences du à des lignes blanches&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;-i&lt;/strong&gt; ignore la casse (c’est a dire les différences entre les minuscules et les majuscule)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;-q&lt;/strong&gt; indiquer seulement si les fichiers sont différents et ne pas afficher les différences elles-mêmes&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;-s&lt;/strong&gt; indiquer lorsque deux fichiers sont identiques&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;-r&lt;/strong&gt; comparaison récursive des fichiers d’un répertoire, sous répertoires…&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;la-commande-patch-pour-appliquer-des-modifications&quot;&gt;La commande patch pour appliquer des modifications&lt;/h2&gt;

&lt;p&gt;Les patch permettent d’appliquer rapidement les modifications effectué entre deux fichiers.&lt;/p&gt;

&lt;p&gt;Son utilisation est assez simple entre deux fichiers&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;patch fichierSource &amp;lt; fichier.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dans le cas des répertoires il y a une option &lt;strong&gt;p&lt;/strong&gt; pour préciser le niveau de profondeur, en effet la hiérarchie des fichiers a pu changer entre le pc ou le patch a été effectué et le pc où l’on applique le patch.&lt;/p&gt;

&lt;p&gt;On ajoute le nombre de dossier a sauter dans l’arborescence  pour appliquer le patch.  Souvent l’option -p1 fonctionne – plus de 90% des cas.&lt;/p&gt;

&lt;p&gt;Par exemple on pourrai avoir&lt;/p&gt;

&lt;pre&gt;patch -p3 &amp;lt; fichier.patch&lt;/pre&gt;

&lt;h3 id=&quot;annuler-un-patch&quot;&gt;Annuler un patch&lt;/h3&gt;

&lt;p&gt;Vous avez appliqué le mauvais patch a votre fichier, pas de panique une option est prévu pour revenir au fichier original avec le fichier modifié et notre fichier de patch grâce a l’option &lt;strong&gt;-R&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Attention pour les patchs avec les répertoire il faut ici encore spécifier la profondeur avec l’option -p comme lors de l’application du patch.&lt;/p&gt;

&lt;p&gt;Par exemple&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;patch -p3 -R &amp;lt; fichier.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;créer-un-patch-avec-diff&quot;&gt;Créer un patch avec diff&lt;/h2&gt;

&lt;p&gt;Pour créer un patch avec diff entre deux fichiers on utilise l’option &lt;strong&gt;-u&lt;/strong&gt; et on redirige la sortie vers notre fichier de patch a l’aide du symbole &amp;gt;.&lt;/p&gt;

&lt;p&gt;Par exemple&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;diff -u fichierInitial.c fichierModifie.c &amp;gt; fichier.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pour une arborescence complète l’option change un peu : on utilise &lt;strong&gt;-rupN&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;diff -rupN dossierInitial/ dossierModifie/ &amp;gt; dossier.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;conclusion-sur-lutilisation-de-diff-et-patch-sous-linux&quot;&gt;Conclusion sur l’utilisation de Diff et Patch sous Linux&lt;/h2&gt;

&lt;p&gt;Pour résumer avec ces commandes vous pouvez&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Voir les différences entre fichiers : &lt;em&gt;commande diff&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Créer un patch : &lt;em&gt;commande diff avec l’option -u&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Appliquer un patch : &lt;em&gt;commande patch&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Revenir a l’état d’avant le patch : &lt;em&gt;commande patch  avec l’option -R&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bien entendu des qu’il y a des dossiers d’autre options sont a rajouté pour gérer la récursion, les fichiers manquant, les différences de hiérarchies etc.&lt;/p&gt;

&lt;p&gt;NB : la commande diff est disponible aussi sur git.&lt;/p&gt;

&lt;p&gt;En espérant que ces deux petites commandes vous fasse gagner un peu de temps.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Activer inbox by Gmail sans smartphone</title>
     <link href="https://kandran.fr/activer-inbox-by-gmail-sans-application-mobile/"/>
     <updated>2015-04-29T00:20:34+00:00</updated>
     <id>https://kandran.fr/activer-inbox-by-gmail-sans-application-mobile</id>
     <content type="html">&lt;p&gt;&lt;strong&gt;Note : Ce projet n’existe plus chez google, une bonne partie des fonctionnalités sont maintenant ingégré a gmail&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt; Si vous aussi vous avez obtenue une invitation pour le service Inbox by gmail mais que comme moi vous n’avez ni smartphone sous android ni iphone vous avez du etre un peu frustré quand lors de votre connexion sur l’application web vous avez un message demandant un passage par l’application mobile. Et bien entendu aucune application de disponible pour votre support (windows phone pour moi)&lt;/p&gt;

&lt;p&gt;Toutefois il est assez simple de s’en passer.&lt;/p&gt;

&lt;p&gt;Avec le mail d’invitation se trouve en bas un token (code d’invitation), grâce a celui ci vous pouvez vous passer de l’application mobile.&lt;/p&gt;

&lt;p&gt;Collez le a la fin de cette URL&lt;/p&gt;

&lt;pre&gt;https://mail.google.com/mail/btinvites/mobile?token=&lt;/pre&gt;

&lt;p&gt;Accéder a la ressource, un fichier est normalement téléchargé en parallèle un mail vous confirmera que l’application sera utilisable en mode web.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Build d’application node-webkit avec grunt</title>
     <link href="https://kandran.fr/build-node-webkit-app/"/>
     <updated>2015-04-23T18:00:23+00:00</updated>
     <id>https://kandran.fr/build-node-webkit-app</id>
     <content type="html">&lt;p&gt;Avec node-webkit-builder vous allez pouvoir build votre application node-webkit en ligne de commande assez simplement. Le module se charge de télécharger les exécutables, de créer votre dossier de release et build votre application. Mieux encore, ce processus peut être simplifié avec un plugin grunt. Nous allons donc voir comment utiliser au mieux ce plugin pour avoir votre application disponible sur les diverses plateformes.&lt;/p&gt;

&lt;h2 id=&quot;import-de-node-webkit-builder&quot;&gt;Import de node-webkit-builder&lt;/h2&gt;

&lt;p&gt;Commençons par creer notre fichier &lt;strong&gt;package.json&lt;/strong&gt;, ce fichier servira de base pour nos dépendance nodeJs nécessaire au build, c’est a dire notre plugin grunt.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;node-webkit-starter-pack&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Beggins with node-webkit using grunt for packaging&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
	&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
		&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;grunt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
		&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;grunt-node-webkit-builder&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;latest&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
	&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Globalement il s’agit d’un fichier de dépendance classique pour nodeJs, on spécifie que l’on a besoin de grunt et grunt-node-webkit-builder pour pouvoir utiliser nos build automatiques.&lt;/p&gt;

&lt;p&gt;Pour installer nos dépendance il suffit d’un simple&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Maintenant nous allons voir comment configurer notre plugin grunt pour répondre a nos attentes.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;configurationde-node-webkit-builder&quot;&gt;Configuration de node-webkit-builder&lt;/h2&gt;

&lt;p&gt;Pour configurer grunt nous allons remplir un fichier &lt;strong&gt;Gruntfile.js&lt;/strong&gt;. Voici ci dessous une configuration possible notre plugins :&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;initConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;nodewebkit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;buildDir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;./build&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// where the build is save&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;platforms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;win&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;osx&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;linux&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// platform to build&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;buildType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;versioned&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;macZip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// app isn&apos;t zip on mac but it improve speed app&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;./app/**/*&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Your node-webkit app&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
      
      &lt;span class=&quot;nx&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;loadNpmTasks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;grunt-node-webkit-builder&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;grunt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;registerTask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;nodewebkit&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Nous avons donc défini pour node-webkit que notre application se situe dans le sous dossier app. De même nous avons mis en place certaines configuration.&lt;/p&gt;

&lt;p&gt;De ce fait a chaque build nous retrouverons nos résultats dans les sous dossier &lt;em&gt;./build/appName – Version/platform&lt;/em&gt; . Le fait d’avoir mis macZip a false entraînera un fichier plus lourd sur macOs mais le temps de démarrage sera largement amélioré.&lt;/p&gt;

&lt;p&gt;Maintenant pour générer nos build il suffit d’entre la commande suivante :&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;grunt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Je vais éviter de faire une liste des options disponible avec le plugins : pour voir l’ensemble de celle ci vous pouvez vous rendre &lt;a href=&quot;https://github.com/mllrsohn/node-webkit-builder#options&quot; title=&quot;Dépôt git node webkit builder&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Il faut également savoir que l’on peut surcharger le fichier de configuration de node webkit par plateforme grâce a l’option &lt;strong&gt;platformOverrides&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;J’ai également mis en place un dépôt github avec la structure de base de faire vous permettant de n’avoir qu’a changer les config de base et coder votre application node-webkit. Il est disponible &lt;a href=&quot;https://github.com/kandran/node-webkit-starter&quot; title=&quot;dépôt starter node webkit&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Je vous invite a jouer avec toutes les options de node webkit,  que ce soit dans le package.json contenu au niveau de l’application (dans le dossier app du coup) ou au niveau du fichier Gruntfile.js. Avec cet outil le packaging de vos applications devrait être plus rapide et simple. Pour ma part je vais m’en servir sur mon projet avec node-webkit.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Présentation de NW.js : Créez des apps desktop modernes</title>
     <link href="https://kandran.fr/presentation-node-webkit/"/>
     <updated>2015-04-22T00:17:13+00:00</updated>
     <id>https://kandran.fr/presentation-node-webkit</id>
     <content type="html">&lt;p&gt;&lt;strong&gt;Node-Webkit&lt;/strong&gt;, rebaptisé &lt;strong&gt;NW.js&lt;/strong&gt;, est un environnement d’exécution basé sur Chromium et Node.js. Il permet de créer des applications de bureau multiplateformes (Windows, Mac OS X, Linux) en utilisant des technologies web modernes telles que HTML5, CSS3 et JavaScript. Cet outil offre une intégration unique entre le DOM et les modules Node.js, ouvrant la voie à une nouvelle manière de développer des applications natives.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pourquoi-utiliser-node-webkitnwjs-&quot;&gt;&lt;strong&gt;Pourquoi utiliser Node-Webkit/NW.js ?&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;NW.js se distingue par ses nombreuses fonctionnalités qui facilitent le développement d’applications performantes et faciles à distribuer :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Technologies modernes&lt;/strong&gt; : Prise en charge complète de HTML5, CSS3, WebGL et des API Node.js.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Performance optimisée&lt;/strong&gt; : Chromium et Node.js s’exécutent dans le même thread, ce qui simplifie les appels de fonctions et l’accès aux objets.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Flexibilité&lt;/strong&gt; : Possibilité d’appeler directement les modules Node.js depuis le DOM ou les Web Workers.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Multiplateforme&lt;/strong&gt; : Compatible avec Linux, Mac OS X et Windows.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Facilité de distribution&lt;/strong&gt; : Les applications peuvent être facilement empaquetées et distribuées.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;installation-et-prise-en-main&quot;&gt;&lt;strong&gt;Installation et prise en main&lt;/strong&gt;&lt;/h2&gt;

&lt;h3 id=&quot;installation&quot;&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Pour installer NW.js, vous pouvez utiliser npm. Voici les étapes de base :&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Installer NW.js localement dans votre projet :
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;nw
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Ajouter un script dans votre fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;package.json&lt;/code&gt; pour lancer l’application :
    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;nw&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Lancer l’application :
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;création-dune-application-simple&quot;&gt;&lt;strong&gt;Création d’une application simple&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;Créez un fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.html&lt;/code&gt; :
    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Hello World!&lt;span class=&quot;nt&quot;&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello World!&lt;span class=&quot;nt&quot;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Nous utilisons Node.js version : &lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Créez un fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;package.json&lt;/code&gt; :
    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;nw-demo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index.html&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Lancez l’application avec NW.js :
    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;nw &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;cas-dutilisation&quot;&gt;&lt;strong&gt;Cas d’utilisation&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;NW.js est idéal pour plusieurs scénarios :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Applications desktop multiplateformes&lt;/strong&gt; : Créez une seule application qui fonctionne sur Windows, Mac et Linux.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Applications nécessitant des fonctionnalités avancées&lt;/strong&gt; : Intégrez des modules Node.js pour accéder à des fonctionnalités système ou tierces.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Prototypage rapide&lt;/strong&gt; : Utilisez vos compétences en développement web pour concevoir rapidement des interfaces utilisateur.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;avantages-par-rapport-à-electron&quot;&gt;&lt;strong&gt;Avantages par rapport à Electron&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Bien que NW.js soit souvent comparé à Electron, il présente certaines différences notables :&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Caractéristique&lt;/th&gt;
            &lt;th&gt;NW.js&lt;/th&gt;
            &lt;th&gt;Electron&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;Intégration DOM-Node.js&lt;/td&gt;
            &lt;td&gt;Appels directs entre DOM et Node.js&lt;/td&gt;
            &lt;td&gt;Processus séparés pour DOM et Node.js&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Structure du projet&lt;/td&gt;
            &lt;td&gt;&lt;code&gt;package.json&lt;/code&gt; au cœur&lt;/td&gt;
            &lt;td&gt;Fichiers séparés pour main/renderer&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Performances&lt;/td&gt;
            &lt;td&gt;Fonctionne dans un seul thread&lt;/td&gt;
            &lt;td&gt;Multi-processus&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;NW.js est un outil puissant pour les développeurs souhaitant créer des applications de bureau modernes en utilisant leurs compétences en développement web. Grâce à sa flexibilité, ses performances optimisées et sa prise en charge multiplateforme, il constitue une excellente alternative pour transformer vos idées en applications natives.&lt;/p&gt;

&lt;p&gt;Si vous cherchez à développer rapidement une application desktop tout en exploitant les avantages des technologies web, NW.js est une solution incontournable !&lt;/p&gt;

</content>
   </entry>
   
 
   
   <entry>
     <title>Emportez et partagez votre éditeur avec C9</title>
     <link href="https://kandran.fr/emportez-et-partagez-votre-editeur-avec-c9/"/>
     <updated>2015-04-16T18:00:39+00:00</updated>
     <id>https://kandran.fr/emportez-et-partagez-votre-editeur-avec-c9</id>
     <content type="html">&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/04/Cloud9IDE.png&quot; alt=&quot;logo cloud 9 - un éditeur en ligne&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vous avez déjà eu a éditer votre code mais sans avoir votre éditeur favori  ?&lt;/p&gt;

&lt;p&gt;Ou simplement du travailler ensemble sur un même code (par exemple lors de prise de note en cours) ?&lt;/p&gt;

&lt;p&gt;Si cela vous ai déjà arrivé vous devez savoir a quel points il est difficile d’être à deux en même temps sur le même bout de code en mode collaboratif (comme par exemple etherpad ou google docs pour la prise de texte).&lt;/p&gt;

&lt;p&gt;J’ai découvert il y a peu – hélas – un outil qui va changer tout ça : &lt;strong&gt;C9&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;présentation-générale&quot;&gt;Présentation générale&lt;/h2&gt;

&lt;p&gt;Cloud9 abrégé c9 est un ide en ligne, &lt;strong&gt;accessible ainsi avec un simple navigateur&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;De plus votre code est exécuté dans l’application : une machine virtuelle est disponible configurable  selon les besoins. Ainsi avec un simple navigateur vous pouvez facilement coder, compiler si besoin et tester votre application.&lt;/p&gt;

&lt;p&gt;Ce qui vous permettra d’éditer facilement vos scripts et tests varié. Il un système de plugin permettant de rendre cet ide aussi performant qu’un ide standard (auto-complétion, coloration, options de refactoring etc.) est disponible.&lt;/p&gt;

&lt;p&gt;Mais vous pouvez aussi &lt;strong&gt;partager votre IDE&lt;/strong&gt; avec d’autre ainsi que le workspace et même l’application qui tourne sur le workspace tout simplement avec un système de droit.&lt;/p&gt;

&lt;p&gt;Lors que vous avez partagé votre ide vous pouvez voir tout ce que les autres utilisateur tape en direct.&lt;/p&gt;

&lt;p&gt;Cerise sur le gâteau il est en outre possible de revoir les modifications d’un fichier depuis sa création, avec même une sorte de mode vidéo.&lt;/p&gt;

&lt;h2 id=&quot;comment-se-servir-de-c9-comme-éditeur&quot;&gt;Comment se servir de c9 comme éditeur&lt;/h2&gt;

&lt;p&gt;Pour pouvoir utiliser C9 vous pouvez soit :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;L’héberger vous même les sources sont disponible sur &lt;a href=&quot;https://github.com/c9&quot; target=&quot;_blank&quot;&gt;github &lt;/a&gt;– attention il faudra utiliser les plugins etc pour avoir toutes les fonctionnalités&lt;/li&gt;
  &lt;li&gt;Utiliser le &lt;a href=&quot;https://c9.io/&quot; target=&quot;_blank&quot;&gt;service en ligne&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour la suite de l’article je parlerai uniquement du service en ligne, en effet je n’ai pas encore testé d’installer c9 sur ma machine ni sur un serveur.&lt;/p&gt;

&lt;p&gt;Vous pouvez vous inscrire gratuitement et profiter de fonctionnalités limitées.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Avec l’offre gratuite vous pouvez avoir :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Une Vm privée&lt;/li&gt;
  &lt;li&gt;Autant de vm publique que voulu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les vm sont limitées à:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;1GB d’espace disque&lt;/li&gt;
  &lt;li&gt;512 mo de ram&lt;/li&gt;
  &lt;li&gt;les vm non utilisé sont mise en hibernation (il faudra un petit délais pour pouvoir y accéder a nouveau).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Voici un petit screen de l’interface de notre ide&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kandran.fr/assets/2015/04/screenshotC9.png&quot;&gt;&lt;img class=&quot;aligncenter wp-image-70 size-large&quot; src=&quot;http://kandran.fr/assets/2015/04/screenshotC9-1024x557.png&quot; alt=&quot;screenshotC9&quot; width=&quot;648&quot; height=&quot;352&quot; srcset=&quot;http://kandran.fr/assets/2015/04/screenshotC9-1024x557.png 1024w, http://kandran.fr/assets/2015/04/screenshotC9-300x163.png 300w&quot; sizes=&quot;(max-width: 648px) 100vw, 648px&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;quelques-cas-dutilisation-possible-&quot;&gt;Quelques cas d’utilisation possible :&lt;/h2&gt;

&lt;p&gt;Vous pouvez dans un amphi recopier les exemples de TP tous ensemble.&lt;/p&gt;

&lt;p&gt;Mais aussi programmer a plusieurs sur le même fichier en même temps. Voire même écrire votre code et obtenir une vidéo de toutes les modifications – ce qui peut être pratique pour un tutorial.&lt;/p&gt;

&lt;p&gt;Bien entendu cette solution étant relié a des services de versionning vous pouvez récupérer vos propre dépôt facilement.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Dans un contexte totalement différent vous pouvez ainsi développer votre application sur un environnement externe et de ce fait économiser les ressources de votre ordinateur.&lt;/p&gt;

&lt;p&gt;En effet avec c9 vous avez plus besoin d’ouvrir votre ide favori qui se fait une joie de consommer une quantité de ram importante.&lt;/p&gt;

&lt;p&gt;Personnellement même si le concept a l’air assez bien je préfère avoir mon ide en local pour des projets plus important, en effet ils ont quand même souvent plus de fonctionnalités.&lt;/p&gt;

&lt;p&gt;Le fait que les sources soient disponible peut nous permettre d’utiliser c9 sur des projets un peu plus privé avec un peu plus de confiance malgré la présence de workspace privée sur le site.&lt;/p&gt;

&lt;p&gt;Que pensez vous de cet outil ? Seriez vous prêt a passer totalement dessus ? Pour quels genre de projet ?&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Design Pattern Visiteur : principe et exemple d'implémentation</title>
     <link href="https://kandran.fr/design-pattern-visiteur/"/>
     <updated>2015-04-09T18:00:11+00:00</updated>
     <id>https://kandran.fr/design-pattern-visiteur</id>
     <content type="html">&lt;p&gt;Découvrez le Design Pattern Visiteur : une méthode efficace pour séparer algorithmes et structures de données, avec exemples en PHP et Java.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/04/VisitorDiagram.svg_.png&quot; alt=&quot;Diagramme du Design Pattern Visiteur&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cette semaine je vais vous présenter un nouveau design pattern que je trouve assez intéressant : le design pattern visiteur.&lt;/p&gt;

&lt;p&gt;Le pattern Visiteur (Visitor) permet de séparer de manière claire un algorithme d’une structure de donnée. L’algorithme n’est donc pas implémenté dans la classe mais dans des classes externes.&lt;/p&gt;

&lt;p&gt;On limite ainsi tout couplage entre les données et leurs traitements, ce qui permet d’ajouter des traitements à nos structures de données sans avoir à les modifier. De plus, la classe externe est informée du type exact de l’objet qu’elle visite à l’aide du principe du &lt;strong&gt;double dispatch&lt;/strong&gt; (bon, sauf en PHP où la signature des méthodes ne prend pas en compte le type des entrées).&lt;/p&gt;

&lt;h2 id=&quot;quest-ce-que-le-design-pattern-visiteur-&quot;&gt;Qu’est-ce que le Design Pattern Visiteur ?&lt;/h2&gt;

&lt;h3 id=&quot;principe-et-avantages&quot;&gt;Principe et avantages&lt;/h3&gt;
&lt;p&gt;Le design pattern Visiteur permet de séparer l’algorithme du modèle de données. Il consiste à appliquer un algorithme sur une structure de données sans modifier cette structure. L’algorithme est encapsulé dans une classe distincte, appelée visiteur, qui peut agir sur divers types d’objets visités, tout en préservant la flexibilité du code.&lt;/p&gt;

&lt;h3 id=&quot;le-concept-de-double-dispatch&quot;&gt;Le concept de double dispatch&lt;/h3&gt;
&lt;p&gt;Le &lt;strong&gt;double dispatch&lt;/strong&gt; est essentiel au fonctionnement du pattern. Il permet à un objet de connaître son type exact à runtime et d’exécuter des méthodes adaptées au type de l’objet qu’il visite.&lt;/p&gt;

&lt;h2 id=&quot;implémentation-du-design-pattern-visiteur&quot;&gt;Implémentation du Design Pattern Visiteur&lt;/h2&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Bien que souvent évoqué comme complexe, ce design pattern est relativement simple. Notre classe visitable (c’est-à-dire notre structure de données) possède une méthode &lt;strong&gt;accept&lt;/strong&gt; qui nous permet d’injecter notre visiteur (on précise une interface correspondant aux visiteurs voulus en type d’entrée).&lt;/p&gt;

&lt;p&gt;En même temps, les visiteurs concrets implémentent une interface qui contient une méthode &lt;strong&gt;visit&lt;/strong&gt; par type d’objet visitable. Lors de l’utilisation, le typage dynamique permet d’appeler la bonne méthode — c’est ce qu’on appelle le &lt;strong&gt;double dispatch&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dans notre objet visitable, on appellera donc la méthode &lt;strong&gt;visit&lt;/strong&gt; de notre visiteur en lui passant l’objet lui-même.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3 id=&quot;cas-dusage-en-php&quot;&gt;Cas d’usage en PHP&lt;/h3&gt;

&lt;p&gt;Pour cet article, j’ai d’abord implémenté une solution en PHP avant de me rendre compte que le typage faible, ainsi que la façon dont est calculée la signature des méthodes, nous empêche de redéfinir une méthode avec des types différents. Cela signifie qu’en PHP, nous ne pouvons pas pleinement bénéficier des avantages du double dispatch. Toutefois, cet exemple simplifié aide à comprendre le concept.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Grace au design pattern visiteur nous allons mettre en place un système de rendu d’un document. Notre document sera un simple objet contenant un tableau clef-valeur. Le but est d’afficher le contenu de l’objet de plusieurs façon différente : plain text, html et xml.  Pour faire cela une solution triviale serait de faire une classe renderer et dedans créer une méthode par type de rendu. Lors d’un ajout/suppression de méthode de rendu on éditerai ce fichier. Les deux principaux inconvénient de cette méthode a mon gout sont que :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;on va avoir une classe assez volumineuse : difficulté de maintenance&lt;/li&gt;
  &lt;li&gt;pour l’ajout d’une méthode on modifie la classe du coup il faut la recompiler : temps de compilation croissant avec la taille de la classe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nous allons donc utiliser le design pattern visiteur. Chaque type de renderer sera une classe concrété ayant le rôle de visiteur et notre document (ici ConfigDocument) aura le rôle de classe visitable.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/32e0e8d7a738616002be.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Ainsi pour gérer les différents types de rendu on aura juste a injecter le bon renderer via &lt;strong&gt;accept&lt;/strong&gt; puis récupérer la sortie au niveau de notre renderer. Le fait d’avoir du html, xml ou autre ne dépends que du renderer que nous avons injecter.   Si cela vous semble déjà merveilleux, je vous conseille de lire attentivement la suite.  &lt;/p&gt;

&lt;h3 id=&quot;cas-dusage-en-java&quot;&gt;Cas d’usage en Java&lt;/h3&gt;

&lt;p&gt;En java la principale modification est que chaque visiteur contient plusieurs méthodes &lt;strong&gt;accept&lt;/strong&gt; : une part type d’objet quelle peut visiter. De cette façon on peut exécuter du code différent selon le type d’objet qui est visité et ceci au runtime. Voici un exemple simple pour illustrer ceci :            &lt;/p&gt;

&lt;p&gt; &lt;script src=&quot;https://gist.github.com/kandran/62ee8ba0dc47033d609d.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Le design pattern visiteur permet de séparer les algorithmes des structures de données sur lesquels ils sont appliqué&lt;/li&gt;
  &lt;li&gt;A l’aide du système de double dispatch les objets visiteurs peuvent avoir des comportements différents en fonction de l’objets qu’ils visitent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;C’est tout pour ce design pattern, en espérant le voir plus souvent utilisé même si on y pense pas tout le temps.  J’espère que vous comprenez un peu mieux l’intérêt du visiteur et surtout comment le mettre en oeuvre. Si ce n’est pas le cas, je répondrai aux questions dans les commentaires.&lt;/p&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Apprenez le Design Pattern Décorateur en 5 Min</title>
     <link href="https://kandran.fr/design-pattern-decorateur/"/>
     <updated>2015-04-02T18:36:46+00:00</updated>
     <id>https://kandran.fr/design-pattern-decorateur</id>
     <content type="html">&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/04/star-wars-decorateur-pattern.jpg&quot; alt=&quot;Illustration du Design Pattern Décorateur via star-wars&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vous voulez comprendre rapidement comment ajouter des fonctionnalités dynamiques à vos objets ? Ce guide vous explique tout en 5 minutes chrono !&lt;/p&gt;

&lt;p&gt;Pour cela je vais vous présenter un design pattern fondamental en programmation orientée objet : le &lt;strong&gt;Décorateur&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;quest-ce-que-le-design-pattern-décorateur-&quot;&gt;Qu’est-ce que le Design Pattern Décorateur ?&lt;/h2&gt;

&lt;p&gt;Le pattern Décorateur (&lt;strong&gt;Decorator&lt;/strong&gt;) permet d’ajouter dynamiquement de nouvelles fonctionnalités à un objet sans modifier son code d’origine. 
Il offre une alternative souple à l’héritage, évitant ainsi une complexité inutile (comme l’explosion des classes ou des diagrammes rigides).&lt;/p&gt;

&lt;p&gt;En pratique, ce pattern est utile lorsque l’héritage rend le code trop lourd ou difficile à maintenir. 
Grâce au Décorateur, vous pouvez ajouter des comportements à l’exécution de manière flexible.&lt;/p&gt;

&lt;p&gt;Dans certains cas, l’héritage alourdit inutilement la structure du code, rendant sa maintenance plus complexe :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;explosion de classes&lt;/li&gt;
  &lt;li&gt;diagramme rigide&lt;/li&gt;
  &lt;li&gt;méthodes de la classe de base inappropriées dans certaines classes dérivées&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On prefere donc ajouter les nouvelles fonctionnalité a l’exécution.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;mise-en-place-du-design-pattern-&quot;&gt;Mise en place du design pattern :&lt;/h2&gt;

&lt;h3 id=&quot;introduction&quot;&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Le concept est simple : un décorateur est une classe qui hérite de l’objet qu’elle décore et contient une instance de cet objet. 
Cela permet une décoration récursive.&lt;/p&gt;

&lt;p&gt;Prenons un exemple concret. Imaginez un vaisseau spatial (comme dans l’image en haut de l’article). Le vaisseau de base est l’objet à décorer, et un propulseur supplémentaire agit comme un décorateur, lui ajoutant de nouvelles fonctionnalités (par exemple, augmenter sa vitesse).&lt;/p&gt;

&lt;p&gt;Voici un schéma pour mieux visualiser :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/04/decorator-pattern-schemas.png&quot; alt=&quot;Schema macro du design pattern decorateur&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Et voici une version UML plus formelle pour clarifier :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets/2015/04/decorateur-uml.png&quot; alt=&quot;Diagramme UML du Design Pattern Décorateur&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;on-voit-bien-que-notre-décorateur-hérite-du-composant-a-décorer-contient-une-instance-sur-un-composant&quot;&gt;On voit bien que notre décorateur hérite du composant a décorer, contient une instance sur un composant.&lt;/h2&gt;

&lt;h3 id=&quot;implémentation&quot;&gt;Implémentation&lt;/h3&gt;

&lt;p&gt;Voici un extrait de code qui illustre comment implémenter ce pattern :&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/kandran/149a41a369dc65221104.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Dans cet exemple :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ship&lt;/code&gt;&lt;/strong&gt; est une classe abstraite qui définit un vaisseau spatial.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JediShip&lt;/code&gt;&lt;/strong&gt; représente un vaisseau Jedi.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accelerator&lt;/code&gt;&lt;/strong&gt; est un décorateur qui ajoute une fonctionnalité : l’accélération.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les deux dernières classes héritent de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ship&lt;/code&gt;, permettant ainsi un chaînage récursif des décorateurs.&lt;/p&gt;

&lt;p&gt;Dans le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Warehouse&lt;/code&gt;, vous pouvez observer une utilisation concrète de ce design pattern.&lt;/p&gt;

&lt;h3 id=&quot;points-forts&quot;&gt;Points forts&lt;/h3&gt;

&lt;p&gt;Le Décorateur repose sur l’héritage et la composition, ce qui en fait un pattern puissant pour construire des applications modulaires et évolutives.
Cependant, l’instanciation fréquente d’objets peut nécessiter l’utilisation d’une &lt;strong&gt;Factory&lt;/strong&gt; pour optimiser le processus.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;En résumé :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Le Décorateur ajoute dynamiquement des comportements à un objet.&lt;/li&gt;
  &lt;li&gt;Il permet de chaîner plusieurs décorateurs pour des fonctionnalités combinées.&lt;/li&gt;
  &lt;li&gt;Le Décorateur et l’objet décoré partagent une classe ou une interface commune.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce pattern est un excellent outil pour gérer des besoins évolutifs tout en maintenant un code propre et maintenable.&lt;/p&gt;

&lt;p&gt;C’est tout pour ce design pattern ! J’espère que cet article vous a été utile.&lt;/p&gt;

&lt;p&gt;Quels autres patterns aimeriez-vous voir abordés dans un prochain article ? 
Faites-le-moi savoir dans les commentaires!&lt;/p&gt;

&lt;h2 id=&quot;faq-foire-aux-questions&quot;&gt;FAQ (Foire Aux Questions)&lt;/h2&gt;

&lt;h3 id=&quot;quest-ce-quun-design-pattern-en-programmation-&quot;&gt;Qu’est-ce qu’un Design Pattern en programmation ?&lt;/h3&gt;
&lt;p&gt;Un Design Pattern est une solution réutilisable à un problème courant rencontré dans le développement logiciel. Ces patrons de conception permettent d’améliorer la structure, la lisibilité et la maintenance du code.&lt;/p&gt;

&lt;h3 id=&quot;quand-utiliser-le-design-pattern-décorateur-&quot;&gt;Quand utiliser le Design Pattern Décorateur ?&lt;/h3&gt;
&lt;p&gt;Le pattern Décorateur est particulièrement utile lorsque :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Vous souhaitez ajouter dynamiquement des fonctionnalités à un objet sans modifier son code source.&lt;/li&gt;
  &lt;li&gt;L’héritage devient trop complexe ou rigide, avec une explosion de classes.&lt;/li&gt;
  &lt;li&gt;Vous avez besoin d’une solution flexible pour enrichir un comportement à l’exécution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;quelle-est-la-différence-entre-héritage-et-composition-&quot;&gt;Quelle est la différence entre héritage et composition ?&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Héritage&lt;/strong&gt; : Permet de définir une hiérarchie rigide où les classes dérivées héritent des propriétés et méthodes d’une classe parent.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Composition&lt;/strong&gt; : Permet d’assembler dynamiquement des objets pour ajouter des fonctionnalités, offrant ainsi plus de flexibilité qu’un système basé uniquement sur l’héritage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;quels-sont-les-avantages-du-design-pattern-décorateur-&quot;&gt;Quels sont les avantages du Design Pattern Décorateur ?&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Ajout dynamique de fonctionnalités sans modifier le code existant.&lt;/li&gt;
  &lt;li&gt;Réduction de la complexité liée à l’héritage.&lt;/li&gt;
  &lt;li&gt;Meilleure réutilisabilité et modularité du code.&lt;/li&gt;
  &lt;li&gt;Possibilité d’empiler plusieurs décorateurs pour enrichir un objet.&lt;/li&gt;
&lt;/ul&gt;
</content>
   </entry>
   
 
   
   <entry>
     <title>Windows Host File Manager : outil de gestion simplifiée</title>
     <link href="https://kandran.fr/windows-host-file-manager/"/>
     <updated>2015-03-28T22:43:30+00:00</updated>
     <id>https://kandran.fr/windows-host-file-manager</id>
     <content type="html">&lt;p&gt;En tant que développeur web, vous avez souvent à éditer le fichier host pour ajouter des associations de nom hôtes avec des ip au sein de votre machine. Ce fichier a hélas la fâcheuse tendance de grossir de manière assez rapide ce qui rends la gestion assez capricieuse. Pire encore quelques fois vous aimeriez bien pouvoir a un nom de domaine associé une ip puis peut de temps apres une autre avant de revenir sur celle du début….&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;C’est en partant de ce constat que j’ai eu l’idée de me lancer dans ce projet. Mettre en place une interface simple pour gérer ce fichier. Niveau technologie, bien que en premier lieux j’étais tenté de le faire en JAVA j’ai décidé de me lancer dans l’utilisation de NodeJS avec nodeWebkit pour permettre l’aspect logiciel natif. Cela dans le but d’apprendre a utiliser plus en détails ces deux technologies.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://kandran.fr/assets//2015/03/Windows-Host-File-Manager-gui.png&quot; alt=&quot;Windows-Host-File-Manager-gui&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Actuellement j’ai mis en place une version fonctionnant sur windows qui permet de lister les hôtes dans le fichier host, les modifier supprimer et commenter. L’ajout de ligne est bien entendu possible également.&lt;/p&gt;

&lt;h2 id=&quot;fonctionnement-&quot;&gt;Fonctionnement :&lt;/h2&gt;

&lt;p&gt;Le fonctionnement de ce projet est assez simple, nous ouvrons donc le fichier host pour pouvoir l’analyser et afficher les diverses informations. Les actions au sein de l’ihm entraîne la modification du fichier par une nouvelle écriture.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2 id=&quot;restant-àfaire-&quot;&gt; Restant à faire :&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Amélioration de l’existant&lt;/li&gt;
  &lt;li&gt;Import / export&lt;/li&gt;
  &lt;li&gt;Système de profil&lt;/li&gt;
  &lt;li&gt;Portabilité&lt;/li&gt;
  &lt;li&gt;Système de recherche&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Vous pouvez suivre plus en détail ce projet sur &lt;a href=&quot;https://github.com/kandran/Windows-Host-File-Manager&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;github&lt;/a&gt;&lt;/p&gt;
</content>
   </entry>
   
 
 
</feed>
