<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <title>Teotime Pacreau Blog</title>
  <subtitle>Blog et essais</subtitle>
  <link href="https://www.teotimepacreau.fr/feed/feed.xml" rel="self" />
  <link href="https://www.teotimepacreau.fr/" />
  <updated>2026-02-07T00:00:00Z</updated>
  <id>https://www.teotimepacreau.fr/</id>
  <author>
    <name>Téotime Pacreau</name>
    <email>teotime.pac@outlook.fr</email>
  </author>
  <entry>
    <title>Préparer et mener de bons entretiens analytiques</title>
    <link href="https://www.teotimepacreau.fr/blog/entretiens-analytiques/" />
    <updated>2026-02-07T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/entretiens-analytiques/</id>
    <content type="html">&lt;p&gt;Pour récolter la matière nécessaire à la résolution de problèmes, un outil pertinent issu des sciences sociales est l’entretien analytique. Il permet de construire un consensus autour du problème et de cadrer la recherche.&lt;/p&gt;
&lt;h2 id=&quot;conceptualisation-pr%C3%A9alable&quot; tabindex=&quot;-1&quot;&gt;Conceptualisation préalable&lt;/h2&gt;
&lt;p&gt;Avant d’engager des entretiens, il est nécessaire de poser les objectifs de la recherche par entretien : &lt;em&gt;à quelle problématique la recherche essaie de répondre ?&lt;/em&gt; Cela aidera grandement pour circonscrire le périmètre des questions et faciliter la production d’&lt;em&gt;insights&lt;/em&gt; à l’issu de l’analyse des entretiens.
On a donc besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;calibrer la.les questions à laquelle la recherche essaie de répondre pour qu’elle ne soit pas trop vaste&lt;/li&gt;
&lt;li&gt;flécher des thématiques à investiguer pour répondre à cette.ces problématique.s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On définit ensuite le panel des personnes à interviewer en fonction de la problématique recherchée.&lt;/p&gt;
&lt;h3 id=&quot;approche-pour-la-planification-des-entretiens&quot; tabindex=&quot;-1&quot;&gt;Approche pour la planification des entretiens&lt;/h3&gt;
&lt;p&gt;Ce que l’on souhaite c’est accumuler les &lt;em&gt;insights&lt;/em&gt; et réduire la redondance d’informations. Si l’on interviewe par exemple 6 personnes du même rôle l’idée est de ne pas poser à chaque fois les mêmes questions, on peut très bien se concentrer sur une thématique de la problématique par interview.&lt;/p&gt;
&lt;h2 id=&quot;construire-le-guide-d%E2%80%99entretien&quot; tabindex=&quot;-1&quot;&gt;Construire le guide d’entretien&lt;/h2&gt;
&lt;p&gt;Pour s’assurer que les entretiens permettront de répondre aux thématiques recherchées, on peut construire un guide d’entretien : celui-ci permet de fixer les questions à l’avance afin de cadrer l’échange. Il existe différents types d’entretiens structurés, semi-structurés, libres pour lesquels on choisira ou non d’utiliser un guide d’entretien.&lt;/p&gt;
&lt;p&gt;Il est utile de procéder à un ordre de question en entonnoir : on questionne en partant du plus général vers le plus spécifique pour que l’interviewé apporte le contexte nécessaire en entrée d’entretien afin que l’intervieweur puisse être challengeant sur les questions plus spécifiques.
Numéroter chaque question pour pouvoir référencer facilement les réponses en prise de notes est pratique.
Titrer pour soi les catégories de questions permet à l’intervieweur de retrouver plus rapidement en entretien la thématique de la question à venir.
On essaie d’être le plus neutre possible dans les questios posées avec un soin particulier pour ne pas influencer les réponses via des biais qui se ressentent dans les questions.
On préférera toujours poser des questions ouvertes plutôt que des questions formés pour inciter l’interviewé à justifier ses réponses.&lt;/p&gt;
&lt;p&gt;Voici un exemple de guide d’entretien constitué par mes soins dont la forme visuelle répondait à un besoin de pouvoir potentiellement être distribué pour certains interlocuteurs sans avoir à mener d’entretien, aujourd’hui je recommenderai de numéroter les questions pour s’y référer plus facilement.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/guide_entretien1.png&quot; alt=&quot;Une guide d&#39;entretien avec cinq catégories de questions numérotées, on y retrouve des blocs tels que l&#39;identité de la personne interviewée, un moderato pour donner des consignes à l&#39;intervieweur, un corps de questions rangées par catégories et à enbranchements&amp;quot;&quot;&gt;&lt;figcaption&gt;Guide d’entretien orienté ‘visuel’ pour être approprié par un participant sans intervieweur&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/guide_entretien2.png&quot; alt=&quot;Une guide d&#39;entretien avec cinq catégories de questions numérotées, on y retrouve des blocs tels que l&#39;identité de la personne interviewée, un moderato pour donner des consignes à l&#39;intervieweur, un corps de questions rangées par catégories et à enbranchements&amp;quot;&quot;&gt;&lt;figcaption&gt;Guide d’entretien orienté ‘visuel’ pour être approprié par un participant sans intervieweur&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;exemple-de-questions-par-objectif&quot; tabindex=&quot;-1&quot;&gt;Exemple de questions par objectif&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Comprendre le contexte&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Processus d’activité dans lesquelles la personne joue un rôle&lt;/li&gt;
&lt;li&gt;Informations et outils utilisés&lt;/li&gt;
&lt;li&gt;Choses que la personne produit&lt;/li&gt;
&lt;li&gt;Décisions dont la personne est responsable&lt;/li&gt;
&lt;li&gt;Interlocuteurs quotidiens / hebdomadaire&lt;/li&gt;
&lt;li&gt;Difficultés auxquelles la personne fait face&lt;/li&gt;
&lt;li&gt;Séquences d’évènement pour aboutir à un résultat&lt;/li&gt;
&lt;li&gt;Liens nécessaires pour que le système fonctionne&lt;/li&gt;
&lt;li&gt;Demander un “tour”: organisation, outil, rituel, ou processus qui affecte la perspective du participant&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Comprendre les tâches&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Quelles sont toutes les choses que tu dois faire pour accomplir …”&lt;/li&gt;
&lt;li&gt;“Montre moi les étapes, pour accomplir…”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Identifier les problèmes et pain points&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Comment ce problème t’impact toi ?”&lt;/li&gt;
&lt;li&gt;”Comment as-tu réussi à résoudre / contourner ce problème ?”&lt;/li&gt;
&lt;li&gt;“Quelle est la chose la plus difficle / frustrante à propos de …”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Se rappeler du passé / anticiper le futur&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Si tu essaies de te rappeler cette situation où tu…, qu’as-tu fait ?”&lt;/li&gt;
&lt;li&gt;“Décrit moi la situation idéale…”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Représenter&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Demander à la personne de dessiner le processus pour l’expliquer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Se projeter/réagir&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Qu’en dirais tes collègues ?”&lt;/li&gt;
&lt;li&gt;“La semaine dernière j’ai interviewé des personnes qui ont dit … Que penses-tu de cette idée / que ressens-tu à propos de cette approche ?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;am%C3%A9lioration-continue-du-guide-d%E2%80%99entretien&quot; tabindex=&quot;-1&quot;&gt;Amélioration continue du guide d’entretien&lt;/h3&gt;
&lt;p&gt;A partir du constat issu des interviews précédentes, on affine le guide d’entretien.&lt;/p&gt;
&lt;h3 id=&quot;a-proscrire&quot; tabindex=&quot;-1&quot;&gt;A proscrire&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Multiples questions imbriquées dans une question : le participant aura tendance à ne répondre qu’à la dernière question&lt;/li&gt;
&lt;li&gt;Recommandations / exposition de point de vue dans une question&lt;/li&gt;
&lt;li&gt;Enchaîner les “pourquoi ?” peut être mal reçu par la personne, pour atteindre le même but on peut plutôt dire “Qu’essaies-tu d’atteindre quand tu…?” or “Peux-tu expliquer la raison/valeur de …?”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pendant-l%E2%80%99entretien&quot; tabindex=&quot;-1&quot;&gt;Pendant l’entretien&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Il est préférable de prendre les notes sur papier pour la vélocité de prise de note et pour éviter l’effet “barrière” d’un l’ordinateur ouvert entre l’intervieweur et l’interviewé&lt;/li&gt;
&lt;li&gt;Pour un entretien en physique : se placer de biais et non face à la personne permet d’éviter des souvenirs implicites d’entretiens liés à un niveau hiérarchique, on veut plutôt créer implicitement une atmosphère propice à la discussion&lt;/li&gt;
&lt;li&gt;Orienter l’échange sur des exemples réels, éviter de se demander comment les choses “devraient” être&lt;/li&gt;
&lt;li&gt;Ne pas donner de recommandations lorsque l’on essaie de rebondir sur la réponse donnée par le participant&lt;/li&gt;
&lt;li&gt;Lors d’un entretien, il est facile d’avoir l’impression que l’on comprend tout ce que l’on entend. Essayer de challenger dans son esprit les éléments partagés par l’interviewé permet de creuser en profondeur : “Sais-je pourquoi la personne dit cela ?” “Que veut dire exactement la personne quand elle me dit ça ?”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;en-introduction&quot; tabindex=&quot;-1&quot;&gt;En introduction&lt;/h3&gt;
&lt;p&gt;Dire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le contexte de la mission&lt;/li&gt;
&lt;li&gt;Rappeler l’objectif de l’entretien et sa durée&lt;/li&gt;
&lt;li&gt;Que la personne est en contrôle de l’entretien, donc si elle préfère ne pas répondre à une question, prendre une pause à n’importe quel moment ou ne souhaite plus participer, elle le peut&lt;/li&gt;
&lt;li&gt;Comment l’information captée sera utilisée&lt;/li&gt;
&lt;li&gt;Informer le participant de mon niveau de connaissance de son activité : périmètre de connaissance de ce qu’il produit…&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;en-fin-d%E2%80%99entretien&quot; tabindex=&quot;-1&quot;&gt;En fin d’entretien&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Remercier pour le temps passé et rappeler la valeur de la contribution de la personne&lt;/li&gt;
&lt;li&gt;Demander s’il y a quelque chose que la personne aimerait ajouter et si la personne souhaite poser des questions sur le projet en cours&lt;/li&gt;
&lt;li&gt;Demander si la personne est d’accord pour être contactée a posteriori pour des demandes de précision&lt;/li&gt;
&lt;li&gt;Demander un retour à chaud sur l’entretien&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;post-entretien&quot; tabindex=&quot;-1&quot;&gt;Post-entretien&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Envoyer le CR à la personne à l’issu de l’entretien en mentionnant le fait de rester disponible pour des demandes de modification&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://stephaniewalter.design/blog/a-cheatsheet-for-user-interview-and-follow-ups-questions/&quot;&gt;https://stephaniewalter.design/blog/a-cheatsheet-for-user-interview-and-follow-ups-questions/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2020/06/user-interview-questions/&quot;&gt;https://www.smashingmagazine.com/2020/06/user-interview-questions/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://guides.18f.org/methods/discover/stakeholder-and-user-interviews/&quot;&gt;https://guides.18f.org/methods/discover/stakeholder-and-user-interviews/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://digital.gov/guides/hcd/discovery-concepts/plan-research#content-start&quot;&gt;https://digital.gov/guides/hcd/discovery-concepts/plan-research#content-start&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gov.uk/service-manual/user-research/using-in-depth-interviews&quot;&gt;https://www.gov.uk/service-manual/user-research/using-in-depth-interviews&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vaughtan.org/betterinterviews&quot;&gt;https://vaughtan.org/betterinterviews&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mazedesign.notion.site/dd213d94bcf046738434f93ce8152ab6?v=d05d4225bd8142dbb990e047e6d2ab24&quot;&gt;https://mazedesign.notion.site/dd213d94bcf046738434f93ce8152ab6?v=d05d4225bd8142dbb990e047e6d2ab24&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>La propagande publique pour faire renaître le tourisme dans la France d&#39;après-guerre</title>
    <link href="https://www.teotimepacreau.fr/blog/affiches-services-publics/" />
    <updated>2026-02-01T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/affiches-services-publics/</id>
    <content type="html">&lt;p&gt;Comment donner envie, après une Seconde Guerre Mondiale dévastatrice, aux touristes étrangers de (re)venir découvrir la France ?&lt;/p&gt;
&lt;p&gt;En 1946, un Commissariat Général au Tourisme est reconstitué qui deviendra deux ans plus tard la Direction Générale du Tourisme. L’administration centrale du tourisme est notamment chargée de la promotion du tourisme et de la publicité touristique française. Elle prend en charge la publicité régionale, nationale et internationale (affiches, radio, télévision, presse). À partir de 1988, les actions de promotion sont regroupées au sein d’un groupement d’intérêt économique (GIE) “Maison de la France” traduisant la volonté de partenariat entre l’État, les collectivités territoriales et les professionnels du tourisme.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;undefined&quot;&gt;Après la Seconde Guerre mondiale, le développement du tourisme en France commence à prendre une importance majeure, en lien avec les différents plans d’aménagement du territoire. Le pays cherche à se reconstruire, à rétablir son économie et à attirer le plus de touristes étrangers possible sur son territoire. Dans ce cadre est lancée une politique de propagande touristique massive, organisée par l’État. J’emploie le terme de « propagande » puisque c’est celui qui utilisé à l’époque, sans la connotation péjorative d’aujourd’hui.
L’implication de l’État dans le domaine du tourisme a été tardive et s’est surtout exprimée après la Seconde Guerre mondiale.
Un décret du 19 juin 1959 mentionne spécifiquement, parmi les missions générales du Commissariat général au Tourisme, la coordination de la propagande touristique dans le but de « faire connaître les réalisations françaises de tous ordres, qu’elles soient artistiques, scientifiques, techniques ou sociales ».
La couleur prend une part de plus en plus importante dans les photographies car, selon une étude de 1968 sur la propagande aux États-Unis, les affiches en couleur constituent là-bas le seul moyen de publicité, l’américain étant très conditionné dans sa vie quotidienne par l’image en couleur. Cette étude estime qu’un américain ne regarderait même pas une affiche qui serait en noir et blanc.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;LIENHARD Anne-Sophie. &lt;a href=&quot;https://www.inventerlegrandparis.fr/seminaire-igp/seminaire-igp-2021-2022/les-visions-de-la-construction-metropolitaine/la-propagande-du-grand-paris-dans-le-fonds-de-la-phototheque-du-tourisme-conservee-aux-archives-nationales-1940-1970/&quot;&gt;&lt;/a&gt;&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Voici un florilège d’affiches produites par la Direction Générale du Tourisme qui avaient pour but de faire connaître les destinations françaises auprès de touristes étrangers, séléctionnées et rassemblées pour comprendre ce que l’Etat mettait en avant selon les périodes pour attirer les touristes étrangers. Le tout chiné sur le site des &lt;a href=&quot;https://www.siv.archives-nationales.culture.gouv.fr&quot;&gt;archives nationales&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;la-mise-en-avant-du-patrimoine-religieux&quot; tabindex=&quot;-1&quot;&gt;La mise en avant du patrimoine religieux&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-91.jpg&quot; alt=&quot;Une affiche en noir et blanc contenant la photo du visage d&#39;une sculpture de Moïse occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;Dijon le puits de Moïse, direction générale du tourisme&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/91; photo de ADANI, 1952, affiche de promotion du tourisme pour Dijon&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-197.jpg&quot; alt=&quot;Une affiche en noir et blanc contenant la photo du visage d&#39;une sculpture du prophète Isaïe occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;l&#39;abbatiale de Moissac, le prophète Isaïe 11ème siècle, Tarn-et-Garonne, direction générale du tourisme&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/197; photo de Jean DIEUZAIDE, 1955, affiche de promotion du tourisme pour l’abbatiale de Moissac&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-196.jpg&quot; alt=&quot;Une affiche en noir et blanc contenant la photo du visage d&#39;une sculpture d&#39;une nonne catholique occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;cathédrale de Rodez, 15ème siècle, direction générale du tourisme&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/196; photo de ADANI, 1955, affiche de promotion du tourisme pour la cathédrale de Rodez&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-27.jpg&quot; alt=&quot;Une affiche en noir et blanc contenant la photo d&#39;une sculpture représentant la fuite de Joseph, Marie et Jésus en Egypte occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;l&#39;art roman - Bourgogne - Autun, 12ème siècle, direction générale du tourisme&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/27; photo de Jean ROUBIER, 1956, affiche de promotion du tourisme pour la Cathédrale Saint-Lazare à Autun&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;la-mise-en-valeur-du-patrimoine-architectural&quot; tabindex=&quot;-1&quot;&gt;La mise en valeur du patrimoine architectural&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-26.jpg&quot; alt=&quot;Une affiche en noir et blanc contenant la photo de la façade des hospices de Beaune occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;Bourgogne - les hospices de Beaune - cote d&#39;or, commissariat général du tourisme&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/26; photo de SAUVAGEOT, 1948, affiche de promotion du tourisme pour les hospices de Beaune&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-83.jpg&quot; alt=&quot;Une affiche contenant la photo du château de Chenonceau occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;chateaux de la Loire - Chenonceau&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/83; photo de Patrice MOLINARD, 1951, affiche de promotion du tourisme pour le chateau de Chenonceau&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-107.jpg&quot; alt=&quot;Une affiche contenant la photo du pont Valentre de Cahors occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;pont Valentre de Cahors, 14ème siècle, direction générale du tourisme&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/107; photo de Jean DIEUZAIDE, 1952, affiche de promotion du tourisme pour le pont Valentre de Cahors&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-163.jpg&quot; alt=&quot;Une affiche contenant la photo de la cathédrale de Strasbourg vue depuis les toîts des maisons traditionnelles Alsacienne occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;la cathédrale de Strasbourg&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/163; photo de NICOLAS, 1954, affiche de promotion du tourisme pour la cathédrale de Strasbourg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;les-paysages-naturels&quot; tabindex=&quot;-1&quot;&gt;Les paysages naturels&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-213.jpg&quot; alt=&quot;Une affiche contenant la photo d&#39;un promontoire rocheux habité donnant sur la Dordogne occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;Perigord route de la vallée de la Dordogne Beynac&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/213; photo de C.A.E.L. YUREK-J. DELMAS, 1955, affiche de promotion du tourisme pour la Dordogne&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-44.jpg&quot; alt=&quot;Une affiche, la photo d&#39;un vignoble de Champagne occupe les deux tiers de l&#39;affiche, le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;le vignoble de Champagne&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/44; photo de MACHATSCHEK, 1956, affiche de promotion du tourisme pour la Champagne&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-3.jpg&quot; alt=&quot;Une affiche contenant la photo du port des Sables d&#39;Olonne avec les bateaux; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;cotes de Vendée - les Sables d&#39;Olonne&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/3; photo de BOULAS, 1956, affiche de promotion du tourisme pour les Sables d’Olonne&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-301.jpg&quot; alt=&quot;Une affiche contenantla photo de moutons qui paturent, un village, surplombé d&#39;une montagne enneigée; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;le printemps en Roussillon&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/301; photo de DELMAS, 1958, affiche de promotion du tourisme pour le Roussillon&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-112.jpg&quot; alt=&quot;Une affiche contenant la photo d&#39;un train rouge sur un chemin de fer vers le Mont Blanc enneigé; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;le printemps en Roussillon&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/112; photo de LAMBERT, 1958, affiche de promotion du tourisme pour le Mont Blanc&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;les-grands-projets-d%E2%80%99infrastructures-des-ann%C3%A9es-1950-et-l%E2%80%99urbanisation&quot; tabindex=&quot;-1&quot;&gt;Les grands projets d’infrastructures des années 1950 et l’urbanisation&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050331-65.jpg&quot; alt=&quot;Une affiche contenant la photo aérienne du barrage de Sarrans et un collage d&#39;hortonsphères de butane; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;See her industrial achievements&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050331/65; photo de Emeric FEHER &amp;amp; Henry LACHEROY, sans date, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-124.jpg&quot; alt=&quot;Une affiche contenant une photo aérienne d&#39;une autoroute neuve; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;autoroutes de l&#39;Ouest&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/124; photo de PARIS MATCH-JARNOUX, 1953, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-227.jpg&quot; alt=&quot;Une affiche contenant la photo du centre de télécommunications spatiales de Plemeur-Bodou; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;cotes de Vendée - les Sables d&#39;Olonne&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/227; photo de VIGUIER, 1962, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-262.jpg&quot; alt=&quot;Une affiche contenant la photo du remblai des Sables d&#39;Olonne avec en fond la plage et la mer; le mot &amp;quot;France&amp;quot; apparaît en dessous en grandes lettres capitales puis en plus petit est inscrit &amp;quot;cotes de Vendée - les Sables d&#39;Olonne&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/262; photo de BOULAS, 1956, affiche de promotion du tourisme pour les Sables d’Olonne&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;la-s%C3%A9rie-sp%C3%A9ciale-ch%C3%A2teaux-avec-une-typographie-d%C3%A9di%C3%A9e-pour-l%E2%80%99occasion&quot; tabindex=&quot;-1&quot;&gt;La série spéciale châteaux avec une typographie dédiée pour l’occasion&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-264.jpg&quot; alt=&quot;Une affiche contenant une photo de la vue intérieure d&#39;un salon du château de Montgeoffroy; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;château de Montgeoffroy - Val de Loire - Maine et Loire&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/264; photo de Jacqueline HYDE, 1965, affiche de promotion du tourisme pour le château de Montgeoffroy&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-267.jpg&quot; alt=&quot;Une affiche contenant une photo de la vue intérieure d&#39;un salon du château de Carrouges; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;château de Carrouges - Normandie - Orne&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/267; photo de MOITTET, 1965, affiche de promotion du tourisme pour le château de Carrouges&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050042-280.jpg&quot; alt=&quot;Une affiche contenant une photo de la chambre à coucher de George Sand à Nohant; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;la maison de George Sand - Indre - Nohant&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050042/280; photo de Jacqueline HYDE, 1966, affiche de promotion du tourisme pour le château de Nohant&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;une-s%C3%A9rie-sp%C3%A9ciale-%E2%80%9Csports-et-nature%E2%80%9D-dans-les-ann%C3%A9es-1970&quot; tabindex=&quot;-1&quot;&gt;Une série spéciale “Sports et Nature” dans les années 1970&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-450.jpg&quot; alt=&quot;Une affiche contenant une photo d&#39;un chasseur et son chien dans une forêt; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;Sports et nature&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/450; photo de CHANTELAT, 1974, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-439.jpg&quot; alt=&quot;Une affiche contenant une photo d&#39;un homme qui fait de la pêche sous-marine; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;Sports et nature&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/439; photo de ANNUNZIATA, 1974, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-435.jpg&quot; alt=&quot;Une affiche contenant une photo d&#39;une course de side-cars en terrain accidenté; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;Sports et nature&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/435; photo de BUSSY-EXPLORER, 1974, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;une-s%C3%A9rie-mettant-en-valeur-l%E2%80%99artisanat-dans-les-ann%C3%A9es-1970&quot; tabindex=&quot;-1&quot;&gt;Une série mettant en valeur l’artisanat dans les années 1970&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-445.jpg&quot; alt=&quot;Une affiche contenant une photo d&#39;un homme entrain de meuler; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;Artisans de France&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/445; photo de Leonard DE SELVA, 1974, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-446.jpg&quot; alt=&quot;Une affiche contenant une photo d&#39;un vannier fabriquant des paniers en osier; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;Artisans de France&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/446; photo de Leonard DE SELVA, 1974, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/affiches_service_public/20050205-443.jpg&quot; alt=&quot;Une affiche contenant une photo d&#39;un tisserand dans son atelier; le mot &amp;quot;France&amp;quot; apparaît en dessous puis en plus petit est inscrit &amp;quot;Artisans de France&amp;quot;&quot;&gt;&lt;figcaption&gt;Archives nationales de France; cote 20050205/443; photo de Leonard DE SELVA, 1974, affiche de promotion du tourisme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.siv.archives-nationales.culture.gouv.fr/&quot;&gt;https://www.siv.archives-nationales.culture.gouv.fr/&lt;/a&gt;
&lt;a href=&quot;https://www.inventerlegrandparis.fr/seminaire-igp/seminaire-igp-2021-2022/les-visions-de-la-construction-metropolitaine/la-propagande-du-grand-paris-dans-le-fonds-de-la-phototheque-du-tourisme-conservee-aux-archives-nationales-1940-1970/&quot;&gt;https://www.inventerlegrandparis.fr/seminaire-igp/seminaire-igp-2021-2022/les-visions-de-la-construction-metropolitaine/la-propagande-du-grand-paris-dans-le-fonds-de-la-phototheque-du-tourisme-conservee-aux-archives-nationales-1940-1970/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Les emails Kobold</title>
    <link href="https://www.teotimepacreau.fr/blog/emails_kobold/" />
    <updated>2026-01-07T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/emails_kobold/</id>
    <content type="html">&lt;p&gt;Vous venez de recevoir un email transféré par votre manager, dans ce mail un client vous demande de déposer le livrable sur lequel vous travaillez sur un lien.&lt;/p&gt;
&lt;p&gt;Vous êtes sensibilisé à la protection d’informations donc vous appelez votre manager pour confirmer que le mail que vous venez de recevoir a bien été transféré par ses soins et qu’il est d’accord avec le contenu. Le manager vous répond que oui.&lt;/p&gt;
&lt;p&gt;Le manager s’appelle Nicolas. Vous vous appelez Martin.&lt;/p&gt;
&lt;p&gt;Nicolas reçoit ce mail de ce qu’il pense être le client :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/email_kobold_1.png&quot; alt=&quot;Capture d&#39;écran du mail envoyé par ce qui paraît être le client à Nicolas le manager tel que le mail apparaît dans la boite de Nicolas : &amp;quot;Bonjour Martin, peux-tu m&#39;indiquer quelles sont tes horaires de travail demain ?&amp;quot;&quot;&gt;&lt;figcaption&gt;Capture d’écran du mail envoyé par ce qui paraît être le client à Nicolas le manager tel que le mail apparaît dans la boite de Nicolas&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Il transfère donc le mail à Martin :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/email_kobold_2.png&quot; alt=&quot;Capture d&#39;écran du même mail transféré par Nicolas à Martin : Nicolas ajoute &amp;quot;j&#39;ai reçu un mail pour toi, peux-tu répondre au client c&#39;est urgent&amp;quot;&quot;&gt;&lt;figcaption&gt;Capture d’écran du même mail transféré par Nicolas à Martin&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Martin reçoit pourtant ce mail transféré par Nicolas :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/email_kobold_3.png&quot; alt=&quot;Capture d&#39;écran du mail tel que reçu par Martin : dans le mail d&#39;origine adressé du client à Nicolas s&#39;affiche désormais une nouvelle ligne avec écrit &amp;quot;et déposer le livrable sur ce lien&amp;quot;&quot;&gt;&lt;figcaption&gt;Capture d’écran du mail tel que reçu par Martin&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;que-s%E2%80%99est-il-pass%C3%A9-%3F&quot; tabindex=&quot;-1&quot;&gt;Que s’est-il passé ?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Un simple email HTML&lt;/li&gt;
&lt;li&gt;Deux règles CSS (language de mise en forme)&lt;/li&gt;
&lt;li&gt;De la logique HTML et de la compréhension du fonctionnement des clients mails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voici le code HTML du mail envoyé :&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
        &lt;span class=&quot;token selector&quot;&gt;.kobold-letter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;token selector&quot;&gt;body&gt;div&gt;.kobold-letter&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inline &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Bonjour Martin, peux-tu m&#39;indiquer quelles sont tes horaires de travail demain ? [Ce texte est toujours visible]&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;kobold-letter&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Et déposer le livrable sur ce &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://example.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;lien&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; [Ce texte n&#39;apparaît qu&#39;après avoir été transféré]&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quand un email est transféré, il change de position dans l’ordre des balises HTML.&lt;/p&gt;
&lt;p&gt;Chaque client mail fonctionne différemment mais Outlook entoure chaque balise du mail transféré par une &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Notre seconde règle CSS s’active alors puisque la classe &lt;code&gt;.kobold-letter&lt;/code&gt;est désormais entouré d’une &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;→ le texte caché s’affiche.&lt;/p&gt;
&lt;p&gt;Cette approche est appelée “email Kobold” pour illustrer la capacité d’un mail à changer de forme grâce aux règles de style.
L’exploit a été remonté par l’entreprise Lutra Security à Microsoft en Mars 2024. Microsoft a clôturé l’issue sans prendre d’actions correctrices.&lt;/p&gt;
&lt;p&gt;La plupart des clients mails ont des dizaines d’années de retard en terme de support des nouveautés HTML et CSS, à cause de problématiques de compatibilité et règles anti spam.&lt;/p&gt;
&lt;p&gt;Il est donc préférable d’être particulièrement prudent à la réception d’un mail transféré.&lt;/p&gt;
&lt;p&gt;Pour en savoir plus et comprendre l’impact de l’exploit sur les autres clients mail : &lt;a href=&quot;https://lutrasecurity.com/en/articles/kobold-letters/&quot;&gt;l’article de Lutra Security&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>L&#39;expérience Wavestone</title>
    <link href="https://www.teotimepacreau.fr/blog/experience-wavestone/" />
    <updated>2026-01-04T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/experience-wavestone/</id>
    <content type="html">&lt;p&gt;Wavestone est un cabinet de conseil Français, anciennement Solucom. Retour sur mon expérience en tant qu’analyst en CDI.&lt;/p&gt;
&lt;h2 id=&quot;le-processus-de-recrutement&quot; tabindex=&quot;-1&quot;&gt;Le processus de recrutement&lt;/h2&gt;
&lt;p&gt;Juillet 2024, S. de Wavestone me propose de me coopter pour un CDI en tant que consultant chez Wavestone suite à un ajout LinkedIn. S. m’explique qu’il y a 3 gradations pour les positions de consulting : analyst, consultant, senior consultant; elle considère que 2 années d’expérience dans le secteur en alternance permettent d’entrer sur une position de consultant.&lt;/p&gt;
&lt;p&gt;30 minutes d’échange téléphonique RH avec A. de Wavestone qui me demande de lui présenter mon parcours, ma compréhension des missions et les valeurs affichées par Wavestone. La rémunération dépend de l’école dont le diplôme est issu. Les écoles sont classifiées par Wavestone de D à A. Mon école est considérée comme étant de rang D. Il m’annonce une rémunération de 36k€ brut par an. J’indique à A. que les conditions ne sont pas réunies pour que je candidate.&lt;/p&gt;
&lt;p&gt;Janvier 2025, je décide de candidater. S. me coopte. S’en suit un nouvel échange téléphonique demandé par A. pour répéter les mêmes choses qu’en Juillet 2024. Trois entretiens “officiels” d’embauche successifs me sont demandés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le premier entretien d’embauche avec un.e Consultant.e junior est une formalité : questions de base sur le parcours, la posture, la vision du conseil, réciter les valeurs Wavestone et ma compréhension de l’entreprise. La personne me valide suite à l’entretien.&lt;/li&gt;
&lt;li&gt;le second entretien avec un.e manager : questions sur le parcours, la posture, la vision du conseil, &lt;em&gt;qu’est-ce qui me pousse à candidater&lt;/em&gt;, trois mises en situation visant à comprendre mes réactions face à des situations de conseil complexes. Il m’est expliqué que je dois préparer un business case visant à répondre via des slides à une problématique qui me sera posée en amont, je dois présenter en 10 minutes le business case lors du prochain entretien. La personne me valide suite à l’entretien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La problématique qui m’est posée pour le business case : “En tant que DSI, puis-je concilier les enjeux de développement de l’usage de l’IA pour les métiers et les enjeux numérique responsable du SI ?”&lt;/p&gt;
&lt;p&gt;Voici le business case que j’ai produit pour répondre à la problématique :&lt;/p&gt;
&lt;embed src=&quot;https://www.teotimepacreau.fr/img/business_case_wavestone.pdf&quot; width=&quot;100%&quot; height=&quot;500px&quot; type=&quot;application/pdf&quot;&gt;
&lt;p&gt;Troisième et dernier entretien avec le directeur de l’agence Wavestone dans ma ville de province. Il me laisse dérouler la présentation puis pose des questions d’approfondissement et de contradictions dans le rôle du client. Il sort du rôle de client pour m’indiquer que le design visuel est trop simpliste pour lui et exprime des doutes sur mes capacités de design. S’en suit des questions sur le parcours, la posture, la vision du conseil, &lt;em&gt;qu’est-ce qui me pousse à candidater&lt;/em&gt;, &lt;em&gt;qu’est-ce qui justifie ma motivation&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Une semaine après le troisième entretien, A. m’annonce que je suis validé pour le poste, il me fait une proposition de salaire désormais à 35540€ brut au lieu des 36000€ annoncés pour un démarrage un mois et demi plus tard fin Avril 2025 : 34000€ pour mon diplôme et 1540€ pour mes 2 années d’expérience en alternance. Quatre mois de période d’essai renouvelable une fois. Je rentre en CDI en tant qu’&lt;em&gt;analyst&lt;/em&gt; et aucune marge de manoeuvre pour honorer la promesse faite par S. pour que j’entre en tant que &lt;em&gt;consultant&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Je découvre une semaine après en parcourant le contrat de travail qui vient de m’être adressé que les 35540€ sont décomposés en une rémunération fixe annuelle de 34470€ et 800€ brut de prime de vacances “susceptible d’évoluer” (à traduire par “annulable en cas de mauvais résultats pour l’entreprise”).&lt;/p&gt;
&lt;h2 id=&quot;l%E2%80%99int%C3%A9gration&quot; tabindex=&quot;-1&quot;&gt;L’intégration&lt;/h2&gt;
&lt;p&gt;Jour 1 : une marraine m’est indiquée pour répondre à toute mes questions d’ordre pratique liées aux outils de travail. Le point de validation de période d’essai à mois +3 est déjà positionné dans mon agenda par les RH.
Dans la semaine suivant mon arrivée un &lt;em&gt;Career Development Manager (CDM)&lt;/em&gt;, N., m’est assigné : c’est le manager au sens RH du terme qui se prononce sur chaque étape de la carrière dont la validation de la période d’essai. Le CDM manage une petite dizaine de personnes et se fie uniquement aux feedbacks remontés par les chefs de projet.&lt;/p&gt;
&lt;p&gt;Les personnes sans activité doivent partager sur un canal Teams, dont les 150 collaborateurs de l’agence sont destinataires, leur disponibilité pour prêter main forte. Les consultants peuvent librement demander aux personnes qui ont partagées un message de disponibilité de l’appui pour réaliser, sans avoir à avertir un manager.
Les appuis se font de gré à gré et peuvent prendre toutes les formes : aide pour la constitution d’une proposition commerciale, analyse de documents pour une mission en cours, préparation de livrables, actions de développement commercial…&lt;/p&gt;
&lt;p&gt;Entre Avril et Mai 2025 nous sommes une dizaine à être nouvel arrivant : 9 stagiaires et moi en CDI.&lt;/p&gt;
&lt;p&gt;A semaine +3 j’échange avec une personne arrivée en Janvier 2025 en CDI : J. est ingénieur informatique diplômé, il a 3 ans d’expérience en alternance dans un grand groupe privé client de Wavestone. Il a l’air sérieux et professionnel. J. m’indique que sa période d’essai vient d’être arrêté par Wavestone, il doit quitter l’entreprise à l’issu du délai légal.
Au vu de son profil plus cappé que le mien, je commence à saisir la politique actuelle de traitement des périodes d’essai.&lt;/p&gt;
&lt;p&gt;Wavestone met 2 mois entiers à me staffer sur une mission, auparavant je multiplie donc les appuis auprès d’autres consultants, j’appuie quotidiennement sur toutes sortes de tâches : parmis la dizaine d’appui que j’ai pu exercer, la constitution d’un support interne de Knowledge Management relatif à une méthode e&amp;quot; sécurisation de l’Active Directory via un modèle de tiering, en partant de plusieurs missions menées par le cabinet et de supports de connaissance internes.
Il m’est demandé de réaliser le support sur PowerPoint. J’oriente la présentation autour de la &lt;a href=&quot;https://www.cert.ssi.gouv.fr/uploads/ad_checklist.html&quot;&gt;checklist de sécurisation AD recommandée par l’ANSSI&lt;/a&gt;, rappel de l’existence des scripts Powershell HardenAD, méthode en trois partie pour mener des ateliers de personnalisation du tiering prélable à la mise en place du tiering puis définition de plans de contrôle et résilience.&lt;/p&gt;
&lt;h2 id=&quot;feedback%2C-feedback-%26-culte-du-feedback&quot; tabindex=&quot;-1&quot;&gt;Feedback, feedback &amp;amp; culte du feedback&lt;/h2&gt;
&lt;p&gt;Dès la première rencontre avec N. le CDM : celui-ci explique la place centrale du &lt;em&gt;feedback&lt;/em&gt;. Il est impératif de récolter les feedbacks des différentes personnes pour lesquelles je mène des tâches. Il faut demander un feedback même quand la tâche dure une demi-journée. &lt;em&gt;Le process dans le process donc&lt;/em&gt;. La valeur ajoutée pour le client ? Oubliée. Cela mène à des situations ubuesques avec des feedbacks pour la formalisation de quatre slides. La valeur d’un consultant dépend-elle vraiment de l’alignement de trois blocs d’organigramme ?&lt;/p&gt;
&lt;p&gt;Dès le premier point de suivi avec N., celui-ci me lit les feedbacks des personnes auprès desquels j’ai effectué des tâches d’appui. Les défauts repérés sont particulièrement mis en avant au détriment des points positifs.&lt;/p&gt;
&lt;p&gt;Je bataille donc pour récupérer les feedbacks auprès de mes chefs de projet, parfois avec une semaine de relance. Je consigne donc tous les feedbacks, et update dès que possible mon &lt;em&gt;CDM&lt;/em&gt; sur mes avancements et mes next steps pour donner de la visibilité et montrer mon sérieux. Je m’auto-évalue à partir des compétences demandées par l’organisation pour un rôle d’analyst.&lt;/p&gt;
&lt;h2 id=&quot;staffing&quot; tabindex=&quot;-1&quot;&gt;Staffing&lt;/h2&gt;
&lt;p&gt;Je suis donc staffé au bout de deux mois, sur une étude d’intégration organisationnelle relative à l’internalisation de ressources DevOps pour la filiale d’une grande banque Française. Très concrètement, il faut produire un PowerPoint de 75 slides et le livrer au client en un mois. J’assiste pendant un mois la cheffe de projet positionnée sur la mission et passe donc &lt;em&gt;un mois entier sur le logiciel PowerPoint à préparer des slides&lt;/em&gt;. &lt;em&gt;Rêves de PowerPoint la nuit ?&lt;/em&gt;. Suites aux ateliers que l’on mène visant à chiffrer les économies projetées, élaborer une stratégie de transition et de transfert de connaissances, je consolide toutes les notes que je prends pendant les ateliers en slides communicables au client.
L’exigence pour la production de slides “parfaites” est réelle, et sûrement justifiée par rapport aux interlocuteurs de la banque. Néammoins l’analyse du travail que je produis par la cheffe de projet est uniquement basée sur un idéal de perfection : chaque slide doit parfaitement coller à l’idée (non annoncée) que se fait la cheffe de projet. Il n’y a aucune marge de manoeuvre, je suis repris sur des couleurs, des tournures de phrase et des alignements de pixels non perceptibles par le cliet pendant toute la durée de la mission. Je colle pourtant à toutes les deadlines qui me sont demandées, je suis force de proposition et j’essaie d’aller plus loins que les demandes du client et mes slides sont de qualité mais cela ne suffit pas pour la cheffe de projet. &lt;em&gt;Le process dans le process une fois de plus, où est la valeur ajoutée pour le client ?&lt;/em&gt;
Le livrable est remis au client au bout d’un mois, comme prévu. Retours positifs du client, il m’est évoqué la possibilité de continuer sur la mission si suite il y a, mais nous sommes fin Juin 2025 donc pause estivale. Les éléments de feedback positifs qui me sont présentés sont occultés par le CDM par le peu d’éléments négatifs perçus.&lt;/p&gt;
&lt;p&gt;Puis je suis staffé pour contribuer à une étude d’opportunité d’adoption du multi-cloud pour un grand groupe agro-alimentaire : élaboration d’une gouvernance structurant l’adoption du cloud, stratégie et enjeux multi-cloud &amp;amp; multi-tenant. Cette fois, je dois examiner une centaine du supports internes consolidant des missions cloud réalisées par Wavestone; pour produire par la suite une trentaine de slides, le tout entièrement en anglais.
Je fournis des slides de qualité, avec de la profondeur et une vraie méthodologie. Le chef de projet m’exprime un &lt;em&gt;feedback&lt;/em&gt; totalement contraire à la précédente mission : cette fois la mise en forme et les tournures de phrases sont parfaites mais je crée “à partir de zéro” trop de slides et je ne copie colle pas assez de slides existantes, le chef de projet exprime des doutes sur ma &lt;em&gt;productivité&lt;/em&gt; pour le long terme alors que tous les rendus sont en avance par rapport aux deadlines.&lt;/p&gt;
&lt;h2 id=&quot;p%C3%A9riode-d%E2%80%99essai&quot; tabindex=&quot;-1&quot;&gt;Période d’essai&lt;/h2&gt;
&lt;p&gt;Le 18 Juillet 2025 vient mon point de validation de période d’essai fixé de longue date : j’ai consigné l’ensemble des feedbacks récoltés pendant tous les appuis et missions, préparé un argumentaire pour prouver mes améliorations sur les points négatifs qui m’ont été retournés et pour mettre en avant mes points forts. Je n’ai pas le luxe de pouvoir présenter ces éléments : N., le &lt;em&gt;CDM&lt;/em&gt; m’annonce d’emblée, dès les premières minutes d’entretien, que le directeur de l’agence et lui ont décidés de mettre fin à ma période d’essai. Me sont soulevés les points de feedback négatif. Je creuse, au vu du contexte de sous-staffing observé depuis mon arrivée et des éléments partagés à l’oral par le directeur de l’agence lors de l’afterwork de Juin 2025, je cite “l’OCDE prévoit un contexte économique très dégradé, Numeum (l’un des syndicat de la convetion collective des activités de conseil Syntec) prévoit -2.5% pour les activités de conseil en 2025. Il est décidé d’échelonner les arrivées à partir de Septembre et de &lt;em&gt;réviser&lt;/em&gt; le plan de recrutement”. J’exprime ces éléments au CDM qui les balaient.&lt;/p&gt;
&lt;p&gt;Je pense sincèrement avoir tout donné pendant ces 3 mois. Le manque d’humanité et le culte du &lt;em&gt;process dans le process&lt;/em&gt; fait froid dans le dos.&lt;/p&gt;
&lt;p&gt;Fin de période d’essai donc et direction le chômage. Même vécu que J. 3 mois auparavant, il n’y avait pas d’autres personnes nouvellement recrutées en CDI. &lt;em&gt;Engager la personne me précédant puis m’engager successivement pour briser de nouveau la période d’essai ? Une manière d’entrer un chiffre dans la case “recrutement” qui sera analysée par les quelques détenteurs d’action Wavestone qui lisent encore le rapport d’activité ?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;J’avais vu passer un tweet d’un actionnaire Wavestone qui exprimait qu’il s’agit d’une des seules entreprises où l’on peut ressentir à tous les étages le niveau d’exigence du PDG. Ou quand les couches d’exigences superposées forment un non-sens constant.&lt;/p&gt;
&lt;p&gt;L’ensemble de mes &lt;em&gt;feedback&lt;/em&gt; récoltés pendant les 3 mois, anonymisés :&lt;/p&gt;
&lt;embed src=&quot;https://www.teotimepacreau.fr/img/feedback_Wavestone.pdf&quot; width=&quot;100%&quot; height=&quot;500px&quot; type=&quot;application/pdf&quot;&gt;
&lt;h2 id=&quot;que-fait-concr%C3%A8tement-wavestone-%3F&quot; tabindex=&quot;-1&quot;&gt;Que fait concrètement Wavestone ?&lt;/h2&gt;
&lt;p&gt;Dans mon agence, les missions menées étaient en très grande partie organisationnelles : missions de transformation organisationnelle, accompagnement à l’agilité, accompagnement à l’implémentation de l’IA, mise en conformité NIS2, DORA. Il y a une petite partie de technique notamment sur quelques missions d’audit de cybersécurité mais ces missions restent marginales.
Wavestone est le partenaire officiel de Microsoft pour l’implémentation de leurs solutions Office, Copilot… en France.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Designer des tableaux clairs et efficaces</title>
    <link href="https://www.teotimepacreau.fr/blog/designer-des-tableaux-clairs-et-efficaces/" />
    <updated>2025-11-01T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/designer-des-tableaux-clairs-et-efficaces/</id>
    <content type="html">&lt;p&gt;Tout &lt;em&gt;&lt;a href=&quot;https://www.teotimepacreau.fr/essais/challenger-pratiques-transformation-organisationelle-par-le-design-de-services#:~:text=Le%20terme%20travailleur,Drucker%20%E2%80%98knowledge%20work%E2%80%99&quot;&gt;Knowledge Worker&lt;/a&gt;&lt;/em&gt; se retrouve régulièrement face à des tableurs et des tableaux. Pourtant on rencontre très, &lt;em&gt;trop&lt;/em&gt; fréquemment des tableaux qui rendent l’information encore plus complexe à appréhender que dans sa forme initiale.&lt;/p&gt;
&lt;h2 id=&quot;tableau-ou-graphique%2C-quelle-forme-pour-quel-usage-%3F&quot; tabindex=&quot;-1&quot;&gt;Tableau ou graphique, quelle forme pour quel usage ?&lt;/h2&gt;
&lt;p&gt;Avant de choisir une forme praticulière, il est nécessaire de raisonner en terme d’usage.&lt;/p&gt;
&lt;p&gt;Pour tous les sujets de visualisation de l’information, &lt;a href=&quot;https://www.edwardtufte.com/&quot;&gt;Edward Tufte&lt;/a&gt; est l’auteur de référence. Ses travaux de recherche avancés dans sa thèse “The Visual Display of Quantitative Information” ont posés un standard.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;en&quot;&gt;The conventional sentence is a poor way to show more than two numbers because it prevents comparisons within the data. [He illustrates with an example sentence] : “Nearly 53 percent of the type A group did something or other compared to 46 percent of B and slightly more than 57 percent of C.”
Arrange the type to facilitate comparisons, as in this text-table :&lt;br&gt;
Group A 53%&lt;br&gt;
Group B 46%&lt;br&gt;
Group C 57%&lt;br&gt;
There are nearly always better sequences than alphabetical, for example, ordering by content or by data values :&lt;br&gt;
Group B 46%&lt;br&gt;
Group A 53%&lt;br&gt;
Group C 57%&lt;br&gt;
Tables are preferable to graphics for many small data sets. A table is nearly always better than a dumb pie chart&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;TUFTE, Edward. &lt;a href=&quot;https://www.cs.rug.nl/svcg/uploads/VisualAnalytics/Tufte01-2.pdf&quot;&gt;&lt;em&gt;The Visual Display of Quantitative Information, SECOND EDITION&lt;/em&gt;&lt;/a&gt;. 2001&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://simplexct.com/data-ink-ratio-tables#:~:text=Tables%20are%20best%20suited%20for%20looking%20up%20precise%20values%2C%20comparing%20individual%20values%20or%20presenting%20values%20involving%20multiple%20units%20of%20measure.%20Graphs%2C%20on%20the%20other%20hand%2C%20are%20better%20for%20detecting%20trends%2C%20anomalies%20or%20relations&quot;&gt;Les tableaux sont plus adaptés pour présenter des valeurs, les comparer ou présenter des unités de mesure multiples. A contrario, les graphiques, sont plus adaptés pour démontrer les tendances, anomalies et relations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fr.wikipedia.org/wiki/Charlie_Munger&quot;&gt;Charlie Munger&lt;/a&gt;, le bras droit de Warren Buffet chez Berkshire Hathaway, a passé de nombreuses années à s’intéresser à &lt;a href=&quot;https://www.stripe.press/poor-charlies-almanack/talk-two?progress=9.33%25#:~:text=If%20you%20don%E2%80%99t%20get%20this%20elementary%2C%20but%20mildly%20unnatural%2C%20mathematics%20of%20elementary%20probability%20into%20your%20repertoire%2C%20then%20you%20go%20through%20a%20long%20life%20like%20a%20one%2Dlegged%20man%20in%20an%20ass%2Dkicking%20contest&quot;&gt;l’ancrage des concepts mathématiques dans les systèmes biologiques et psychologiques&lt;/a&gt;. Il explique que &lt;em&gt;les graphiques assemblent les nombres dans une forme qui ressemble au &lt;em&gt;mouvement&lt;/em&gt;. Cette représentation du mouvement nous accroche en faisant appel à nos sens primaires&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;en&quot;&gt;At any rate, mankind invented a system to cope with the fact that we are so intrinsically lousy at manipulating numbers. It’s called the graph. Oddly enough, it came out of the Middle Ages. It’s the only intellectual invention of the monks during the Middle Ages. I know of that’s worth a damn. The graph puts numbers in a form that looks like motion. So it’s using some of this primitive neural stuff in your system in a way that helps you understand it.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;MUNGER, Charlie. &lt;a href=&quot;https://www.stripe.press/poor-charlies-almanack/talk-three?progress=14.48%&quot;&gt;&lt;em&gt;Poor Charlie’s Almanack : The Essential Wit and Wisdom of Charles T. Munger. Talk 3 : A Lesson on Elementary, Worldly Wisdom as It Relates to Investment Management and Business, Revisited&lt;/em&gt;&lt;/a&gt;. Stripe Press, 2023&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Dans sa thèse, Edward Tufte évoque lui aussi l’histoire et l’intérêt des graphiques :&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;en&quot;&gt;William Playfair (1759-1823), a Scottish political economist, made the first known time-series using economic data. […] Playfair contrasted his new graphical method with the tabular presentation of data: “Information […] is generally imperfectly retained; and a man who has carefully investigated a printed table, finds, when done, that he has only a very faint and partial idea of what he has read; and that like a figure imprinted on sand, is soon totally erased and defaced. Upon that these Charts were made; and, while they give a simple and distinct idea, they are as near perfect accuracy as is any way useful. On inspecting any one of these Charts attentively, a sufficiently distinct impression will be made, to remain unimpaired for a considerable time, and the idea which does remain will be simple and complete.” For Playfair, graphics were preferable to tables because graphics showed the shape of the data in a comparative perspective.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;TUFTE, Edward. &lt;a href=&quot;https://ia800408.us.archive.org/15/items/tufte_visual_display_of_quantitative_information_low-res/tufte_visual_display_of_quantitative_information_low-res_text.pdf&quot;&gt;&lt;em&gt;The Visual Display of Quantitative Information&lt;/em&gt;&lt;/a&gt;. 1983&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/premier_graphique.png&quot; alt=&quot;Graphique de tous les imports et exports d&#39;Angleterre de 1700 à 1782, représentant en ordonnée les millions de marchandises et le temps en abscisse. Le graphique est fait à la main via un quadrillage.&quot;&gt;&lt;figcaption&gt;Premier graphique au monde à avoir été largement diffusé, détaillant tous les imports et exports d’Angleterre de 1700 à 1782&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://simplexct.com/data-ink-ratio-tables#:~:text=In%20other%20words%2C%20graphs%20show%20the%20forest%20while%20tables%20show%20the%20trees.&quot;&gt;Les graphiques montrent la forêt là où les tableaux montrent les arbres&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;r%C3%A8gles-g%C3%A9n%C3%A9rales-de-mise-en-forme-d%E2%80%99un-tableau&quot; tabindex=&quot;-1&quot;&gt;Règles générales de mise en forme d’un tableau&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/tableau_excel_typique.png&quot; alt=&quot;Exemple de tableau multicolore, surchargé, complexe à appréhender. Le tableau présente des données fictives relatives au cinéma.&quot;&gt;&lt;figcaption&gt;Un exemple de tableau que l’on a tous déjà rencontré, source et tous droits réservés Dark Horse Analytics&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Le tableau ci-dessus est difficile à appréhender de par sa mise en forme. Il véhicule une impression de complexité visuelle alors qu’il présente des informations plutôt simples.&lt;/p&gt;
&lt;p&gt;Quels défauts peut-on identifier ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l’intégralité des bordures sont présentes&lt;/li&gt;
&lt;li&gt;une alternance de couleurs sur chaque ligne&lt;/li&gt;
&lt;li&gt;les étiquettes de colonne sont centrées et alignées vers le bas avec un espacement jusqu’en haut de la case conséquent&lt;/li&gt;
&lt;li&gt;tous les textes et nombres sont centrés&lt;/li&gt;
&lt;li&gt;du contenu est répété en série&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;De manière générale, les règles suivantes s’appliquent pour les tableaux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;plus il y a de &lt;em&gt;bordures&lt;/em&gt; et plus le tableau est complexe à appréhender&lt;/li&gt;
&lt;li&gt;plus il y a de &lt;em&gt;couleurs&lt;/em&gt; différentes et plus le tableau est complexe à appréhender&lt;/li&gt;
&lt;li&gt;le texte doit toujours être ferré selon le sens d’écriture de la langue&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://practicaltypography.com/grids-of-numbers.html&quot;&gt;les nombres doivent toujours être alignés à droite pour faciliter leur lecture (compréhension facilitée des structures de nombres)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;les étiquettes de colonnes doivent toujours être alignées avec le contenu de leur colonne&lt;/li&gt;
&lt;li&gt;on regroupe les cellules similaires pour éviter les répétitions&lt;/li&gt;
&lt;li&gt;les bordures sont souvent superflues car l’alignement suffit à discerner les relations entre les items&lt;/li&gt;
&lt;li&gt;un saut de ligne dans un tableau peut être plus efficace qu’une bordure pour espacer des groupes de données&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://book.webtypography.net/Web-Typography_Numerals-and-tables.pdf&quot;&gt;étirer un tableau sur toute la largeur de la page est contreproductif, il en va de même pour le fait de donner la même largeur à toutes les colonnes&lt;/a&gt;, c’est le contenu qui détermine la taille&lt;/li&gt;
&lt;li&gt;alignement vertical : pour éviter que le contenu d’une cellule “flotte” par rapport à une cellule plus densément remplie, on aligne le contenu des cellules suivantes sur la baseline de la première la cellule la plus à gauche&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’agence de visualisation de données &lt;a href=&quot;https://www.darkhorseanalytics.com/&quot;&gt;Dark Horse Analytics&lt;/a&gt; avait partagé une série de billets de blog en 2014 intitulée “&lt;a href=&quot;https://www.darkhorseanalytics.com/blog/data-looks-better-naked&quot;&gt;Data Looks Better Naked&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;Voici le traitement qu’ils ont appliqués au tableau pour le rendre plus lisible :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/ClearOffTheTable.gif&quot; alt=&quot;Le gif montre visuellement l&#39;application des règles de mise en forme énumérées au dessus. Le tableau devient clair et lisible&quot;&gt;&lt;figcaption&gt;Traitement dataviz d’un tableau&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Un autre exemple de traitement &lt;em&gt;dataviz&lt;/em&gt; de tableau :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/nettoyage_de_tableau.gif&quot; alt=&quot;Le gif montre visuellement l&#39;application des règles de mise en forme énumérées au dessus. Le tableau initialement complexe en terme de présentation devient clair et lisible&quot;&gt;&lt;figcaption&gt;Traitement dataviz d’un tableau par l’agence &lt;a href=&quot;https://simplexct.com/&quot;&gt;SimplexCT&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On peut noter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le fait de remplacer les 0 répétés par des tirets pour supprimer de la charge visuelle&lt;/li&gt;
&lt;li&gt;la mise en évidence des titres via une mise en majuscule plutôt que d’utiliser du gras ou des couleurs fortes&lt;/li&gt;
&lt;li&gt;le placement de total en haut plutôt qu’en pied de tableau pour prioriser l’information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au sujet des tableaux, Eward Tufte donne &lt;a href=&quot;https://www.nas.nasa.gov/assets/nas/pdf/techreports/1994/nas-94-002.pdf&quot;&gt;quatre principes&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Above all else show the data.&lt;/li&gt;
&lt;li&gt;Maximize the data-ink ratio.&lt;/li&gt;
&lt;li&gt;Erase non-data-ink.&lt;/li&gt;
&lt;li&gt;Erase redundant data-ink.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le concept de &lt;em&gt;data-ink&lt;/em&gt; est introduit par Tufte comme étant le ‘non-erasable core of the graphic’ : le ratio de pixels utilisés pour présenter les données à rebours de ceux utilisés pour la mise en forme.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.edwardtufte.com/notebook/table-and-timetable-design-and-typography/&quot;&gt;Tufte a également documenté un travail de re-design de tableau pour les tables d’horaires d’une ligne de chemin de fer américaine&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;construire-des-%3Ctable%3E-lisibles-et-clairs-en-html-css&quot; tabindex=&quot;-1&quot;&gt;Construire des &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; lisibles et clairs en HTML CSS&lt;/h2&gt;
&lt;h3 id=&quot;le-html&quot; tabindex=&quot;-1&quot;&gt;Le HTML&lt;/h3&gt;
&lt;p&gt;L’élément &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; englobe le contenu. A l’intérieur on retrouve &lt;code&gt;&amp;lt;thead&amp;gt;&lt;/code&gt; qui contient les étiquettes de colonne. &lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt; contient le corps du tableau.
Une ligne est construite à partir de &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; qui contient elle même l’étiquette de la ligne &lt;code&gt;&amp;lt;th&amp;gt;&lt;/code&gt; et la donnée associée &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt;.
Pour afficher un total ou un élément résumant le tableau en pied de tableau il est possible d’utiliser l’élément englobant &lt;code&gt;&amp;lt;tfoot&amp;gt;&lt;/code&gt;.
Pour titrer le tableau on utilise l’élément &lt;code&gt;&amp;lt;caption&amp;gt;&lt;/code&gt; en premier descendant de l’élément &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;caption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Indices obligataires France Allemagne&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;caption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
 	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;thead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;column&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Pays&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;column&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;OAT&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
 	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;thead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tbody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        France
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        3.42
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        Allemagne
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        2.63
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tbody&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tfoot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        Spread
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;th&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        0.79
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;tfoot&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: unset&quot;&gt;
	&lt;caption style=&quot;caption-side: bottom; font-size: var(--step--2);&quot;&gt;Indices obligataires France Allemagne&lt;/caption&gt;
 	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th scope=&quot;column&quot;&gt;Pays&lt;/th&gt;
			&lt;th scope=&quot;column&quot; style=&quot;text-align: end&quot;&gt;OAT&lt;/th&gt;
		&lt;/tr&gt;
 	&lt;/thead&gt;
	&lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;
        France
      &lt;/th&gt;
      &lt;td style=&quot;text-align: end&quot;&gt;
        3.42
      &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;
        Allemagne
      &lt;/th&gt;
      &lt;td style=&quot;text-align: end&quot;&gt;
        2.63
      &lt;/td&gt;
    &lt;/tr&gt;
	&lt;/tbody&gt;
	&lt;tfoot&gt;
    &lt;tr&gt;
      &lt;th&gt;
        Spread
      &lt;/th&gt;
      &lt;td style=&quot;text-align: end&quot;&gt;
        0.79
      &lt;/td&gt;
    &lt;/tr&gt;
	&lt;/tfoot&gt;
&lt;/table&gt;
&lt;h3 id=&quot;le-css&quot; tabindex=&quot;-1&quot;&gt;Le CSS&lt;/h3&gt;
&lt;p&gt;Le style par défaut appliqué par le navigateur est :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; table&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-spacing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;border-collapse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; separate&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;text-indent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il est important de ne pas modifier la propriété &lt;code&gt;diplay: table&lt;/code&gt; sous peine de rendre le tableau inaccessible pour les utilisateurs de technologies d’assistance.&lt;/p&gt;
&lt;h4 id=&quot;les-bordures&quot; tabindex=&quot;-1&quot;&gt;Les bordures&lt;/h4&gt;
&lt;p&gt;Par défaut, chaque case du tableau à ses quatre bordures matérialisées et les cases sont séparées les unes des autres car le navigateur attribut un style par défaut pour la table avec la propriété &lt;code&gt;border-collapse&lt;/code&gt; qui prend pour valeur &lt;code&gt;separate&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/border-collapse-separate.png&quot; alt=&quot;Capture d&#39;écran de la matérialisation des bordures en cas de propriété CSS . Toutes les bordures sont séparées les unes des autres&quot;&gt;&lt;figcaption&gt;Propriété de bordure par défaut appliquée par le navigateur&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;La valeur &lt;code&gt;collapse&lt;/code&gt; permet de partager les bordures, ce qui est &lt;em&gt;beaucoup&lt;/em&gt; plus courant dans les tableaux que l’on voit tous les jours.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/border-collapse-collapse.png&quot; alt=&quot;Capture d&#39;écran de la matérialisation des bordures en cas de propriété CSS . Toutes les bordures partagées entre les cellules sont fusionnées&quot;&gt;&lt;figcaption&gt;Propriété de bordure &lt;code&gt;collapse&lt;/code&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4 id=&quot;g%C3%A9rer-le-d%C3%A9passement-de-contenu&quot; tabindex=&quot;-1&quot;&gt;Gérer le dépassement de contenu&lt;/h4&gt;
&lt;p&gt;Pour éviter que le tableau soit trop grand pour le dimensionnement qui lui est réservé, il peut être judicieux d’appliquer la propriété &lt;code&gt;overflow: scroll&lt;/code&gt; à l’élément qui wrap le tableau afin de permettre un défilement au scroll en cas de dépassement.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scroll&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;rendre-les-en-t%C3%AAtes-de-colonne-ou-un-volet-du-tableau-%E2%80%9Csticky%E2%80%9D&quot; tabindex=&quot;-1&quot;&gt;Rendre les en-têtes de colonne ou un volet du tableau “sticky”&lt;/h3&gt;
&lt;p&gt;&lt;video controls=&quot;&quot; muted=&quot;&quot; src=&quot;https://www.teotimepacreau.fr/img/d%C3%A9filement_tableau_sticky.mp4&quot; title=&quot;Vidéo de défilement d&#39;un tableau : les étiquettes de colonne suivent le défilement en s&#39;accrochant au haut visible du tableau. L&#39;étiquette arrête de défiler une fois le bas du tableau atteint.&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;thead&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sticky&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/*l&#39;élément glisse désormais dans l&#39;espace contenu par son ancêtre direct*/&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.1rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/*obligatoire de choisir si l&#39;élément est sicky à partir du top, bottom, right ou left, ici je choisis de coller au haut du tableau en décalent légèrement le thead pour ne pas coller la barre du navigateur */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour figer le premier volet d’un tableau à double entrée sur l’axe horizontal, l’approche est un peu différente, on rend &lt;code&gt;sticky&lt;/code&gt; les premiers &lt;code&gt;&amp;lt;th&amp;gt;&lt;/code&gt; descendants de chaque &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;th:first-child&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sticky&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;border-inline-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;alignement-vertical-%C3%A0-l%E2%80%99int%C3%A9rieur-des-cellules&quot; tabindex=&quot;-1&quot;&gt;Alignement vertical à l’intérieur des cellules&lt;/h4&gt;
&lt;p&gt;Quand les colonnes deviennent plus étroites cela a pour effet de wrapper le texte de la colonne contenant le plus de texte. Le contenu de la cellule la moins large flotte au centre vertical de la cellule. On souhaite plutôt aligner le contenu sur la première ligne de texte de la ligne via la valeur &lt;code&gt;baseline&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/table-vertical-alignment.PNG&quot; alt=&quot;Capture d&#39;écran de cellules de tableau : les nombres ne sont pas alignés sur la première ligne de la cellule la plus à gauche du tableau&quot;&gt;&lt;figcaption&gt;Cellule sans alignement sur la baseline&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/tableau_avec_alignement_baseline.png&quot; alt=&quot;Capture d&#39;écran de cellules de tableau : les nombres sont alignés sur la première ligne de la cellule la plus à gauche du tableau&quot;&gt;&lt;figcaption&gt;Cellule avec alignement sur la baseline : les nombres ne flottent plus&lt;/figcaption&gt;&lt;/figure&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;th,
td&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; baseline&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;coh%C3%A9rence-typographique&quot; tabindex=&quot;-1&quot;&gt;Cohérence typographique&lt;/h4&gt;
&lt;p&gt;Dans certaines typographies, les chiffres ont des largeurs différentes, on souhaite plutôt avoir la même largeur pour chaque chiffre afin de préserver la structure des nombres. Pour cela, on utilise la propriété CSS : &lt;code&gt;font-variant-numeric: tabular-nums&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/tabular_vs_non-tabular_nums.png&quot; alt=&quot;Capture d&#39;écran de la différence entre une typographie en nombres tabulaires et non tabulaires : une série de 1 et de 0 tabulaires a la même largeur tandis que les deux mêmes lignes en tabulaires ont des chiffres de largeur différente&quot;&gt;&lt;figcaption&gt;Différence de largeur des chiffres en cas de typographie tabulaire et non tabulaire&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4 id=&quot;rendre-le-tableau-responsive-sur-mobile&quot; tabindex=&quot;-1&quot;&gt;Rendre le tableau responsive sur mobile&lt;/h4&gt;
&lt;p&gt;L’étroitesse du contenu affiché sur mobile oblige à repenser le tableau. En effet, sur mobile le tableau va rapidement s’allonger en hauteur et l’on en souhaite pas que l’utilisateur ne sache pas à quelle en-tête de colonne correspond la donnée contenue dans la cellule. Une solution peut être d’afficher les en-têtes de colonne en les répétant à côté de chaque donnée de cellule.&lt;/p&gt;
&lt;p&gt;On ne prend ici en considération que le cas de &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; générées à partir de Markdown, elles n’ont donc que des en-têtes de colonnes et ne peuvent avoir d’en-tête de ligne car &lt;a href=&quot;https://blog.markdowntools.com/posts/markdown-table-ultimate-guide&quot;&gt;Markdown ne supporte pas les tableaux à double entrée&lt;/a&gt;. En Markdown il n’est également pas possible de regrouper plusieurs cellules entre elles alors qu’il est possible de le faire en HTML via l’attribut &lt;code&gt;rowspan&lt;/code&gt; ou &lt;code&gt;colspan&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/tableau_mobile.PNG&quot; alt=&quot;Capture d&#39;écran du tableau au format mobile : il n&#39;y a que deux colonnes, le contenu des colonnes qui ne sont pas des étiquettes sont placées dans une cellule et ordonées verticalement. Le contenu des étiquettes est répété dans chaque cellule.&quot;&gt;&lt;figcaption&gt;Affichage au format mobile&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Techniquement, on souhaite que les en-têtes de colonne &lt;code&gt;&amp;lt;th&amp;gt;&lt;/code&gt; contenus dans &lt;code&gt;&amp;lt;thead&amp;gt;&lt;/code&gt; soient réinjectés dans le corps du tableau. On crée un script en Javascript en ce sens :&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;displayTableForMobile&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;table&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; allTh &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; table&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;thead th&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; allRows &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; table&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tbody tr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    allRows&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; allTd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tbody tr td&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      allTd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;td&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; allTh&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; allTh&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        td&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data-cell&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;displayTableForMobile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour chaque table sélectionnée, on sélectionne tous les en-têtes de colonne ainsi que toutes les lignes du corps de tableau. Pour chaque ligne sélectionnée, on sélectionne chaque cellule. Pour chaque cellule, on instancie une constante &lt;code&gt;text&lt;/code&gt; qui raccroche l’en-tête de colonne et on la place dans un attribut HTML custom &lt;code&gt;data-cell&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Puis on a nécessairement besoin de CSS pour afficher le contenu de l’attribut &lt;code&gt;data-cell&lt;/code&gt; avant le contenu de la cellule :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*---RESPONSIVE TABLES ON MOBILE : pour que ça fonctionne nécessaire que chaque td ait un attribut &#39;data-cell&#39; qui soit égal au th de sa colonne, par exemple : th &quot;job-title&quot;, td doit être &amp;lt;td data-cell=&quot;job-title&quot;&gt;---*/&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &amp;lt; 800px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;th&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;td&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 33dvw auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;word-wrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; anywhere&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;td::before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data-cell&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://simplexct.com/data-ink-ratio-tables&quot;&gt;https://simplexct.com/data-ink-ratio-tables&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.darkhorseanalytics.com/blog/&quot;&gt;https://www.darkhorseanalytics.com/blog/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://piccalil.li/blog/styling-tables-the-modern-css-way/&quot;&gt;https://piccalil.li/blog/styling-tables-the-modern-css-way/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://practicaltypography.com/grids-of-numbers.html&quot;&gt;https://practicaltypography.com/grids-of-numbers.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://book.webtypography.net/Web-Typography_Numerals-and-tables.pdf&quot;&gt;https://book.webtypography.net/Web-Typography_Numerals-and-tables.pdf&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Bonnes pratiques pour générer un flux RSS</title>
    <link href="https://www.teotimepacreau.fr/blog/bonnes-pratiques-pour-generer-un-flux-rss/" />
    <updated>2025-06-21T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/bonnes-pratiques-pour-generer-un-flux-rss/</id>
    <content type="html">&lt;p&gt;Plus que jamais &lt;a href=&quot;https://www.radiofrance.fr/franceinter/podcasts/la-terre-au-carre/la-terre-au-carre-du-mercredi-05-fevrier-2025-3233441&quot;&gt;s’affranchir des algorithmes de sélection de contenu devient nécessaire&lt;/a&gt;. Les flux web permettent de suivre facilement des publications.
On le connaît davantage sous le nom de “flux RSS” mais le RSS est le nom d’un “dialecte” de XML pensé pour permettre la syndication de contenu.
XML est un format de &lt;a href=&quot;https://www.arthurperret.fr/cours/serialisation.html&quot;&gt;sérialisation de données&lt;/a&gt; avec la particularité de pouvoir être &lt;em&gt;étendu&lt;/em&gt; par une grammaire définie (Document Type Definition ou les schémas XML). Cela permet à qui le souhaite de créer des dialectes de format XML afin d’échanger des documents répondant aux mêmes règles.&lt;/p&gt;
&lt;p&gt;Les flux web se reposent donc sur le format XML sous-jacent. RSS 2.0 (dernière version en 2009) et Atom 1.0 (dernière version en 2005) sont les standards de flux web les plus connus.&lt;/p&gt;
&lt;p&gt;Voici un exemple de flux Atom :&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;feed&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://www.w3.org/2005/Atom&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;xml:&lt;/span&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fr&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Teotime Pacreau Blog&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;subtitle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Blogs et essais&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;subtitle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.teotimepacreau.fr/feed/feed.xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.teotimepacreau.fr/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;updated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;2025-05-21T00:00:00Z&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;updated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;https://www.teotimepacreau.fr/&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Téotime Pacreau&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;email&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;teotime.pac@outlook.fr&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;email&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Minimum vital pour survivre sur un sujet Kubernetes&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.teotimepacreau.fr/blog/minimum-vital-pour-survivre-kubernetes/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;updated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;2025-05-21T00:00:00Z&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;updated&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;https://www.teotimepacreau.fr/blog/minimum-vital-pour-survivre-kubernetes/&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;content&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;entry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;privil%C3%A9gier-le-format-rss%2C-atom-ou-json-%3F&quot; tabindex=&quot;-1&quot;&gt;Privilégier le format RSS, Atom ou JSON ?&lt;/h2&gt;
&lt;p&gt;Pour choisir quel format privilégier trois questions se posent : le format est-il bien supporté par les lecteurs de flux ? La spécification du format est-elle ambigüe ? Le format offre-t-il assez de balises pour personnaliser le contenu partagé ?&lt;/p&gt;
&lt;h3 id=&quot;comparaison-des-formats-pris-en-charge-par-les-lecteurs-de-flux-les-plus-populaires&quot; tabindex=&quot;-1&quot;&gt;Comparaison des formats pris en charge par les lecteurs de flux les plus populaires&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href=&quot;https://miniflux.app/&quot;&gt;Miniflux&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href=&quot;https://tt-rss.org/&quot;&gt;Tiny Tiny RSS&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href=&quot;https://freshrss.github.io/FreshRSS/en/&quot;&gt;Fresh RSS&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href=&quot;https://github.com/0x2E/fusion&quot;&gt;Fusion&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href=&quot;https://github.com/rektdeckard/moccasin&quot;&gt;Moccasin&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RSS 2.0&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atom 1.0&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON 1.1&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Non supporté&lt;/td&gt;
&lt;td&gt;Non supporté&lt;/td&gt;
&lt;td&gt;Supporté&lt;/td&gt;
&lt;td&gt;Non supporté&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les flux JSON ne sont malheureusement toujours pas pris en charge par une partie des lecteurs de flux modernes. Afin d’assurer un maximum de compatibilité, les formats RSS 2.0 et Atom 1.0 sont à privilégier.&lt;/p&gt;
&lt;h3 id=&quot;la-sp%C3%A9cification-du-format-est-elle-ambig%C3%BCe-%3F&quot; tabindex=&quot;-1&quot;&gt;La spécification du format est-elle ambigüe ?&lt;/h3&gt;
&lt;p&gt;La spécification de RSS 2.0 est pensée pour être extensible à l’infini via le principe des &lt;em&gt;namespaces&lt;/em&gt; XML. En effet, dans un cas “classique” un fichier XML ne contiendra que des balises qui appartiennent à une seule grammaire de référence. Les &lt;em&gt;namespaces&lt;/em&gt; permettent de d’avoir des balises issues de plusieurs grammaires différentes. Par exemple la balise HTML &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; n’est pas reconnue par XML nativement, on défini alors un &lt;em&gt;namespace&lt;/em&gt; via l’attribut &lt;code&gt;xmlns&lt;/code&gt; : &lt;code&gt;&amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&amp;gt;&lt;/code&gt; pour que le document XML reste valide malgré une balise inconnue nativement.
Pensé originellement comme une force pour RSS 2.0 cette extensibilité infinie et non encadrée par la spécification entraîne des problèmes évidents de prise en charge des balises non reconnues par les lecteurs de flux. Cela peut engendrer des documents XML non conformes qui ne seraient pas assimilables par les lecteurs de flux.&lt;/p&gt;
&lt;p&gt;Atom 1.0 autorise lui aussi les &lt;em&gt;namespaces&lt;/em&gt; mais il encadre strictement leur utilisation uniquement dans des emplacements spécifiques. Cela rend Atom plus prédictible pour les lecteurs de flux. Très concrètement Atom autorise les &lt;em&gt;namespaces&lt;/em&gt; mais la spécification explique qu’il n’est pas possible de remplacer une balise Atom requise (comme &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;updated&amp;gt;&lt;/code&gt;). Atom 1.0 est donc bien moins ambigüe que RSS 2.0&lt;/p&gt;
&lt;h3 id=&quot;balises-de-personnalisation-offertes-par-le-format&quot; tabindex=&quot;-1&quot;&gt;Balises de personnalisation offertes par le format&lt;/h3&gt;
&lt;p&gt;Atom 1.0 offre plusieurs balises de métadonnées parmi lesquelles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les éléments &lt;code&gt;&amp;lt;author&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;email&amp;gt;&lt;/code&gt; permettent de caractériser l’auteur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;rights&amp;gt;&lt;/code&gt; pour indiquer les droits de propriété intellectuelle sur le contenu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;source&amp;gt;&lt;/code&gt; pour indiquer un contenu originaire d’un autre flux&lt;/li&gt;
&lt;li&gt;les éléments &lt;code&gt;&amp;lt;subtitle&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; permettent de caractériser le flux&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;content&amp;gt;&lt;/code&gt; contient les éléments de chaque entrée et peut-être de type texte ou HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xml:lang=&amp;quot;fr&amp;quot;&lt;/code&gt; est un attribut qui se place dans l’élément &lt;code&gt;&amp;lt;feed&amp;gt;&lt;/code&gt; et qui est hérité par tous les descendants pour indiquer la langue du flux&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RSS 2.0 offre quand à lui :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&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;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Le titre de l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;L’URL de l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Le résumé ou contenu de l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adresse email de l’auteur de l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Catégorie(s) à laquelle appartient l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;comments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL d’une page pour les commentaires relatifs à l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enclosure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Décrit un fichier média attaché à l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;guid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identifiant unique de l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pubDate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Date de publication de l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Le flux RSS d’origine d’où provient l’élément.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;language&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Langue utilisée dans le flux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copyright&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mention de droit d’auteur sur le contenu du flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;managingEditor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email du responsable éditorial.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;webMaster&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email du responsable technique.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lastBuildDate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dernière date de mise à jour du contenu.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Catégories auxquelles appartient le flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generator&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nom du programme qui a généré le flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL vers la documentation du format RSS utilisé.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cloud&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Décrit un système de notification de mise à jour du flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ttl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;“Time To Live” — durée (en minutes) pendant laquelle le flux peut être mis en cache.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Image associée au flux (JPEG, PNG ou GIF).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Évaluation pour le contrôle parental (encadré par une sorte d’équivalent américain au CSA FR).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;textInput&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Permet d’afficher un champ de saisie texte avec le flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skipHours&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Heures pendant lesquelles les agrégateurs peuvent ignorer la récupération du flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skipDays&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jours pendant lesquels les agrégateurs peuvent ignorer la récupération du flux.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;d%C3%A9couvrabilit%C3%A9-du-flux&quot; tabindex=&quot;-1&quot;&gt;Découvrabilité du flux&lt;/h2&gt;
&lt;p&gt;Pour que l’utilisateur puisse souscrire au flux depuis n’importe quelle page du site et sans avoir à connaître l’URL exacte du flux, il suffit de place une balise &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; avec l’attribut &lt;code&gt;rel&lt;/code&gt; à l’intérieur de la balise &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; du HTML.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;alternate&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/feed/feed.xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Flux du blog et des essais de Téotime Pacreau&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;application/atom+xml&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela permettra aux utilisateurs de lecteurs de flux de copier n’importe quelle URL du site, le lecteur de flux trouvera automatiquement l’URL du flux.&lt;/p&gt;
&lt;h2 id=&quot;d%C3%A9m%C3%A9nagement-de-flux-atom&quot; tabindex=&quot;-1&quot;&gt;Déménagement de flux Atom&lt;/h2&gt;
&lt;p&gt;L’élément &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; associé à l’attribut &lt;code&gt;rel=&amp;quot;self&amp;quot;&lt;/code&gt; permet d’indiquer l’URL canonique du flux pour indiquer aux services consommateurs (lecteurs RSS, agrégateurs, robots) où ils peuvent récupérer la dernière version du flux &lt;code&gt;&amp;lt;link href=&amp;quot;https://www.teotimepacreau.fr/feed/feed.xml&amp;quot;/&amp;gt;&lt;/code&gt;. Cela a deux avantages : il permet de déménager le flux, certains lecteurs de flux mettront automatiquement l’URL de récupération du flux à jour s’il détecte une modification sur le &lt;code&gt;rel=&amp;quot;self&amp;quot;&lt;/code&gt;. Deuxièmement cela améliore le cache pour le polling du flux.&lt;/p&gt;
&lt;h2 id=&quot;cat%C3%A9gories-de-flux-atom&quot; tabindex=&quot;-1&quot;&gt;Catégories de flux Atom&lt;/h2&gt;
&lt;p&gt;Pour proposer des catégories segmentées lors de l’abonnement à un flux il suffit d’utiliser l’élément suivant :&lt;/p&gt;
&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;category&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Blog&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Blog&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;category&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;term&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Essais&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Essais&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;adapter-les-r%C3%A8gles-http-au-partage-d%E2%80%99un-document-de-flux&quot; tabindex=&quot;-1&quot;&gt;Adapter les règles HTTP au partage d’un document de flux&lt;/h2&gt;
&lt;p&gt;Les lecteurs de flux ping très fréquemment le document de flux, ainsi si la charge est trop lourde pour le serveur il peut-être utile d’adapter le &lt;code&gt;cache-control&lt;/code&gt; dans le &lt;code&gt;header&lt;/code&gt; HTTP :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour un flux avec une nouvelle entrée tous les mois il peut-être adapté de proposer une période de cache maximale d’1h &lt;code&gt;Cache-Control: max-age=3600&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;pour un flux avec plusieurs nouvelles entrées tous les jours il peut-être adapté de proposer une période de cache maximale de 5 minutes &lt;code&gt;Cache-Control: max-age=300&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il convient de désactiver toutes les règles anti-bot sur la page de partage du document de flux piur permettre l’indexation et la découverte par les lecteurs de flux.&lt;/p&gt;
&lt;p&gt;Pour permettre à certains lecteurs de flux d’effectuer des requêtes il peut être nécessaire d’ajouter l’en-tête &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; afin de modifier la règle CORS.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kevincox.ca/2022/05/06/rss-feed-best-practices/&quot;&gt;https://kevincox.ca/2022/05/06/rss-feed-best-practices/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=26169162&quot;&gt;https://news.ycombinator.com/item?id=26169162&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.xmlfacile.com/guide_xml/namespace_espace_de_noms_1.php5&quot;&gt;http://www.xmlfacile.com/guide_xml/namespace_espace_de_noms_1.php5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ietf.org/rfc/rfc4287.txt&quot;&gt;https://www.ietf.org/rfc/rfc4287.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;https://www.rssboard.org/rss-specification&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Minimum vital pour survivre sur un sujet Kubernetes</title>
    <link href="https://www.teotimepacreau.fr/blog/minimum-vital-pour-survivre-kubernetes/" />
    <updated>2025-05-21T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/minimum-vital-pour-survivre-kubernetes/</id>
    <content type="html">&lt;p&gt;Un conteneur est une virtualisation de l’environnement d’exécution. Il a l’avantage d’être plus léger qu’une VM car il n’embarque pas la couche OS mais seulement les dépendances et l’application.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/fonctionnement-vm-vs-conteneur.png&quot; alt=&quot;Schéma reprenant les différences entre une VM et un conteneur : la VM est assise sur un serveur et embarque son OS tandis que le conteneur compte sur Docker qui se charge d&#39;embarquer l&#39;OS et les bins et librairies nécessaires&quot;&gt;&lt;figcaption&gt;Schéma comparant le fonctionnement d’une VM comparé à un conteneur&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Kubernetes est une solution d’orchestration de conteneurs permettant d’automatiser l’allocation des ressources et la gestion des conteneurs. Grâce à Kubernetes le développeur n’a plus besoin de se soucier de la couche infrastructure et peut être davantage focus sur la prod. La solution s’appuie sur son architecture pour répondre aux pics de charges en transférant des paquets de conteneurs d’un hôte à l’autre, il équulibre la charge, centralise les log…&lt;/p&gt;
&lt;h2 id=&quot;architecture-kubernetes&quot; tabindex=&quot;-1&quot;&gt;Architecture Kubernetes&lt;/h2&gt;
&lt;p&gt;Le Kubernetes Master est l’agent maître qui donne les ordres. Un Node est une machine qui héberge un hôte Docker. Un Pod est un environnement d’exécution qui contient un ou plusieurs conteneurs.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/architecture-kubernetes.png&quot; alt=&quot;Schéma détaillant l&#39;architecture Kubernetes : Master, multiples Nodes, Pod conteneur un ou des conteneurs Docker&quot;&gt;&lt;figcaption&gt;Schéma minimal d’architecture Docker&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Tous les conteneurs d’un Pod partagent la même adresse IP, les mêmes ports réseaux et peuvent partager un volume pour stocker et échanger des données entre eux.&lt;/p&gt;
&lt;p&gt;Le Kubernetes Master fait migrer les Pods selon le Node le plus approprié pour allouer les ressources en cas de pic de charge, il gère également l’utilisation des ressources sur chaque Node. Avec Kubernetes les ordres d’administration réseaux proviennent d’un système automatisé plutôt que d’une configuration manuelle non adapatée à des dizaines de conteneurs.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;div id=&quot;NChhdOZV4sY&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/NChhdOZV4sY&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div id=&quot;PziYflu8cB8&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/PziYflu8cB8&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Suivre l&#39;évolution du marché immobilier dans son département</title>
    <link href="https://www.teotimepacreau.fr/blog/suivre-levolution-du-marche-immobilier-dans-son-departement/" />
    <updated>2025-03-25T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/suivre-levolution-du-marche-immobilier-dans-son-departement/</id>
    <content type="html">&lt;p&gt;L’Inspection Générale de l’Environnement et du Développement Durable (IGEDD) propose un &lt;a href=&quot;https://www.igedd.developpement-durable.gouv.fr/droits-de-mutation-immobiliers-par-a1652.html&quot;&gt;jeu de données mis à jour mensuellement pour suivre l’évolution du montant de l’assiette des droits de mutation immobiliers&lt;/a&gt; (parfois improprement appelés &lt;a href=&quot;http://www.igedd.developpement-durable.gouv.fr/frais-de-notaire-et-droits-de-a1414.html&quot;&gt;“frais de notaire”&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;L’assiette des droits de mutation correspond au montant total des ventes immobilières en €, cela sert de référence aux acteurs publics pour le calcul des taxes sur les ventes immobilières.&lt;/p&gt;
&lt;p&gt;Les droits de mutation sont constitués du droit d’enregistrement et de la taxe de publicité foncière (regroupe des prélèvements effectués au profit des départements, des communes et de l’État = 4.5% du prix du bien pour le département, 1.2% pour la commune, des frais d’assiette et de recouvrement perçus au profit de l’État de 2,37% du montant du droit départemental, le tout plafonné à 5.81% maximum).&lt;/p&gt;
&lt;p&gt;Ce jeu de données est intéressant car il permet d’analyser en finesse, avec une granularité sur le département, l’évolution du montant total des ventes de logements anciens et terrains confondus car toute vente à titre onéreux de bien ancien ou de terrain passe obligatoirement par ce fichier. Il nous donne donc un potentiel indice sur l’évolution du nombre de logement anciens vendus ou de leur prix sans pouvoir distinguer.&lt;/p&gt;
&lt;p&gt;Pour connaître le nombre de vente exact de logements d’un département ou d’une ville : le fichier &lt;a href=&quot;https://www.data.gouv.fr/fr/datasets/demandes-de-valeurs-foncieres/&quot;&gt;DVF&lt;/a&gt; est la référence mais il est nécessaire d’attendre le mois d’Avril postérieur à chaque année pour les données du dernier semestre de l’année précédente ou le mois d’Octobre pour les données du premier semestre de l’année en cours, le temps que les données soient consolidées.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/montant_dmto_loire_atlantique_2025.png&quot; alt=&quot;Feuille de données tableur de l&#39;évolution du montant de l&#39;assiette des droits de mutation immobiliers en Loire-Atlantique. On observe une nette décroissance du montant puis un début de stabilisation&quot;&gt;&lt;figcaption&gt;Evolution du montant de l’assiette des droits de mutation immobiliers - données Loire-Atlantique&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;comprendre-les-termes-du-jeu-de-donn%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;Comprendre les termes du jeu de données&lt;/h2&gt;
&lt;p&gt;Le “régime de droit commun (mutations à titre onéreux)” désigne &lt;a href=&quot;https://www.igedd.developpement-durable.gouv.fr/droits-de-mutation-immobiliers-commentaires-sur-le-a1013.html&quot;&gt;“les mutations à titre exclusivement onéreux d’immeubles anciens et de terrains non soumis à la taxe sur la valeur ajoutée”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le “régime dérogatoire” désigne &lt;a href=&quot;https://www.igedd.developpement-durable.gouv.fr/droits-de-mutation-immobiliers-commentaires-sur-le-a1013.html&quot;&gt;“les mutations à titre onéreux d’immeubles neufs et assimilés, de biens achetés en vue d’une revente rapide (régime « marchands de biens ») et de terrains soumis à la taxe sur la valeur ajoutée”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le notaire dispose d’un délai &lt;a href=&quot;https://www.igedd.developpement-durable.gouv.fr/effet-du-raccourcissement-du-delai-d-envoi-des-a1189.html&quot;&gt;d’un mois pour transmettre l’acte de vente d’un bien à la direction des finances publiques, en conséquence les montants mentionnés sont décalés d’un mois&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;exemple-concret-en-loire-atlantique&quot; tabindex=&quot;-1&quot;&gt;Exemple concret en Loire-Atlantique&lt;/h2&gt;
&lt;p&gt;Pour estimer l’évolution du marché immobilier ancien dans le département sur l’année écoulé, on observe la colonne “croissance annuelle du montant cumulé sur 12 mois -&amp;gt; régime de droit commun”. Cela écarte le neuf, les marchands de biens, et les donations. On se retrouve avec un montant qui mèle ventes immobilières de bâti et de terrains anciens.&lt;/p&gt;
&lt;p&gt;En Décembre 2024, l’évolution annuelle du montant cumulé des mutations de logements anciens et terrain était en diminution de -15%.
Le neuf semble augmenter pour la première fois après 18 mois de diminution d’affilée.&lt;/p&gt;
&lt;p&gt;On observe que les mois de Juillet de chaque année concentrent le plus haut montant annuel de mutations.&lt;/p&gt;
&lt;h2 id=&quot;comprendre-la-composition-des-droits-de-mutation-immobiliers-%C3%A0-titre-on%C3%A9reux&quot; tabindex=&quot;-1&quot;&gt;Comprendre la composition des droits de mutation immobiliers à titre onéreux&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;la taxe de publicité foncière d’un montant de 5.81% du prix du bien (détaillé plus haut)&lt;/li&gt;
&lt;li&gt;la contribution de sécurité immobilière d’un montant de 0,1% du prix du bien&lt;/li&gt;
&lt;li&gt;le notaire se rémunère à hauteur de 0,79% du prix du bien&lt;/li&gt;
&lt;li&gt;ajouter les frais nécessaires à la constitution du dossier par le notaire (par exemple les sommes nécessaires à la consultation du cadastre, aux frais relatifs au service de publicité foncière, ou concernant les documents d’urbanisme)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Comprendre l&#39;évolution des prix de l&#39;immobilier en France</title>
    <link href="https://www.teotimepacreau.fr/blog/comprendre-levolution-des-prix-immobiliers-en-france/" />
    <updated>2025-03-12T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/comprendre-levolution-des-prix-immobiliers-en-france/</id>
    <content type="html">&lt;p&gt;On entend tout et son contraire concernant les prix de l’immobilier : “les prix ne peuvent que monter à long terme”, “les taux des prêts immobiliers diminuent donc les prix vont augmenter”, sans compter le nombre “d’experts” immobiliers invités dans les médias selon qui c’est toujours le bon moment pour acheter.&lt;/p&gt;
&lt;h2 id=&quot;comprendre-comment-sont-fix%C3%A9s-les-taux-des-pr%C3%AAts-immobiliers&quot; tabindex=&quot;-1&quot;&gt;Comprendre comment sont fixés les taux des prêts immobiliers&lt;/h2&gt;
&lt;p&gt;Une idée très répandue est que la BCE donne le mot d’ordre auprès des banques françaises avec l’évolution de son taux directeur. Quand la BCE diminue son taux directeur, les taux des prêts immobiliers devraient donc diminuer en conséquence ? &lt;a href=&quot;https://www.capital.fr/immobilier/credit-immobilier-apres-la-decision-de-la-bce-les-taux-vont-ils-vraiment-continuer-a-baisser-1508673&quot;&gt;En réalité les banques se financent assez peu auprès de la BCE, mais plutôt sur les marchés financiers&lt;/a&gt;.
&lt;a href=&quot;https://acpr.banque-france.fr/system/files/import/acpr/medias/documents/20240716_as161_grands_groupes_bancaires_fr_2023.pdf&quot;&gt;Selon l’Autorité de Contrôle Prudentiel et de Résolution de la Banque de France, la répartition des sources de financement des banques françaises se répartissait en 2023 comme suit&lt;/a&gt; :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Poste au passif&lt;/th&gt;
&lt;th style=&quot;text-align: end&quot;&gt;Montant en milliards d’euros&lt;/th&gt;
&lt;th style=&quot;text-align: end&quot;&gt;Part du total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dérivés détenus à des fins de transaction (passif)&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;510&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Titres de dette émis&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;1 444&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépôts des banques centrales&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;199&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;2.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépôts des administrations centrales&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;154&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;1.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépôts des établissements de crédit&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;436&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;5.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépôts des autres entreprises financières&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;833&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;10.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépôts des SNF&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;1468&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;17.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépôts des ménages&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;2179&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;25.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dérivés - comptabilité de couverture passif&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;113,4&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;1.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capitaux propres&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;527&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;6.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autres passifs&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;585&lt;/td&gt;
&lt;td style=&quot;text-align: end&quot;&gt;6.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Le tableau retranscrit est à retrouver à la page 11 du &lt;a href=&quot;https://acpr.banque-france.fr/system/files/import/acpr/medias/documents/20240716_as161_grands_groupes_bancaires_fr_2023.pdf&quot;&gt;document source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On comprend que l’essentiel du financement des banques françaises provient des dépôts avec 62.6% du total du passif. Ce sont des ressources stables, difficilement contrôlables par les banques car elles n’ont pas la main pour accroître ou réduire les dépôts des ménages par exemple.
Le banques françaises ne se financent qu’à hauteur de 2.3% auprès de la BCE en 2023.&lt;/p&gt;
&lt;p&gt;On comprend donc que le taux de la BCE a un impact réduit sur le financement des banques. Par contre, la &lt;strong&gt;politique monétaire de la BCE&lt;/strong&gt; a elle un effet indirect en influençant les taux obligataires (OAT 10 ans), qui servent de référence pour le financement des prêts immobiliers.&lt;/p&gt;
&lt;p&gt;Pourquoi les taux obligataires servent de référence pour le financement des prêts immobiliers ?
On l’a vu, les “titres de dette émis” représentent 17% du passif. C’est une des seules façons pour les banques d’obtenir de l’argent de façon dynamique, à leur guise. Les “titres de dette” sont à grande majorité des obligations.
L’indice de référence pour suivre le marché des obligations en France est l’&lt;a href=&quot;https://webstat.banque-france.fr/fr/catalogue/fm/FM.D.FR.EUR.FR2.BB.FRMOYTEC10.HSTA&quot;&gt;Obligation Assimilable du Trésor à 10 ans&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pourquoi l’OAT 10 ans est-elle importante ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;c’est l’indicateur principal des taux d’intérêt à long terme en France.&lt;/li&gt;
&lt;li&gt;sa rémunération dépend de la confiance des investisseurs dans l’Etat Français (dette, stabilité) et de l’environnement économique (inflation, croissance, politique monétaire de la BCE).&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/OAT_10ans.png&quot; alt=&quot;Graphique du cours de L&#39;OAT 10 ans de 2020 à 2025, on constate un taux de 3.6% le 12 Février 2025 et une augmentation massive de ce taux entre 2022 et 2025&quot;&gt;&lt;figcaption&gt;Graphique du cours de L’OAT 10 ans de 2020 à 2025&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On comprend donc que le financement des prêts immobiliers repose principalement sur les marchés d’obligations (s’obtient de façon dynamique en fonction des volontés de la banque) et les dépôts des clients (indépendant des volontés de la banque).&lt;/p&gt;
&lt;p&gt;L’Inspection Générale de l’Environnement et du Développement Durable (IGEDD) a une équipe dédiée à l’étude de l’évolution à long terme des prix immobilier. Cette équipe est représentée par &lt;a href=&quot;https://friggit.eu/&quot;&gt;Jacques Friggit&lt;/a&gt;, ingénieur général et expert de référence sur le sujet, que l’on peut considérer neutre au vu de sa carrière dans la fonction publique.&lt;/p&gt;
&lt;p&gt;Il démontre la corrélation entre le taux de la dette de l’Etat à long terme et le taux des prêts immobiliers depuis 1999.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/correlation_oat_taux_prets_immobiliers.png&quot; alt=&quot;Graphique de corrélation entre les taux d’intérêt des prêts immobiliers et de la dette de l’Etat. On observe que les taux d&#39;intérêt des prêts immobiliers suivent les taux de la dette de l&#39;Etat à long terme&quot;&gt;&lt;figcaption&gt;Corrélation entre les taux d’intérêt des prêts immobiliers et les taux de la dette de l’Etat à long terme&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Ainsi, l’indice OAT 10 ans est l’indice de référence pour anticiper les évolutions de taux des prêts immobiliers.
Selon la Fondation pour la recherche sur les administrations et les politiques publiques, &lt;a href=&quot;https://www.ifrap.org/budget-et-fiscalite/attention-une-hausse-des-taux-sur-la-dette-francaise-contaminerait-limmobilier-et-les-entreprises#:~:text=notation%20de%20l%E2%80%99entreprise.-,Pour%20les%20m%C3%A9nages%C2%A0,-Le%20taux%20de&quot;&gt;pour chaque augmentation de 1 point du taux de l’OAT 10 ans, les ménages subissent une augmentation de 1,4 point de taux des nouveaux crédits immobiliers&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;suivre-l%E2%80%99%C3%A9volution-des-taux-des-pr%C3%AAts-immobiliers-en-france&quot; tabindex=&quot;-1&quot;&gt;Suivre l’évolution des taux des prêts immobiliers en France&lt;/h2&gt;
&lt;p&gt;La Banque Centrale Européenne produit des données en open source parmi lesquelles &lt;a href=&quot;https://data.ecb.europa.eu/data/datasets/MIR/MIR.M.FR.B.A2C.A.R.A.2250.EUR.N&quot;&gt;un graphique établissant une moyenne des taux d’intérêt proposés par les banques dans le cadre d’un achat immobilier en France&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/graphique_taux_moyen_prets_immobiliers.png&quot; alt=&quot;Graphique établissant une moyenne des taux d&#39;intérêt proposés par les banques dans le cadre d&#39;un achat immobilier en France. 3.12% en moyenne en Janvier 2025&quot;&gt;&lt;figcaption&gt;Graphique de la BCE établissant une moyenne des taux d’intérêt proposés par les banques dans le cadre d’un achat immobilier en France&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;en-quoi-le-volume-de-production-de-pr%C3%AAts-immobiliers-est-un-des-indicateurs-de-l%E2%80%99%C3%A9volution-%C3%A0-venir-des-prix-de-vente&quot; tabindex=&quot;-1&quot;&gt;En quoi le volume de production de prêts immobiliers est un des indicateurs de l’évolution à venir des prix de vente&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://substack.com/@raphaelvignes&quot;&gt;Raphaël Vignes&lt;/a&gt;, un investisseur amateur qui propose chaque mois son analyse du marché immobilier, pointe le fait que la production annuelle de crédits à l’habitat est en décroissance depuis Avril 2024.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/taux_de_croissance_annuelle_encours_credit_a_lhabitat.png&quot; alt=&quot;Graphique du taux de croissance annuelle de l&#39;encours des crédits à l&#39;habitat aux ménages en France selon la Banque de France. -0.6% sur l&#39;année en Janvier 2025&quot;&gt;&lt;figcaption&gt;Graphique du taux de croissance annuelle de l’encours des crédits à l’habitat aux ménages en France&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/bce_taux_croissance_annuelle_encours_prets_immo.png&quot; alt=&quot;Graphique du taux de croissance annuelle de l&#39;encours des crédits à l&#39;habitat aux ménages en France selon la BCE&quot;&gt;&lt;figcaption&gt;Graphique équivalent côté BCE (le dernier mois étant une prévision)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On observe une décroissance nette du volume des prêts immobiliers depuis Juillet 2023 selon les données de la BCE.
En Décembre 2024, le taux de croissance annuelle de la production de crédits à l’habitat sur un an est de -2.7%. Il y a donc une diminution de la solvabilisation de la demande. Moins de ménages obtiendront des prêts immobiliers, les biens à la vente sont donc davantage en concurrence.&lt;/p&gt;
&lt;h2 id=&quot;voir-au-del%C3%A0-des-taux&quot; tabindex=&quot;-1&quot;&gt;Voir au-delà des taux&lt;/h2&gt;
&lt;p&gt;Des taux oscillant entre 3% et 5% n’ont jamais été prohibitifs à l’achat de 1960 à 2008. Mais dans un contexte de pouvoir d’achat en décroissance depuis bientôt 20 ans, le taux est désormais perçu comme étant le vecteur barrière. L’entrave réelle à l’achat est le prix déconnecté des salaires qu’est devenu l’immobilier français.&lt;/p&gt;
&lt;p&gt;Jacques Friggit, propose de suivre les prix des logements anciens acquis rapporté au revenu disponible de l’ensemble des ménages en prenant en compte l’inflation.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/friggit_prix_immobilier.png&quot; alt=&quot;Graphique d&#39;indice de prix, nombre et montant des ventes de logements anciens et indice des loyers rapportés à leur tendance longue respective et durée d’emprunt pour acheter le même logement&quot;&gt;&lt;figcaption&gt;Indice de prix, nombre et montant des ventes de logements anciens et indice des loyers rapportés à leur tendance longue respective et durée d’emprunt pour acheter le même logement&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Son constat est sans appel : “au troisième trimestre 2024 le pouvoir d’achat immobilier était inférieur de 27% à ce qu’il était en 2000 et, pour acheter le même logement “toutes choses égales par ailleurs”, un primo-accédant devait s’endetter sur 25 ans, contre 15 ans en 2000. Cette durée a diminué de 4 ans par rapport au dernier trimestre 2023 sous l’effet d’une légère rechute des taux d’intérêt et d’une faible baisse du prix des logements et, quoique toujours supérieure à la durée moyenne des prêts accordés, elle s’en est rapprochée. Il en est résulté une forte diminution puis une stagnation des volumes de transactions”.&lt;/p&gt;
&lt;p&gt;Si l’on compare avec le pic de 2022, les volumes ont chutés de 1200000 à 750000 unités de logements anciens vendues par an. Les prix ont amorcés une diminution depuis ce pic.&lt;/p&gt;
&lt;h2 id=&quot;mais-pourquoi-le-pouvoir-d%E2%80%99achat-immobilier-s%E2%80%99est-effondr%C3%A9-en-25-ans-%3F&quot; tabindex=&quot;-1&quot;&gt;Mais pourquoi le pouvoir d’achat immobilier s’est effondré en 25 ans ?&lt;/h2&gt;
&lt;p&gt;L’effet le plus dévastateur pour le pouvoir d’achat immobilier a été l’effet inflationniste de l’allongement de la durée des prêts immobiliers.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/augmentation_duree_moyenne_pret_immobilier.png&quot; alt=&quot;Deux graphiques des années 1965 à 2025 : le premier représente la durée moyenne des emprunts immobilier, on y observe un accroîssement de + 6 ans entre 2000 et 2007. Le second représent l&#39;évolution des taux d&#39;intérêt des prêts immobiliers et l&#39;inflation, on observe que les taux d&#39;intérêt ont lentement diminués de 6% net d&#39;inflation en 1986 à 3% en 2025&quot;&gt;&lt;figcaption&gt;source &lt;a href=&quot;https://www.cgedd.fr/prix-immobilier-presentation.pdf&quot;&gt;Igedd&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Entre 2000 et 2007 la durée moyenne des emprunts immobilier a connu un accroîssement de + 6 ans. D’une durée moyenne de 15 ans en 2000 à 21 ans en 2007. L’allongement de la durée de la durée des prêts a en très grande partie permis de solvabiliser toujours plus la demande, donnant aux vendeurs tout loisir d’augmenter leurs prix puisque l’acheteur qui proposait un prix permis par un prêt immobilier de 15 ans se voyait damer le pion par le vendeur qui proposait un prix permis par un prêt immobilier de 20 ans. C’est un jeu à &lt;em&gt;roue crantée&lt;/em&gt; où il est très difficile de faire marche arrière : la durée de pret solvabilise la demande jusqu’au plafond de verre encadré par la loi des 25 ans.
Nous avons mis 25 ans à atteindre quasiment le plafond de la durée maximale des emprunts immobiliers tel qu’encadré par la loi française : 25 ans.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/duree_moyenne_prets_immobiliers.png&quot; alt=&quot;Graphique de la durée moyenne des prêts à l’habitat pour l’acquisition d’une résidence principale par les primo-accédants, en année de 2017 à fin 2025 : nous sommes passés de 22.3 ans en 2017 à 23.9 ans en Décembre 2025&quot;&gt;&lt;figcaption&gt;Graphique de la durée moyenne des prêts à l’habitat pour l’acquisition d’une résidence principale par les primo-accédants, en année de 2017 à fin 2025 : nous sommes passés de 22.3 ans en 2017 à 23.9 ans en Décembre 2025 &lt;a href=&quot;https://webstat.banque-france.fr/fr/catalogue/mir1/MIR1.M.FR.R.A22RP.A.D.A.2254P.EUR.N&quot;&gt;source&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/effet_inflationniste_allongement_duree_prets_immobiliers.png&quot; alt=&quot;Quatre graphiques de 1995 à 2025 : le premier est l&#39;indice du prix des logements et loyers rapportés aux revenus par ménage; le second est le taux d&#39;intérêt moyen des prêts immobiliers; le troisième est la durée d&#39;emprunt permettant à un primo-accédant d&#39;acheter le même logement; le quatrième est la vitesse de rotation du parc de logements&quot;&gt;&lt;figcaption&gt;source &lt;a href=&quot;https://www.cgedd.fr/prix-immobilier-presentation.pdf&quot;&gt;Igedd&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;croire-que-%E2%80%9Cconstruire-des-logements-en-masse-fera-baisser-les-prix%E2%80%9D-est-illusoire&quot; tabindex=&quot;-1&quot;&gt;Croire que “construire des logements en masse fera baisser les prix” est illusoire&lt;/h2&gt;
&lt;p&gt;Déréguler les normes de construction n’abaissera pas le prix des logements neufs. L’IGEDD via Jacques Friggit estime que construire 1 million de logements n’abaisserait que de 2.5% le prix des logements anciens (&lt;a href=&quot;https://www.statistiques.developpement-durable.gouv.fr/construction-de-logements-resultats-fin-janvier-2025-france-entiere?rubrique=&amp;amp;dossier=1047&quot;&gt;en 2024 seuls 294500 logements ont été mis en chantier&lt;/a&gt;). En Février 2024, face à plusieurs sénateurs missionés sur le logement, &lt;a href=&quot;https://www.youtube.com/watch?v=C2OeycnbO4g&quot;&gt;il indique les deux raisons qui expliquent l’envolée des prix du neuf&lt;/a&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l’effet inflationniste provoqué par l’alongement de la durée moyenne des prêts immobiliers de 15 à 25 ans&lt;/li&gt;
&lt;li&gt;la hausse continue du prix du foncier provoquée par l’effet du &lt;em&gt;compte à rebours&lt;/em&gt;, il s’agit de la démarche du promoteur qui, quand il repère un terrain propice à la construction neuve, compare le prix des dernières ventes immobilières autour du terrain, déduit ses charges (matériaux, main d’oeuvre, normes) et établit ainsi son prix de vente.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/prix_logements_neufs.jpeg&quot; alt=&quot;Slide d&#39;explication de l&#39;envolée du prix des logements neufs : on y retrouve les éléments cités dans le paragraphe plus haut&quot;&gt;&lt;figcaption&gt;Slide d’explication de l’envolée du prix des logements neufs. Source : Jacques Friggit IGEDD, audition par la mission d’information relative à la crise du logement par le Sénat, Février 2024&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;qu%E2%80%99anticiper-pour-les-mois-%C3%A0-venir-(mars-2025)&quot; tabindex=&quot;-1&quot;&gt;Qu’anticiper pour les mois à venir (Mars 2025)&lt;/h2&gt;
&lt;p&gt;Les taux vont cesser de diminuer car la situation européenne et le niveau d’endettement de l’Etat Français entraînent une augmentation inédite de l’OAT 10 ans.
Les prix de vente sont toujours déconnectés des salaires. Des taux stagnants, un pouvoir d’achat immobilier toujours faible entraînent l’immobilier ancien dans une tendance longue baissière.&lt;/p&gt;
&lt;h2 id=&quot;les-ressources-indispensables-pour-suivre-l%E2%80%99immobilier&quot; tabindex=&quot;-1&quot;&gt;Les ressources indispensables pour suivre l’immobilier&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.igedd.developpement-durable.gouv.fr/prix-immobilier-evolution-a-long-terme-a1048.html&quot;&gt;la newsletter de l’évolution à long terme des prix et volumes de l’immobilier par l’IGEDD, représenté par Jacques Friggit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/RaphaelVignes&quot;&gt;les analyses immobilières de Raphaël Vignes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://politiquedulogement.com/&quot;&gt;la newsletter du site “Politique du logement”, un think tank de spécialistes de l’économie du logement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.banque-france.fr/fr/statistiques/credit/credits-aux-particuliers-2025-01&quot;&gt;l’analyse mensuelle de l’octroi des crédits aux particuliers de la Banque de France&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.statistiques.developpement-durable.gouv.fr/conjoncture-de-limmobilier-resultats-au-quatrieme-trimestre-2024&quot;&gt;l’analyse trimestrielle de la conjoncture immobilière par le service Données et Etudes Statistiques du Ministère de la Transition Ecologique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data.ecb.europa.eu/data/datasets/BSI/BSI.M.FR.N.A.A22.A.I.U2.2250.Z01.A&quot;&gt;le jeu de données “Lending for house purchase vis-a-vis euro area households reported by MFIs excl. ESCB in France (annual growth rate), France, Monthly” de la BCE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data.ecb.europa.eu/data/datasets/MIR/MIR.M.FR.B.A2C.A.R.A.2250.EUR.N&quot;&gt;le jeu de données “Bank interest rates - loans to households for house purchase (new business) - France, Monthly” de la BCE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data.ecb.europa.eu/data/datasets/RESR/RESR.Q.FR._T.N._TR.TVAL.4D0.TB.N.IX&quot;&gt;le jeu de données “Residential property prices, France, Quarterly” de la BCE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data.ecb.europa.eu/data/datasets/BLS/BLS.Q.FR.ALL.Z.H.H.F3.ZZ.D.FNET&quot;&gt;le jeu de données “Loan demand-Household, France, Quarterly” de la BCE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.insee.fr/fr/statistiques/serie/010760747&quot;&gt;l’indice d’évolution du prix des logements anciens se situant en zone B1, base 100 2015&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webstat.banque-france.fr/fr/catalogue/fm/FM.D.FR.EUR.FR2.BB.FRMOYTEC10.HSTA&quot;&gt;l’OAT 10 ans FR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webstat.banque-france.fr/fr/catalogue/mir1/MIR1.M.FR.R.A22RP.A.D.A.2254P.EUR.N&quot;&gt;le graphique de la durée moyenne des prêts à l’habitat pour l’acquisition d’une résidence principale par les primo-accédants, en année; de la Banque de France&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>La modélisation fonctionnelle avec UML</title>
    <link href="https://www.teotimepacreau.fr/blog/modelisation-fonctionnelle-uml/" />
    <updated>2025-01-19T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/modelisation-fonctionnelle-uml/</id>
    <content type="html">&lt;p&gt;Lors du cadrage d’un projet informatique, on procède à l’analyse des objectifs, l’analyse des règles métiers, l’analyse et la production d’exigences. Le cadrage est vital car il permet de guider la modélisation fonctionnelle à venir avant même d’entrevoir la mise en oeuvre technique.&lt;/p&gt;
&lt;p&gt;Qu’apporte UML ? UML(Unified Modeling Language) fourni un moyen de spécifier une modélisation mais surtout une base de dialogue, un language commun, à beaucoup d’intervenants dans un projet informatique. Son avantage repose avant tout sur la normalisation des visualisations compréhensibles aussi bien par un business analyst, qu’un développeur. Son utilité se retrouve tant dans les phases d’expression des besoins / spécifications pour produire un modèle de référence que dans les étapes ultérieures de développement notamment au travers de l’indications de classes utiles à la programmation objet.&lt;/p&gt;
&lt;p&gt;UML est particulièrement associé au &lt;a href=&quot;https://www.teotimepacreau.fr/blog/methodes-gestion-de-projet-informatique/&quot;&gt;développement en cascade&lt;/a&gt; et au cycle en V mais à toute son utilité en agilité puisqu’il facilite grandement la communication interne à l’équipe. Lorsqu’utilisé avec pragmatisme, UML peut fournir une base à chaque sprint en spécifiant les attentes fonctionnelles et l’intégration dans l’ensemble du système.&lt;/p&gt;
&lt;h2 id=&quot;diagramme-des-cas-d%E2%80%99utilisation&quot; tabindex=&quot;-1&quot;&gt;Diagramme des cas d’utilisation&lt;/h2&gt;
&lt;p&gt;UML s’intègre dans une démarche globale &lt;em&gt;d’investigation du besoin&lt;/em&gt; : il s’agit de s’imprégner des besoins métiers via des ateliers de travail, des &lt;a href=&quot;https://www.teotimepacreau.fr/essais/challenger-pratiques-transformation-organisationelle-par-le-design-de-services/&quot;&gt;entretiens semi-directifs&lt;/a&gt;, des observations in-situ, des user-journey.&lt;/p&gt;
&lt;p&gt;Une fois la matière récoltée et analysée, on peut utiliser UML pour décrire le comportement et les fonctions d’un système attendues par l’utilisateur, on utilise pour cela le diagramme des cas d’utilisation.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/uml_diagramme_cas_dutilisation.webp&quot; alt=&quot;Schéma détaillant un diagramme de cas d&#39;utilisation UML : on représente un acteur avec un bonhomme baton, un système avec un rectangle, un cas d&#39;utilisation avec un ovale&quot;&gt;&lt;figcaption&gt;Exemple minimal de diagramme de cas d’utilisation UML&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Un cas d’utilisation est précisé à la fois par :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;em&gt;scénario&lt;/em&gt; qui représente les différentes enchaînements d’actions. Le scénario contient le déroulé de l’action avec succès, les enchaînements alternatifs, les enchaînements  d’erreurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/uml_scenario_cas_dutilisation.webp&quot; alt=&quot;Schéma détaillant un scenario UML : on représente chaque étape via un point, en indiquant les erreurs, les parcours alternatifs...&quot;&gt;&lt;figcaption&gt;Exemple minimal de scénario de cas d’utilisation UML&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;une fiche de description textuelle du cas d’utilisation sous la forme du tableau ci-dessous.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sommaire d’identification&lt;/th&gt;
&lt;th&gt;Description des scénarios&lt;/th&gt;
&lt;th&gt;Exigences non fonctionnelles&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;titre, résumé, date de création, version, responsable, acteurs&lt;/td&gt;
&lt;td&gt;préconditions, enchaînements, enchaînements alternatifs, les enchaînements d’erreurs, postconditions&lt;/td&gt;
&lt;td&gt;fréquence, volumétrie, disponibilité, fiabilité, confidentialité, performance attendue, les contraintes d’UX/UI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;comment-repr%C3%A9senter-le-sc%C3%A9nario-nominal-et-%C3%A0-quoi-sert-il-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment représenter le &lt;strong&gt;scénario nominal&lt;/strong&gt; et à quoi sert-il ?&lt;/h3&gt;
&lt;p&gt;Le scénario nominal est une description textuelle des enchaînements du scénario. On le représente dans un tableau à double colonne en liste ordonnée.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Acteur&lt;/th&gt;
&lt;th&gt;Système étudié&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Client arrive en caisse avec des articles qu’il souhaite acheter&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Le caissier scan chaque article&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;3. Le terminal détermine le prix de l’article&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Après avoir scanné tous les articles, le caissier indique que la vente est terminée&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;5. Le terminal calcule et affiche le montant total de la vente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;le-diagramme-de-s%C3%A9quences&quot; tabindex=&quot;-1&quot;&gt;Le diagramme de séquences&lt;/h2&gt;
&lt;p&gt;Le diagramme de séquences permet de décrire COMMENT se déroulent les intéractions entre les différents acteurs ou objets impliqués dans une procédure.
Concrètement, ils servent à identifier les &lt;em&gt;classes&lt;/em&gt; requises par le système et le comportement des &lt;em&gt;objets&lt;/em&gt; au cours des intéractions.&lt;/p&gt;
&lt;p&gt;Ces &lt;em&gt;classes&lt;/em&gt; et &lt;em&gt;objets&lt;/em&gt; sont indispensable dans un contexte de Programmation Orientée Objet : il s’agit d’un style de programmation basant le code sur des objets. L’objet appartient à une classe, classe qui est définie par des propriétés et associée à des méthodes (des fonctions propres à la classe).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/poo_classe.png&quot; alt=&quot;Capture d&#39;écran détaillant le code d&#39;une classe avec ses propriétés et méthodes propres&quot;&gt;&lt;figcaption&gt;Une classe en code, extrait de la vidéo de Julien Code (source en bas de page)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Le diagramme de séquence place à sa tête les classes suivies de haut en bas par une &lt;em&gt;ligne de vie&lt;/em&gt;. On spécifie chaque action via l’appel d’une méthode associée à la classe en question. Les méthodes prennent des paramètres comportant les variables à passer aux fonctions. On peut représenter de façon graphique une condition, une boucle, un appel d’une fonction à une autre.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/uml_diagramme_sequence.webp&quot; alt=&quot;Représentation graphique d&#39;un diagramme de séquence introduisant une interface programmatique entre un utilisateur et une cafetière pour faire un café&quot;&gt;&lt;figcaption&gt;Exemple de diagramme de séquence UML&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;L’idée n’est pas de spécifier le code à venir, car c’est le rôle des développeurs, mais de planifier les classes et leurs différentes intéractions qui régiront le code.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;Livre “UML 2.5 par la pratique”; Pascal ROQUES, éditions Eyrolles, 2018.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fr.wikibooks.org/wiki/Programmation_UML/Diagramme_de_s%C3%A9quences/&quot;&gt;https://fr.wikibooks.org/wiki/Programmation_UML/Diagramme_de_séquences/&lt;/a&gt;&lt;/p&gt;
&lt;div id=&quot;AZ4gwy-ZGC4/&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/AZ4gwy-ZGC4/&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Introduction à différentes méthodes de conduite de projet informatique</title>
    <link href="https://www.teotimepacreau.fr/blog/methodes-gestion-de-projet-informatique/" />
    <updated>2024-12-27T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/methodes-gestion-de-projet-informatique/</id>
    <content type="html">&lt;h2 id=&quot;a-l%E2%80%99origine-%3A-le-mod%C3%A8le-en-cascade-(waterfall)&quot; tabindex=&quot;-1&quot;&gt;A l’origine : le modèle en cascade (waterfall)&lt;/h2&gt;
&lt;p&gt;Les premiers projets informatiques ont utilisés des méthodes issues des sciences de l’ingénieur en s’inspirant des manières de mener un projet de construction. Cela a introduit une culture de la contrainte due à des coûts importants en phase de réalisation et à l’impossibilité de modifier l’ouvrage en cours de route typique aux projets immobiliers.
Le modèle en cascade conditionne le début de chaque phase à la finalisation complète de la phase précédente :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Exigences : récolte de l’expression de besoins auquel le produit doit répondre (livrable = document d’expression des besoins)&lt;/li&gt;
&lt;li&gt;Analyse : formalisation des exigences dans un cahier des charges fonctionnel (livrable = cahier des charges fonctionnel)&lt;/li&gt;
&lt;li&gt;Conception : planification du développement et rédaction des spécifications techniques (livrable = modèles &amp;amp; spécifications techniques)&lt;/li&gt;
&lt;li&gt;Mise en œuvre : réalisation du produit (livrable = le produit)&lt;/li&gt;
&lt;li&gt;Validation : tests du produit avec l’usager pour vérifier la conformité aux exigences (livrable = tests)&lt;/li&gt;
&lt;li&gt;Mise en service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le modèle a rapidement montré ses limites car la nature immatérielle des projets informatiques permet des approches impossibles à d’autres secteurs : possibilité de livrer un projet &lt;em&gt;viable au minimum&lt;/em&gt; pour construire les fonctionnalités en avançant, réversibilité, coûts logistiques et matériels inexistants…
Le défaut principal de ce modèle est de penser que le client est pleinement conscient de l’ensemble des fonctionnalités qu’il attend avant même d’avoir eu le produit entre les mains. Le second défaut est l’allergie du modèle aux changements en cours de projet contraire à ce qui a été déterminé dans les phases précédentes.&lt;/p&gt;
&lt;h2 id=&quot;le-cycle-en-v&quot; tabindex=&quot;-1&quot;&gt;Le cycle en V&lt;/h2&gt;
&lt;p&gt;Le cycle en V apparaît peu après le modèle en cascade et introduit une dimension supplémentaire : celle du &lt;em&gt;système&lt;/em&gt;. On pense le projet informatique comme un système global dans lequel les composants s’assemblent. Ceci requiert dans le flux descendant de distinguer une conception générale du système dans son ensemble, et une conception détaillée de chaque composant. Le développement se fait alors composant par composant. Le cycle en V apporte également une plus grande attention sur la vérification et la validation. Les tests unitaires et les tests d’intégration vérifient que les composants et le système fonctionnent conformément à la conception.&lt;/p&gt;
&lt;p&gt;Toutetois le modèle introduit un défaut principal : le risque de « surspécification ». Beaucoup de temps est dédié aux étapes de conception au détriment, parfois, des étapes de développement.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/cycle-en-v.png&quot; alt=&quot;Schéma détaillant les étapes dy cycle en V : investigation du besoin, specifications fonctionnelles, specifications techniques, développement, tests unitaires, tests d&#39;intégrations, recette&quot;&gt;&lt;figcaption&gt;Schéma du cycle en V&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;l%E2%80%99approche-agile&quot; tabindex=&quot;-1&quot;&gt;L’approche agile&lt;/h2&gt;
&lt;p&gt;L’approche agile s’est construite en réaction au modèle en cascade et à l’imprévisibilité des projets informatiques particulière au contexte des années 90. La période voyait en effet l’apparition et l’appropriation rapide de nouveaux langages de programmation (comme Visual Basic, Python, Ruby, Java, Javascript…), rendant &lt;a href=&quot;https://en.wikipedia.org/wiki/Timeline_of_programming_languages#1990s&quot;&gt;obsolètes certains langages au bout de quelques mois seulement&lt;/a&gt;.
Les auteurs du &lt;a href=&quot;https://agilemanifesto.org/&quot;&gt;manifeste agile&lt;/a&gt; estimaient que le taux important d’échecs des projets de développements logiciels était dû à la lourdeur des méthodes traditionnelles inspirées du génie civil notamment au travers du cycle de développement en cascade.
L’idée était également de lutter contre l’&lt;em&gt;effet tunnel&lt;/em&gt; (il s’agit d’un décrochage du lien entre le client et le développement du projet).&lt;/p&gt;
&lt;p&gt;Il s’agit donc d’un style de conduite de projet basé sur la collaboration entre des équipes autonomes et les clients.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le but :&lt;/strong&gt; impliquer au maximum le client et être très réactif à ses demandes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Méthode :&lt;/strong&gt; planification adaptative pilotée par l’utilisateur, reporting visuel en temps réel de l’avancement ainsi que des problèmes rencontrés, tests et ajouts de fonctionnalités en continu selon les demandes du clients, livraisons partielle pour chaque lots, amélioration continue.&lt;/p&gt;
&lt;p&gt;Agile est le terme chapeau qui regroupe les framework SCRUM, LEAN, KANBAN. Ce sont des cadres de travail pour mettre en place de l’agilité dans la gestion de projets.&lt;/p&gt;
&lt;h3 id=&quot;scrum&quot; tabindex=&quot;-1&quot;&gt;SCRUM&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Doctrine&lt;/strong&gt; : fondé sur la conviction que le développement est une succession d’activités qui ne peuvent être anticipées et planifiées.
Le projet est découpé en plusieurs &lt;em&gt;sprints&lt;/em&gt;, la priorisation des activités s’appuie sur des &lt;em&gt;artefacts&lt;/em&gt;, le rythme d’avancement s’appuie sur des &lt;em&gt;rituels&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;La méthode se veut incrémentale et itérative, les sprints peuvent donc être recommencés pour répondre à de nouvelles demandes client ou à l’apparition de nouvelles technologies.
Elle s’appuie sur des rôles précis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 SCRUM Master qui guide l’équipe à travers la méthode et est l’interlocuteur coordinateur au quotidien&lt;/li&gt;
&lt;li&gt;1 Product Owner garant de la vision client du produit, en charge de la définition des besoins du produit,  de la rédaction des spécifications, de la priorisation de la liste des fonctionnalités à développer.&lt;/li&gt;
&lt;li&gt;les équipes techniques&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sprints&lt;/strong&gt; : un sprint est une période de temps dédié au développement d’un lot de fonctionnalités.
Chaque sprint commence par une estimation du temps à passer et la planification des tâches, chaque sprint se termine par une rétrospective de ce qui a été achevé. Le sprint n’exprime pas un besoin de rapidité mais plutôt de période définie consacrée à 100% à une ou plusieurs briques fonctionnelles.
La livraison du lot de fonctionnalités au client se fait uniquement à la fin de chaque sprint.
Le sprint planning global englobe toutes les étapes et est issu du backlog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artefacts&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le backlog : liste priorisée des fonctionnalités à réaliser, cette liste est évolutive tout au long du projet.&lt;/li&gt;
&lt;li&gt;User Stories : format d’expression des fonctionnalités (en tant que… je veux… afin de…). Les User Stories peuvent être regroupées en Epics (amat de User Stories doublées d’un objectif).&lt;/li&gt;
&lt;li&gt;planning poker : il s’agit du chiffrage des user stories via une technique d’estimation de la charge de travail exprimée en points d’effort. La gamme des points est croissante et s’inspire de la suite de Fibonacci (0,5;1;2;3;5;8;13;20;30;50;100;200) car plus une charge est élevée plus sa valeur est incertaine.&lt;/li&gt;
&lt;li&gt;burndown chart : graphique partagé permettant de visualiser l’avancement du sprint en mettant en valeur la sommes des tâches restantes à faire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rituels&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le daily : meeting de 15 minutes tous les jours où chacun explique les tâches réalisées de la journée précédente, les problèmes bloquants et les tâches qui seront faites le jour présent&lt;/li&gt;
&lt;li&gt;le sprint planning : le PO présente les récits utilisateurs clés dernièrement récoltés et leur consolidation en blocs fonctionnels, un échange se tient avec l’équipe de développement pour définir le périmètre du prochain sprint.&lt;/li&gt;
&lt;li&gt;le sprint review qui a lieu à la fin de chaque sprint : chacun exprime ce qui a été accompli pendant le sprint, ce qui a changé, détermine que faire ensuite&lt;/li&gt;
&lt;li&gt;le raffinage du backlog : à partir des données consolidées, issues des échanges avec les utilisateurs, on présente et échange avec les équipes techniques sur les prochains items à inclure dans le backlog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Métriques de suivi de la performance :&lt;/strong&gt; temps pour accomplir un sprint et ampleur de la fonctionnalité réalisée&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adaptation au changement :&lt;/strong&gt; quand un sprint démarre on ajoute/enlève rien&lt;/p&gt;
&lt;h3 id=&quot;kanban&quot; tabindex=&quot;-1&quot;&gt;KANBAN&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Doctrine :&lt;/strong&gt; la visualisation des tâches augmente la transparence et la motivation de l’équipe
Contrairement à la méthode SCRUM où l’on livre les fonctionnalités seulement à la fin du sprint, avec Kanban on livre les fonctionnalités dès qu’elles sont complétées, sans tenir compte des plannings et dates donc en continu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visualisation :&lt;/strong&gt; toute la roadmap est visible et les tâches sont divisées en 3 : &lt;em&gt;to-do, WIP, done.&lt;/em&gt; On repart toujours du backlog pour attribuer les tâches sur le Kanban&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rituels :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;daily&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Métriques :&lt;/strong&gt; temps passé pour basculer une tâche de “to-do” à “done”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adaptation au changement :&lt;/strong&gt; les priorités peuvent changer à tout moment&lt;/p&gt;
&lt;h3 id=&quot;lean&quot; tabindex=&quot;-1&quot;&gt;LEAN&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Doctrine :&lt;/strong&gt; L’approche est basée sur celle du &lt;em&gt;Minimum Viable Product (MVP)&lt;/em&gt;, le but étant d’éliminer tout le superflus : que ce soit des fonctionnalités, des réunions, ou des boucles de feedback non-essentielles.
On livre donc un prototype avec le minimum de fonctionnalités et on adapte le produit en fonction des retours des utilisateurs, quitte à changer complètement l’idée de départ.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les décisions structurantes pour le projet (par ex: architecture logicielle) doivent être repoussées au plus tard possible&lt;/li&gt;
&lt;li&gt;placer des fonctionnalités de valeur le plus vite possible entre les mains du client&lt;/li&gt;
&lt;li&gt;les utilisateurs sont au centre de toutes les décisions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rituels :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;meeting réguliers visant à répondre aux questions “Que disent les données récoltées suite aux tests utilisateurs ? Comment cela affecte le produit ?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Métriques :&lt;/strong&gt; temps écoulé entre un feedback produit reçu et son implémentation&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adaptation au changement :&lt;/strong&gt; les priorités changent seulement s’il y a un groupement de feedback client en corrélation&lt;/p&gt;
&lt;h3 id=&quot;le-mode-produit&quot; tabindex=&quot;-1&quot;&gt;Le mode produit&lt;/h3&gt;
&lt;p&gt;Particulièrement appuyé sur le LEAN, le mode produit ajoute l’encapacitement et l’autonomisation des parties prenantes du projet.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Formation et accompagnement des porteurs du besoin à investiguer et vérifier l’existence de leur besoin/problématique sur le terrain (grille d’entretien, persona, parcours utilisateur…)&lt;/li&gt;
&lt;li&gt;Analyse en chambre de la matière récoltée et consolidation en feuille de route produit (vision, objectifs, grandes fonctionnalités clés, étapes, budget)&lt;/li&gt;
&lt;li&gt;Création d’un découpage du produit à partir du besoin des utilisateurs (Personas -&amp;gt; User Stories -&amp;gt; User Story Mapping -&amp;gt; Spécification fonctionnelles). Consolidation en backlog.&lt;/li&gt;
&lt;li&gt;Conception et livraison du MVP pour le placer le plus rapidement possible entre les mains de l’utilisateur&lt;/li&gt;
&lt;li&gt;Séances de tests, observations et recueil des feedbacks des usagers. Ajout des fonctionnalités en conséquence dans le backlog. Cycle de développement. A recommencer autant de fois que nécessaire.&lt;/li&gt;
&lt;li&gt;Dès les premiers tests, on met en places métriques produit pour vérifier l’atteinte de l’impact souhaité.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Méthode pour définir des métriques produit :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thématique&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;Awareness&lt;/td&gt;
&lt;td&gt;Comment notre produit est-il connu ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Acquisition&lt;/td&gt;
&lt;td&gt;D’où viennent les utilisateurs avant d’être sur le produit ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Activation&lt;/td&gt;
&lt;td&gt;A quelle vitesse les utilisateurs trouvent-ils de la valeur dans notre produit ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rétention&lt;/td&gt;
&lt;td&gt;Pourquoi les utilisateurs quittent-ils l’application ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recommandation&lt;/td&gt;
&lt;td&gt;Pourquoi les utilisateurs recommanderaient notre application ?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;Livre “Vade-mecum de l’informatique contemporaine”; Eva et Henri LAUDE, Christian GOGLIN, éditions ENI, 2024.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://agilemanifesto.org/&quot;&gt;https://agilemanifesto.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ineumann.fr/docs/divers/agile_scrum&quot;&gt;https://www.ineumann.fr/docs/divers/agile_scrum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fr.wikipedia.org/wiki/M%C3%A9thode_agile&quot;&gt;https://fr.wikipedia.org/wiki/Méthode_agile&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://fr.wikipedia.org/wiki/Scrum_(d%C3%A9veloppement)&quot;&gt;https://fr.wikipedia.org/wiki/Scrum_(développement)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://steady.space/blog/comparing-scrum-kanban-lean/&quot;&gt;https://steady.space/blog/comparing-scrum-kanban-lean/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Générer un flux RSS pour quasiment n&#39;importe quel site web</title>
    <link href="https://www.teotimepacreau.fr/blog/g%C3%A9n%C3%A9rer-un-flux-rss-pour-nimporte-quel-site-web/" />
    <updated>2024-12-08T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/g%C3%A9n%C3%A9rer-un-flux-rss-pour-nimporte-quel-site-web/</id>
    <content type="html">&lt;p&gt;Un flux RSS est une technique de communication qui permet de diffuser de l’information et suivre des sources d’information sur le Web. Celui-ci suit en continu les mises à jour d’un site web et partage, en format ouvert, l’intégralité du contenu récemment publié.
L’inconvénient majeur du RSS est le fait qu’aujourd’hui peu de sites web proposent un flux RSS. Les flux algorithmiques issus de la vague des réseaux sociaux des années 2010 ainsi que &lt;a href=&quot;https://www.theverge.com/23778253/google-reader-death-2013-rss-social&quot;&gt;l’abandon prémédité par les géants du web des technologies rendant accessibles l’utilisation du RSS au plus grand nombre&lt;/a&gt;, dans une optique de financiarisation de l’information, ont eu pour effet de réléguer les flux RSS au second plan.
Dans le contexte actuel de &lt;a href=&quot;https://www.lemonde.fr/pixels/article/2024/10/06/pour-les-reseaux-sociaux-la-fin-d-un-regne_6344843_4408996.html&quot;&gt;fragmentation des plateformes sociales&lt;/a&gt;, les flux web sont une formidable opportunité de reprendre le contrôle sur les informations que l’on souhaite recevoir : gratuité, pas d’algorithme, pas de dépendance à une plateforme en particulier, intéropérabilité. Les avantages sont nombreux.&lt;/p&gt;
&lt;p&gt;Les flux RSS sont générés traditionnellement par le concepteur du site web, et exposés via un lien ou une icône &lt;img style=&quot;display: inline; width: 1rem; height: 1rem; color: var(--txt);&quot; src=&quot;data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%20fill%3D%22%23000000%22%20viewBox%3D%220%200%20256%20256%22%3E%3Cpath%20d%3D%22M106.91%2C149.09A71.53%2C71.53%2C0%2C0%2C1%2C128%2C200a8%2C8%2C0%2C0%2C1-16%2C0%2C56%2C56%2C0%2C0%2C0-56-56%2C8%2C8%2C0%2C0%2C1%2C0-16A71.53%2C71.53%2C0%2C0%2C1%2C106.91%2C149.09ZM56%2C80a8%2C8%2C0%2C0%2C0%2C0%2C16A104%2C104%2C0%2C0%2C1%2C160%2C200a8%2C8%2C0%2C0%2C0%2C16%2C0A120%2C120%2C0%2C0%2C0%2C56%2C80Zm118.79%2C1.21A166.9%2C166.9%2C0%2C0%2C0%2C56%2C32a8%2C8%2C0%2C0%2C0%2C0%2C16A151%2C151%2C0%2C0%2C1%2C163.48%2C92.52%2C151%2C151%2C0%2C0%2C1%2C208%2C200a8%2C8%2C0%2C0%2C0%2C16%2C0A166.9%2C166.9%2C0%2C0%2C0%2C174.79%2C81.21ZM60%2C184a12%2C12%2C0%2C1%2C0%2C12%2C12A12%2C12%2C0%2C0%2C0%2C60%2C184Z%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E&quot;&gt;. Quand ils ne sont pas exposés, il est possible de les chercher manuellement dans l’inspection du code de la page à l’intérieur de la balise &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; à la recherche de la ligne &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot; href=&amp;quot;/feed/feed.xml&amp;quot; title=&amp;quot;titre du flux&amp;quot; type=&amp;quot;application/atom+xml&amp;quot;/&amp;gt;&lt;/code&gt;. Une autre méthode consiste à chercher dans l’URL en ajoutant &lt;code&gt;rss.xml&lt;/code&gt; ou &lt;code&gt;feed.xml&lt;/code&gt; souvent à la racine du site. On commence ici à toucher aux formats de génération des flux : un flux web est toujours rendu accessible via un fichier XML, XML est un format de fichier conçu pour afficher des données, celui-ci ne comporte pas d’&lt;a href=&quot;https://www.arthurperret.fr/cours/serialisation.html&quot;&gt;éléments prédéfinis mais une série de règles de syntaxe qui permettent de créer des langages particuliers avec leurs propres élément&lt;/a&gt;. &lt;a href=&quot;https://www.arthurperret.fr/blog/2022-11-18-le-retour-des-flux-web-et-pas-que-rss.html&quot;&gt;Arthur Perret parle avec justesse de flux web plutôt que de flux RSS&lt;/a&gt; car il existe différents formats de génération de flux : les flux RSS, Atom, JSON…&lt;/p&gt;
&lt;p&gt;En utilisant les flux web on se rend compte assez rapidement d’un écueil majeur : que faire quand le site ne propose pas de flux ?&lt;/p&gt;
&lt;h2 id=&quot;rss-proxy%2C-un-outil-open-source-permettant-de-cr%C3%A9er-un-flux-rss-ou-atom-pour-quasiment-tous-les-sites-web&quot; tabindex=&quot;-1&quot;&gt;RSS-Proxy, un outil open source permettant de créer un flux RSS ou Atom pour quasiment tous les sites web&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/damoeb/rss-proxy&quot;&gt;RSS-Proxy&lt;/a&gt; analyse la structure HTML d’un site visé et génère un flux. Il est possible de souscrire à ce flux depuis n’importe quel lecteur de flux, comme &lt;a href=&quot;https://github.com/miniflux/v2&quot;&gt;Miniflux, un lecteur de flux open source, gratuit et intuitif&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://github.com/damoeb/rss-proxy/raw/master/docs/rssproxy-candidates.png&quot; alt=&quot;Capture d&#39;écran de l&#39;interface de génération de flux RSS via RSS Proxy&quot;&gt;&lt;figcaption&gt;Interface de génération de flux via RSS-Proxy&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/interface-miniflux.png&quot; alt=&quot;Capture d&#39;écran de l&#39;interface de Miniflux&quot;&gt;&lt;figcaption&gt;Interface de Miniflux&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;RSS-Proxy nécessite d’être hébergé par l’utilisateur pour être utilisé. Si vous ne savez pas comment héberger un service, je vous renvoie vers mon article &lt;em&gt;beginner-friendly&lt;/em&gt; &lt;a href=&quot;https://www.teotimepacreau.fr/blog/heberger-soi-meme-des-applications/&quot;&gt;“Héberger soi même des applications”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L’outil permet de sélectionner un flux en particulier parmis ceux trouvés dans la page et de filtrer sur une expression particulière.&lt;/p&gt;
&lt;h2 id=&quot;comment-l%E2%80%99installer-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment l’installer ?&lt;/h2&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker pull damoeb/rss-proxy:2.1
docker run -p 8080:8080 -e APP_API_GATEWAY_URL=https://foo.bar -it damoeb/rss-proxy:2.1 #on remplace la variable d&#39;environnement APP_API_GATEWAY_URL par l&#39;IP ou le nom de domaine que l&#39;on souhaite exposer pour RSS Proxy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans la pratique RSS-Proxy génère une URL persistente exposant le flux généré. Notre lecteur de flux doit pouvoir accéder à cette URL. Dans le cas où l’on héberge soi-même son lecteur de flux, il faut impérativement prévoir un moyen pour que les deux containers puissent communiquer. En raisonnement “réseau” on souhaite un pont réseau car les containers sont, par défaut, isolés les uns des autres et ne peuvent communiquer pour prévenir des problèmes de sécurité.
Docker fournit nativement un réseau &lt;em&gt;bridge&lt;/em&gt; : il s’agit d’un pont réseau pour connecter les containers entre eux. Ceux-ci vont communiquer via une plage IP privée. Il est nécessaire de connecter à ce réseau notre lecteur de flux pour qu’il puisse requêter l’URL contenant le flux généré.&lt;/p&gt;
&lt;h2 id=&quot;un-peu-d%E2%80%99histoire-des-flux-web&quot; tabindex=&quot;-1&quot;&gt;Un peu d’histoire des flux web&lt;/h2&gt;
&lt;p&gt;Aaron Swartz a contribué, en 2000, à 14 ans, à l’élaboration de la spécification 1.0 du format RSS. Il était convaincu par la nécessité de libérer l’information et de la rendre accessible au plus grand nombre. A contrecourant des tendances commerciales et scientifiques visant à restreindre l’accès à l’information derrière des paywall.
La spécification RSS reste ambigue en terme de balisage des inforations. Le format Atom a été introduit en 2005 pour unifier le balisage et causer moins de problèmes de compatibilité. &lt;a href=&quot;https://kevincox.ca/2022/05/06/rss-feed-best-practices/&quot;&gt;Un article d’autorité conseille de privilégier le format de flux Atom&lt;/a&gt;.
Le format de flux JSON a été introduit en 2015 mais celui-ci souffre d’avoir été introduit trop tard pour concurrencer les formats RSS et ATOM et trop tôt pour être supporté par l’ensemble des lecteurs de flux web. &lt;a href=&quot;https://github.com/manton/JSONFeed&quot;&gt;Le repo Github du format n’est plus maintenu depuis 2020&lt;/a&gt;. &lt;a href=&quot;https://www.jsonfeed.org/version/1/&quot;&gt;La spécification du format JSON&lt;/a&gt; propose pourtant de nombreuses fonctionnalités intéressantes, comme la possibilité d’afficher l’article suivant directement dans le flux, montrer les favicons, bannières et autres images, d’afficher les tags d’un article… Mais les lecteurs de flux seront-ils mis à jour pour afficher toutes ces nouvelles informations ?&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Comment challenger les pratiques de transformation organisationelle par le design de services ?</title>
    <link href="https://www.teotimepacreau.fr/essais/challenger-pratiques-transformation-organisationelle-par-le-design-de-services.html" />
    <updated>2024-11-14T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/essais/challenger-pratiques-transformation-organisationelle-par-le-design-de-services.html</id>
    <content type="html">&lt;img style=&quot;  margin-block: var(--rythme);
; mix-blend-mode: luminosity;&quot; src=&quot;https://www.teotimepacreau.fr/img/design_de_services_transformation_organisationnelle.png&quot; alt=&quot;Photographie dégradée en ASCII de Sherman Fairchild qui rend visite au centre de R&amp;D de l&#39;entreprise Fairchild avec Gordon Moore et Robert Noyce, 1965&quot;&gt;
  &lt;p&gt;
    Dans ses travaux fondateurs sur l’innovation, Schumpeter (1939) dissocie
    l’innovation des produits, des procédés et des marchés. Il explique que
    l’innovation des procédés transforme en profondeur les modalités de travail
    et d’organisation à l’intérieur des firmes. Dans notre contexte actuel, où
    &lt;a href=&quot;https://www.insee.fr/fr/statistiques/4277675?sommaire=4318291&quot;&gt;l’essentiel des emplois provient d’une activité de service&lt;/a&gt;, c’est l’&lt;em&gt;appropriation&lt;/em&gt; des nouvelles méthodes au sein de
    l’organisation qui permet de discerner si une innovation débouche réellement
    sur un changement transformateur. Norbert Alter, théoricien français de
    l’innovation organisationnelle, fait écho à cette appropriation en ces
    termes :
    &lt;em&gt;“l’innovation est l’appropriation par le corps social de l’invention en
      question, les inventions doivent donc venir du corps social concerné pour
      qu’elles puissent être appropriés en innovation.”&lt;/em&gt;
    Gary Hamel, spécialiste du conseil en stratégie et professeur à la Harvard
    Business School, défend que, pour être performant dans la durée, il ne
    suffit pas d’innover au niveau des produits, des services et des processus
    mais qu’il s’agit d’innover aussi au niveau de l’organisation et des
    pratiques de management.
  &lt;/p&gt;
  &lt;p&gt;
    Les démarches de transformation organisationnelles sont indispensables pour
    réunir les conditions nécessaires à l’implantation durable d’un changement
    dans une organisation, cependant, celles-ci souffrent souvent d’approches
    descendantes, menées parfois par des professionnels qui ne mesurent pas
    l’importance d’impliquer les usagers dans les projets de changement. Alors,
    comment challenger les pratiques de transformation organisationnelle ?
  &lt;/p&gt;

&lt;h2 id=&quot;i.-méthodes-de-transformation&quot;&gt;I. Méthodes de transformation&lt;/h2&gt;
&lt;h3 id=&quot;lapproche-courante-de-transformation-organisationnelle&quot;&gt;L’approche courante de transformation organisationnelle
&lt;/h3&gt;
&lt;p&gt;L’approche traditionnelle d’un consultant en transformation organisationnelle
  est souvent contrainte par trois facteurs : le coût du projet, le temps
  imparti et la qualité attendue. Les méthodes varient en fonction des sujets
  mais se structurent autour d’une chronologie similaire :
&lt;/p&gt;
&lt;h4 id=&quot;réception-de-la-commande&quot;&gt;1. Réception de la commande&lt;/h4&gt;
&lt;p&gt;
  La commande exprimée provient souvent de la direction ou du niveau managérial
  de l’organisation en question. Elle reflète le point de vue d’une partie des
  parties prenantes concernées par le sujet : le niveau décisionnel. Il arrive
  que le consultant questionne le commanditaire pour obtenir davantage
  d’informations sur le détail de la commande mais celle-ci est très rarement
  requestionnée dans sa pertinence. Il n’y a généralement pas d’instance ou de
  moment ritualisé propice à la qualification de la commande entre les
  commanditaires et l’équipe de consultant. Le périmètre d’intervention et les
  objectifs principaux sont tout de même fixés en accord avec le commanditaire.
&lt;/p&gt;
&lt;h4 id=&quot;diagnostic&quot;&gt;2. Diagnostic&lt;/h4&gt;
&lt;p&gt;
  L’étape du diagnostic est une analyse profonde des facteurs ayant une
  influence sur la problématique. Celle-ci s’effectue souvent à distance à
  l’appui de documents communiqués par le commanditaire ou recherchés par les
  soins du consultant (benchmarks, études de marchés, retours clients…). Le
  diagnostic se structure traditionnellement de manière chronologique. De
  nombreux outils d’analyse organisationnelle sont à disposition, leurs usages
  varient en fonction de la problématique étudiée.
&lt;/p&gt;
&lt;p&gt;
  Dans le cas d’un diagnostic visant à l’élaboration d’une stratégie
  organisationnelle à long terme, on peut retrouver la structuration suivante :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Étude de l’environnement externe de l’organisation au niveau macro via
    analyse PESTEL (prise en compte des facteurs Politiques, Économiques,
    Sociologiques, Technologiques, Environnementaux et Légaux)
  &lt;/li&gt;
  &lt;li&gt;Étude de l’environnement externe de l’organisation au niveau micro via le
    modèle des cinq forces de Porter. Ce modèle permet de déterminer l’intensité
    concurrentielle à laquelle l’organisation fait face. Chaque force se voit
    attribuer une note représentant une part d’intensité concurrentielle.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/cinq_forces_de_Porter.png&quot; title=&quot;Cinq forces de Porter&quot; alt=&quot;Schéma des Cinq forces de Porter : menace des nouveaux entrants, pouvoir de négociation des fournisseurs, menace des produits de substitution, pouvoir de négociation des clients, intensité concurrentielle&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;Cinq forces de Porter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ol start=&quot;3&quot; type=&quot;1&quot;&gt;
  &lt;li&gt;Étude de l’activité interne et détermination des Domaines d’Activités
    Stratégiques (DAS) porteurs d’avantages concurrentiels via la chaîne de
    valeur de Porter.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/chaine_de_valeur_de_Porter.png&quot; title=&quot;Chaîne de valeur de Porter&quot; alt=&quot;Schéma de la chaîne de valeur de Porter. Les activités de soutien sont l’infrastructure de l’entreprise, la gestion des ressources humaines, le développement technologique et les achats, elles sont organisées en ligne. Les activités principales sont la logistique externe, les opérations, la logistique interne, la commercialisation et les services, elles sont organisées en colonne. Toutes les activités entraînent de la marge&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;Chaîne de valeur de Porter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ol start=&quot;4&quot; type=&quot;1&quot;&gt;
  &lt;li&gt;Qualification des avantages concurrentiels identifiés via la matrice VRIO
    (l’avantage est-il créateur de Valeur, Rare, Imitable, Opérationnable)
  &lt;/li&gt;
  &lt;li&gt;Synthétisation des données récoltées en matrice Forces Faiblesses
    Opportunités Menaces
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;préconisations&quot;&gt;3. Préconisations&lt;/h4&gt;
&lt;p&gt;Élaboration d’un scenario de transformation a minima, c’est à dire utilisant
  le minimum de ressources possibles; et d’un scénario a maxima, réunissant
  toutes les conditions favorables. Formulation d’un plan d’action divisé en
  phases pour rendre actionnable les scénarios de transformation.
&lt;/p&gt;
&lt;h4 id=&quot;accompagnement-à-limplémentation-du-changement-préconisé&quot;&gt;4. Accompagnement à l’implémentation du changement préconisé
&lt;/h4&gt;
&lt;p&gt;
  Dans tout projet de transformation, il est nécessaire d’accompagner
  l’appropriation par les parties prenantes du changement en question. John
  Kotter, théoricien de renom de la conduite du changement a partagé un modèle
  en huit étapes appelé “roue de Kotter” :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Créer l’urgence pour démontrer le besoin d’adopter le changement.&lt;/li&gt;
  &lt;li&gt;Former une communauté de quelques personnes prêtes à tester le changement en
    repérant les individus prêts à expérimenter, puis en expérimentant sur de
    petits projets atteignables et enfin en partageant en public les effets
    constatés (&lt;a href=&quot;https://www.youtube.com/watch?v=6-z8_PwC648&quot;&gt;stratégie bottom-up&lt;/a&gt;).
  &lt;/li&gt;
  &lt;li&gt;Créer une vision à long terme pour clarifier les avantages du changement
    prévu.
  &lt;/li&gt;
  &lt;li&gt;Communiquer la vision.&lt;/li&gt;
  &lt;li&gt;Lister les quick-wins atteignables rapidement dans le projet.&lt;/li&gt;
  &lt;li&gt;Atteindre le premier quick-win pour obtenir un premier résultat.&lt;/li&gt;
  &lt;li&gt;Partager le premier résultat.&lt;/li&gt;
  &lt;li&gt;Ancrer le changement dans les pratiques à long terme des collaborateurs.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;les-limites-des-méthodes-traditionnelles-de-transformation-organisationnelle&quot;&gt;
  Les limites des méthodes traditionnelles de transformation organisationnelle
&lt;/h3&gt;
&lt;p&gt;
  Le modèle partagé précédemment repose sur un principe global : conceptualiser
  l’entièreté d’un projet de transformation depuis la commande exprimée (point
  A) vers une situation idéale (point B) et recommander un plan de
  transformation du point A au point B. Cependant, cette approche ne garantie en
  rien que :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;la capacité réelle de l’organisation à s’approprier le changement&lt;/li&gt;
  &lt;li&gt;la réponse apporté correspond bien à un besoin exprimé par l’ensemble des
    parties prenantes, et donc pas seulement à un besoin exprimé par les
    commanditaires
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C’est pourtant souvent la posture adoptée lors des pratiques de consulting :
  les praticiens ont tendance à proposer des solutions rapides et
  opérationnelles mais sans se rendre compte que ces solutions ne répondent pas
  dans les faits à la véritable problématique. La mise en œuvre de “bonnes
  pratiques” ou de produits tout faits qui fonctionnent dans d’autres
  organisations suscite peu l’engagement des collaborateurs de l’organisation
  ciblée.
&lt;/p&gt;
&lt;p&gt;La posture “lointaine” de consultant qui travaille en chambre sans forcément
  aller observer les sujets au plus près du terrain peine à raisonner avec les
  besoins réels des personnes concernées par le projet. Les solutions qui ne
  sont pas coconstruites et qui proviennent de l’externe ont beaucoup moins de
  chances d’être adoptées par les collaborateurs. On se retrouve alors avec des
  projets beaux sur le papier mais difficiles à incrémenter dans la réalité.
&lt;/p&gt;
&lt;p&gt;
  De plus, mener un projet de transformation sans questionner la commande
  initiale est dangereux. La posture de consulting traditionnelle incite trop
  souvent à aller directement aux solutions, sans prendre le temps de
  retravailler la problématique de départ avec les parties prenantes du sujet.
  Le consultant s’expose alors à un biais de focalisation sur l’objectif formulé
  par le commanditaire au détriment du besoin réel exprimé sur le terrain.
  L’actionnabilité réelle du projet de transformation par les équipes est
  rarement prise en compte.
&lt;/p&gt;
&lt;p&gt;
  Enfin, l’approche organisationnelle incite parfois à délivrer aux
  commanditaires les livrables uniquement en fin de mission : cela introduit un
  risque de rejet complet d’une démarche qui aurait été menée dans son entièreté
  là où des livrables partiels livrés tout au long du projet permettent de
  corriger la démarche en cours de route. Les sciences du management incitent
  peu à se tourner vers des preuves de concepts tangibles, qui sont pourtant une
  opportunité réelle de fédérer les équipes autour d’un changement :
&lt;/p&gt;


    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;On nous apprend à valoriser les idées au-dessus de l’action, les choses spirituelles au dessus des choses matérielles, le conceptuel au-dessus du pragmatique et la logique au-dessus de l’intuition.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BORJA DE MOZOTA, Brigitte. &lt;em&gt;Quarante ans de recherche en design management : une revue de littérature et des pistes pour l’avenir.&lt;/em&gt; Sciences du design n°7 : Design Management. Presses Universitaires de France, 2018, p.28-45&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    

&lt;h3 id=&quot;le-design-de-service-quest-ce-que-cest&quot;&gt;
  Le design de services, qu’est-ce que c’est ?
&lt;/h3&gt;
&lt;p&gt;
  Le design de services est une approche qui consiste à concevoir en plaçant au
  centre le besoin des usagers. La discipline s’appuie sur une méthode
  itérative, basée sur la collaboration, constituée en double diamant :
&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/methode_design.png&quot; title=&quot;Méthode du design de services&quot; alt=&quot;Schéma de la méthode du design de services en double diamant : immersion, affinage de la problématique, co-création, prototypage, test. Toutes les étapes impaires entraînent une ouverture et toutes les étapes impaires entraînent un resserrement.&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;Méthode du design de services&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Immersion : récolte des données en lien avec la problématique au plus près
    des parties prenantes (interviews, persona, parcours utilisateur)
  &lt;/li&gt;
  &lt;li&gt;Affinage de la problématique : travail en chambre d’analyse des données
    récoltées, affinage possible de la problématique de départ en fonction des
    données récoltées, identification des axes de travail pouvant répondre à la
    problématique
  &lt;/li&gt;
  &lt;li&gt;Co-création : en collaboration avec les parties prenantes, plusieurs
    propositions concrètes sont imaginées pour répondre aux pistes de travail.
    Le but n’est pas tant de générer des idées mais surtout d’inclure les
    parties prenantes au cœur du processus de conception (storyboard, mindmap…)
  &lt;/li&gt;
  &lt;li&gt;Prototypage : conception à échelle réduite d’une preuve de concept, testable
    à moindre coût (scénario d’usage, wireframe, A/B testing…)
  &lt;/li&gt;
  &lt;li&gt;Test : l’expérimentation permet de tester la viabilité des prototypes avant
    de les déployer à grande échelle. L’erreur fait partie intrinsèque de la
    méthode, le but est de confronter le prototype à la réalité du terrain et de
    l’affiner en fonction des constats.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  La méthode est itérative, il est donc possible de retourner à une étape
  précédente si besoin. Elle est aussi adaptable en fonction des contextes, il
  s’agit avant tout d’une démarche à adopter plutôt que des règles fixes à
  suivre.
&lt;/p&gt;
&lt;p&gt;La grande force de la méthode repose sur plusieurs fondamentaux :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;&lt;strong&gt;L’obsession de l’usage&lt;/strong&gt; : la valeur apportée aux
    utilisateurs est centrale tout au long de la démarche. La collaboration en
    continu avec les usagers permet de s’assurer que le projet répond à la
    problématique et s’adapte aux ajustements repérés sur le terrain. Les
    projets design ont ainsi très peu de chances de dévier de le problématique
    visée et ils atterrissent toujours en une preuve de concept actionnable.
    C’est un garde-fou pour mener des projets concrets et appropriables.
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Le questionnement de la commande&lt;/strong&gt; : en avant-projet, la
    problématique de départ est systématiquement requestionnée avec les porteurs
    de projet. Le but est d’accompagner les commanditaires à formaliser des
    besoins non-exprimés lors de la sollicitation. Le but est également de
    qualifier le besoin pour comprendre ce que contient la commande, dans quel
    contexte elle s’inscrit, par qui et comment elle est portée, ainsi que les
    moyens qui risquent d’être requis pour y répondre. En bref, l’idée est de
    basculer du “Comment allons-nous faire ?” au “Pourquoi le faisons-nous ?”.
    Cela permet de s’assurer que les porteurs de projet prennent en compte les
    éléments englobants la demande (contexte, causes, usagers, impacts…) et
    partagent entre eux la même vision du problème. Cela permet également de
    mesurer si l’utilisation du design de service est pertinente ou non à la vue
    du problème.
    &lt;a href=&quot;https://www.linkedin.com/posts/sofia-martinez-ruiz_etatlin-activity-6971074200878870529-OO-q?utm_source=share&amp;amp;utm_medium=member_desktop&quot;&gt;Concrètement cette étape peut prendre la forme d’une séance d’échange à
      base de multiples “Pourquoi ?”&lt;/a&gt;. Souvent la problématique s’élargie à l’issue de l’échange.
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;La méthode essai-erreur&lt;/strong&gt; : porter une culture du « faire »
    et des solutions sur-mesure plutôt qu’une culture du rapport de
    préconisation garantie l’appropriation du projet et l’ancrage dans la
    réalité.
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;La frugalité&lt;/strong&gt; : plutôt qu’une contrainte, se forcer à penser
    avec des moyens limités pousse à optimiser les ressources consacrées au
    projet et à se tourner vers des solutions pragmatiques.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;les-limites-des-méthodes-de-design-de-service-en-milieu-organisationnel&quot;&gt;
  Les limites des méthodes de design de service en milieu organisationnel
&lt;/h3&gt;
&lt;p&gt;
  Le design de services en milieu organisationnel apporte également ses limites
  :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;peu de prise en compte des marges de flexibilité réelles de l’organisation
    concernée : comités de pilotages, formalisme des procédures, méthodes
    figées, culture de l’organisation, résistance au changement…
  &lt;/li&gt;
  &lt;li&gt;sous-estimation de l’impact des orientations du top management sur les
    réalités du projet.
  &lt;/li&gt;
  &lt;li&gt;pas d’analyse des composantes organisationnelles telles que les modes de
    décision, les instances de pouvoir, l’inertie organisationnelle ainsi que la
    capacité réelle des équipes à faire vivre la transformation.
  &lt;/li&gt;
  &lt;li&gt;la méthode du design de services est peu habituée aux contraintes de temps,
    de rentabilité et de concurrence.
  &lt;/li&gt;
  &lt;li&gt;un fonctionnement peu compatible avec le mode projet : difficile d’établir
    des indicateurs de suivi certifiant que le projet ne va pas dans le mur.
  &lt;/li&gt;
&lt;/ul&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Le manque d’intérêt et même quelquefois le rejet par les designers du management et de la mesure de la valeur de leur activité. Or, en gestion, pour exister et être tangible, il faut mesurer. Dans la pratique, les designers auront tendance à se méfier du pouvoir des chiffres et à critiquer le business vu comme la seule recherche du profit à court terme.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BORJA DE MOZOTA, Brigitte. &lt;em&gt;Quarante ans de recherche en design management : une revue de littérature et des pistes pour l’avenir.&lt;/em&gt; Sciences du design n°7 : Design Management. Presses Universitaires de France, 2018, p.28-45&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;p&gt;On se retrouve alors avec des projets de design de service certes ancrés dans
  la réalité et actionnables mais qui ne sont pas viables sur le long terme ou
  alors qui n’entrent pas en cohérence avec les objectifs et la stratégie de
  l’organisation.
&lt;/p&gt;
&lt;h2 id=&quot;ii.-doctrine-de-la-prédiction-à-lexpérimentation&quot;&gt;
  II. Doctrine : de la prédiction à l’expérimentation
&lt;/h2&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Le management est généralement orienté vers les questions d’efficience, là où le design se tourne vers celles touchant à la conception créative.[…] Pourtant, les approches centrées sur la gestion de l’innovation et des connaissances tendent à montrer qu’elles ne s’opposent pas nécessairement. Ainsi, l’activité innovante, génératrice de savoir, est souvent à la source d’une plus grande efficacité. Mais aussi, une approche trop centrée sur les indicateurs d’efficacité est une approche planant au-dessus du réel sans en comprendre les enjeux. En fait, le design et le management, tel que chacun devrait être exercé, se rencontrent dans leur approche concrète.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BLUM, Guillaume; COVA Véronique. Le design management en discussion.
&lt;em&gt;Sciences du design n°7 : Design Management&lt;/em&gt;. Presses Universitaires de
France, 2018, p.21-27&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;p&gt;
  Prédire et planifier est une partie essentielle des sciences du management.
  Nous budgétisons, planifions les ressources, établissons tâche par tâche le
  découpage du projet… avec la certitude que l’on peut prédire en partie le
  futur. Cependant, avec des environnements changeant de plus en plus
  rapidement, il devient difficile de prédire précisément le résultat d’un
  projet. Les organisations bénéficient-elles d’années pour réfléchir à des
  changements de positionnement ? Les opérations de transformation ne se
  doivent-elles pas d’être rapides pour réagir à la concurrence ?
&lt;/p&gt;
&lt;p&gt;
  De plus, l’approche du consultant qui se contente de suggérer un ensemble de
  recommandations à atteindre sans accompagner, au moyen d’une posture
  collaborative, son “client” ne répond plus aux besoins des organisations. Car
  le consultant n’aura jamais :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;la vision complète de ce sur quoi travaille l’organisation&lt;/li&gt;
  &lt;li&gt;une compréhension totale du temps que prendra une mission et de ses
    dépendances
  &lt;/li&gt;
  &lt;li&gt;l’assurance que les ressources vont être réellement affectées face à ses
    préconisations
  &lt;/li&gt;
&lt;/ul&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Certains consultants ont tendance à proposer des solutions rapides et opérationnelles mais sans se rendre compte que ces solutions ne répondent pas dans les faits à la véritable problématique. Ils mettent en œuvre leurs idées trop rapidement, pour ensuite réaliser qu’elles ne sont finalement pas pertinentes, et repassent du temps facturé à retravailler sur cette même solution pour essayer de la rendre plus adaptée.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;MARCHAL, Aurélie citant Julia SCHAEPER qui présente un projet de
transformation du secteur de la santé, par le design, du NHS (Sécurité Sociale
britannique). &lt;em&gt;Innovation organisationnelle &amp;amp; transformation managériale par le design
thinking&lt;/em&gt;. Paris : CreateSpace Independent Publishing Platform, 2011, p.10&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;p&gt;
  Ainsi, face à l’imprévisibilité des projets et à un focus trop axé “solution”
  il est nécessaire :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;d’adopter une approche d’adaptation en continu&lt;/li&gt;
  &lt;li&gt;de passer de la culture de la “recommandation” à la culture du “faire”
  &lt;/li&gt;
  &lt;li&gt;d’anticiper, dès la réception de la commande, l’appropriation concrète de la
    transformation
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  Cette approche dynamique peut tirer son inspiration dans des approches telles
  que le &lt;em&gt;mode produit&lt;/em&gt; et le &lt;em&gt;design de services&lt;/em&gt;.
&lt;/p&gt;
&lt;h3 id=&quot;pourquoi-sinspirer-de-lapproche-mode-produit-pour-mener-un-projet-de-transformation-organisationnelle&quot;&gt;
  Pourquoi s’inspirer de l’approche “mode produit” pour mener un projet de
  transformation organisationnelle
&lt;/h3&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;en&quot;&gt;Regardless of where you sit in an organization, if you’re in a role that owns a project or program of any type (or a piece of one), you are working on a product. Your customers might be your coworkers, and you probably call your product development lifecycle a change management or project management framework. But regardless of how you describe it, your work still involves picking, designing, testing, and launching something for someone else to use. Kind of sounds like product development, no?&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;LOWE, Kristen. &lt;em&gt;Everyone is Building Something&lt;/em&gt;. Extrait de la
newsletter &lt;a href=&quot;https://workbravely.substack.com/p/everyone-is-building-something&quot;&gt;Work Bravely&lt;/a&gt;. 2024. [consulté le 20 Juin 2024].&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    

&lt;p&gt;Dans le champ de la transformation organisationnelle, l’objet du travail est rarement considéré comme un &lt;em&gt;produit&lt;/em&gt;. En effet, que ce soit à travers un cycle de développement de projet, un diagnostic ou un plan d’action stratégique, la posture commune est plutôt celle d’un &lt;em&gt;travailleur de la connaissance&lt;/em&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Le terme travailleur de la connaissance désigne un collaborateur dont le travail consiste à développer et utiliser du savoir en back office plutôt que de produire des marchandises ou des services. Celui-ci est apparu en premier dans l’ouvrage The Landmarks of Tomorrow 1959 de Peter Drucker - knowledge work&lt;/small&gt;
      &lt;/span&gt;
       qui analyse et qui confronte peu ses projections au terrain. Pourtant, adopter le &lt;em&gt;mode produit&lt;/em&gt; confère de nombreux avantages à un projet, et c’est ce que nous allons détailler ci-dessous. Mais qu’est-ce que le &lt;em&gt;mode produit&lt;/em&gt; ? &lt;a href=&quot;https://t-ziegelbecker.medium.com/a-summary-of-inspired-by-marty-cagan-9d94e1eeb4bd&quot;&gt;Marty Cagan, un des premiers théoriciens du mode produit&lt;/a&gt; explique que l’approche “produit” repose sur une fondation essentielle : pour construire quoique ce soit qui apporte de la valeur il faut en découvrir beaucoup sur la personne pour laquelle vous construisez. Il est nécessaire de
  tester les idées afin de séparer les idées bonnes des mauvaises avant
  d’engager le premier effort de production. Il reproche au modèle de gestion de
  projet traditionnel en
  &lt;a href=&quot;https://fr.wikipedia.org/wiki/Mod%C3%A8le_en_cascade&quot;&gt;cascade&lt;/a&gt;
  de placer la validation de l’usager beaucoup trop tard dans le processus du
  projet, ce qui a pour conséquence d’entraîner soit une validation totale ou un
  refus total du produit par l’usager. L’usager peut être n’importe quelle
  personne destinée à utiliser les fruits du projet : des collègues, un
  département, des fournisseurs, des clients…
&lt;/p&gt;
&lt;p&gt;
  Envisager un projet de transformation organisationnelle sous l’approche
  &lt;em&gt;produit&lt;/em&gt; permet de centrer l’approche sur le besoin réel des parties
  prenantes. En définissant les causes du problème avec les personnes concernées
  via des méthodes de co-construction, l’approche adoptée vise un but concret
  plutôt que la complétude d’un plan de conduite de projet, et il est bien plus
  probable que la solution soit utile. Même constat pour les livrables : les
  placer le plus tôt possible entre les mains de leurs usagers réels, même
  lorsqu’ils ne sont que peu aboutis, permet de s’assurer qu’ils répondent bien
  au besoin, et si ce n’est pas le cas un retour en travail en chambre avec les
  données récoltées issues du test permet de procéder aux corrections
  nécessaires.
&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;en&quot;&gt;Those approaches often look like something I learned the uselessness of when
trying to benchmark org structures. When I began planning the reorg, I
started with what felt like the intuitively correct first step: looking up
other companies’ org structures. Two pizza rules, squad models, functional
reporting structures… there is no shortage of org inspiration to be found.
Naively, I inhaled information about all of them, trying to find a blueprint
for structuring my own org. In short, I followed the all-too-common pursuit
of trying to find a “best practice.”[…] While it’s likely true that whatever
“best practice” looks like in your industry is working for somebody
somewhere, it is a dangerous telos for a builder. What works perfectly in
one company can be a disaster in another. Even within one company, what
works one year might not work the following.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;LOWE, Kristen. &lt;em&gt;Everyone is Building Something&lt;/em&gt;. Extrait de la
newsletter &lt;a href=&quot;https://workbravely.substack.com/p/everyone-is-building-something&quot;&gt;Work Bravely&lt;/a&gt;. 2024. [consulté le 20 Juin 2024].&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;p&gt;
  Également, en tant que praticiens organisationnels, nous passons beaucoup de
  temps à benchmarker et à scruter les “bonnes pratiques” d’organisations
  similaires à la nôtre en pensant qu’implémenter la même solution répondra à
  notre besoin organisationnel. Cette approche est questionnable car ce qui
  fonctionne pour une organisation similaire peut causer des désastres dans une
  autre.
&lt;/p&gt;
&lt;p&gt;
  Voici quatre grands principes de l’approche &lt;em&gt;produit&lt;/em&gt; que l’on peut
  adopter pour renforcer la pertinence d’un projet de transformation
  organisationnelle :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Toujours commencer un projet en questionnant et en définissant clairement le
    problème que l’on essaie de solutionner
  &lt;/li&gt;
  &lt;li&gt;Faire de la compréhension fine de l’usager une fondation pour construire le
    projet
  &lt;/li&gt;
  &lt;li&gt;Pour améliorer quelque chose, il est nécessaire de le placer entre les mains
    de l’usager le plus tôt possible
  &lt;/li&gt;
  &lt;li&gt;L’itération est la clé : il est essentiel de présenter des premières
    versions non abouties du produit pour ajuster et construire en fonction du
    retour des usagers
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;pourquoi-est-il-décisif-dimpliquer-les-usagers-tout-au-long-des-projets-de-transformation&quot;&gt;
  Pourquoi est-il décisif d’impliquer les usagers tout au long des projets de
  transformation ?
&lt;/h4&gt;
&lt;p&gt;
  Lors d’un projet, des décisions irréversibles sont prises. Les arbitrages
  jalonnent l’avancée du projet et réduisent progressivement le capacité
  d’action sur celui-ci.
  &lt;a href=&quot;https://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;rct=j&amp;amp;opi=89978449&amp;amp;url=https://hal.science/hal-00263271/document&amp;amp;ved=2ahUKEwiWsrqhrdaGAxWYcaQEHRiTA28QFnoECBcQAQ&amp;amp;usg=AOvVaw0B12HbKBUE5xzcdNh616qk&quot;&gt;Christophe Midler, un chercheur en sciences de gestion a représenté la
    dynamique projet&lt;/a&gt;
  de cette façon :
&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/schema_capacite_action_projet_midler.png&quot; title=&quot;Dynamique de la situation projet, Christophe Midler, 1993&quot; alt=&quot;Schéma de la dynamique de la situation projet : en ordonnée gauche le niveau de capacité d’action sur le projet, en ordonnée droite le degré de connaissance du projet, en abscisse le déroulement temporel du projet. On observe que la capacité d’action diminue au fur et à mesure de l’avancée du projet tandis que c’est le contraire pour le degré de connaissance du projet&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Dynamique de la situation projet, Christophe Midler, 1993
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
  Plus le projet avance, plus la connaissance de celui-ci s’affine mais plus les
  marges de manœuvre se réduisent à cause des ressources déjà utilisées. L’enjeu
  est donc d’impulser une démarche participative avec les usagers en les
  impliquant à chaque étape du projet et surtout en début de projet de façon à
  fiabiliser la prise de décision. Cette approche aura pour effet de :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Capitaliser sur l’expérience, le savoir-faire et les connaissances des
    usagers
  &lt;/li&gt;
  &lt;li&gt;Sécuriser les prises de décision&lt;/li&gt;
  &lt;li&gt;Favoriser l’appropriation du projet par les équipes&lt;/li&gt;
  &lt;li&gt;Éviter la posture de sachant en se plaçant dans une posture d’apprentissage
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;quelle-valeur-le-design-de-service-peut-il-apporter-aux-méthodes-organisationnelles&quot;&gt;
  Quelle valeur le design de service peut-il apporter aux méthodes
  organisationnelles ?
&lt;/h3&gt;
&lt;p&gt;
  Le design de services apporte une méthodologie structurée qui place l’usager
  au cœur du projet mais surtout la méthode permet de s’assurer que le projet ne
  dévie pas de la problématique visée et s’ajuste aux éléments repérés sur le
  terrain. Les preuves de concepts actionnables en milieu de projet permettent
  de fédérer les parties prenantes autour d’une vision commune et facilitent
  grandement la conduite du changement nécessaire pour que les cibles
  s’approprient les livrables.
&lt;/p&gt;
&lt;p&gt;
  Implémenter des éléments de l’approche du design de services aux méthodes
  courantes de transformation organisationnelle aura pour effet de :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Ancrer les concepts organisationnels dans la réalité des attentes des
    usagers.
  &lt;/li&gt;

  
    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Le design s’efforce de caractériser les usages, les expériences, les
  préférences. Il est par nature centré sur l’utilisateur et il a pour
  mission d’organiser ses solutions autour des individus et non pas autour
  des systèmes. Par opposition, l’innovation traditionnelle, qui
  historiquement et culturellement vient du monde des ingénieurs, s’organise
  autour des produits et des process. Les organisations actuelles ont plutôt
  tendance à être organisées autour d’elles-mêmes et à auto-justifier le
  système. Le design leur permettrait de réorganiser leur système autour des
  individus (c’est-à-dire des consommateurs et des salariés) pour le rendre
  plus pertinent et donc efficace.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;MARCHAL, Aurélie.
  &lt;em&gt;Innovation organisationnelle &amp;amp; transformation managériale par le
    design thinking&lt;/em&gt;. Paris : CreateSpace Independent Publishing Platform, 2011, p.83&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;/ol&gt;
&lt;ol start=&quot;2&quot; type=&quot;1&quot;&gt;
  &lt;li&gt;
      Étendre le modèle de performance à un modèle qui prend en compte les
      indicateurs &lt;em&gt;soft&lt;/em&gt; propres à l’expérience (impact sur les clients
      et les équipes, modification des processus et systèmes) en plus des
      indicateurs &lt;em&gt;hard&lt;/em&gt; habituels en sciences de l’organisation (nombre
      d’incidents, taux de retour, ROI).
  &lt;/li&gt;
  
    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Les entreprises ont une mission, une vision stratégique et des portfolios mais ce sont aussi surtout des systèmes humains complexes dans lesquels les compétences du designer pour observer, simplifier et rendre cohérent se révèlent très utiles.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BORJA DE MOZOTA, Brigitte. Quarante ans de recherche en design management :
  une revue de littérature et des pistes pour l’avenir.
  &lt;em&gt;Sciences du design n°7 : Design Management&lt;/em&gt;. Presses Universitaires
  de France, 2018, p.28-45&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
  &lt;li&gt;S’assurer que la commande reflète bien les aspects profonds du problème
      grâce au questionnement de la problématique en avant-projet.
  &lt;/li&gt;
  &lt;li&gt;Réduire considérablement le risque de mener tout une démarche projet pour
      au final s’apercevoir que les cibles ne s’emparent pas du changement grâce
      aux immersions au plus près du terrain.
  &lt;/li&gt;
  &lt;li&gt;Faciliter la conduite du changement grâce au prototypage qui fournit une
      base tangible pour provoquer le changement dès les débuts du projet. La
      clé au renouvellement de la posture de consultant est d’aider les idées,
      stratégies et recommandations à prendre vie. Et pour cela le prototypage
      est un excellent moyen d’accrocher une dynamique collective et de cultiver
      l’approche du “show don’t tell”.
  &lt;/li&gt;
  &lt;li&gt;Faciliter l’appréhension et la compréhension des intentions et des
      concepts. En concrétisant une vision partagée à laquelle se référer, le
      prototype permet l’alignement des parties prenantes et place les
      contributeurs sur un même niveau d’information. Sur un plan plus
      opérationnel : le prototype permet la mesure et l’analyse. Il peut révéler
      un second niveau de questionnement qui n’était pas apparu lors de la phase
      d’immersion. Enfin, le prototype permet de se confronter à la réalité en
      matière technique : les différentes briques organisationnelles sont-elles
      adaptées en matière de synchronisation des équipes, partage des
      informations, interopérabilité ?
  &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;iii.-combiner-les-méthodes-de-transformation-organisationnelle-et-de-design-de-services.&quot;&gt;
  III. Combiner les méthodes de transformation organisationnelle et de design de
  services.
&lt;/h2&gt;
&lt;p&gt;Les deux méthodes ont tout à gagner à se complémenter :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Le contexte organisationnel fait la différence&lt;/strong&gt; : les
    designers de service gravitent avant tout autour de l’expérience. Aussi,
    designer un changement organisationnel à partir d’immersions et d’études
    terrain est important pour placer l’expérience de l’usager au centre mais si
    l’on souhaite que le changement organisationnel soit pérenne, en phases avec
    les enjeux de l’organisation et porte ses fruits sur le long terme, il est
    indispensable de prendre en compte les capacités et limites de
    l’organisation.
  &lt;/li&gt;
&lt;/ul&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Il conviendrait par conséquent d’observer de manière plus approfondie les
arrangements déjà existants, les rapports sociaux établis, la manière dont
les tâches sont effectuées réellement.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;MARCHAL, Aurélie.
&lt;em&gt;Ibid&lt;/em&gt;.p.65&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Des résultats tangibles dès le début du projet&lt;/strong&gt; : l’approche
    du design repose beaucoup sur la notion de &lt;em&gt;Minimum Viable Product&lt;/em&gt;
    
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Aussi appelé MVP, il s&#39;agit d&#39;une version d’un produit avec juste assez de
    fonctionnalités pour être utilisable par les premiers usagers qui peuvent
    ensuite retourner leurs observations pour améliorer le produit&lt;/small&gt;
      &lt;/span&gt;
      .
    Délivrer une proto-réponse en début de projet et itérer en fonction des
    retours des usagers permet de contrer l’approche traditionnelle des sciences
    managériales qui consiste à délivrer un livrable clivant en fin de projet
    que les usagers ne peuvent qu’accepter ou refuser. En fusionnant les deux
    méthodes on crée un changement sur-mesure plus facilement appropriable par
    les cibles.
  &lt;/li&gt;
&lt;/ul&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Le prototypage a un fort pouvoir fédérateur, particulièrement lors de la co-conception. Il est créateur et porteur de sens pour les gens qui l’ont conçu, mais aussi pour ceux à qui il s’adresse et qui le comprennent, ce qui peut être un atout dans le cadre de la gestion du changement.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;MARCHAL, Aurélie.
&lt;em&gt;Innovation organisationnelle &amp;amp; transformation managériale par le design
  thinking&lt;/em&gt;. Paris : CreateSpace Independent Publishing Platform, 2011, p.86&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Des insights frappant à partager qui engagent l’organisation&lt;/strong&gt;
    : pour impliquer les parties prenantes dans le changement organisationnel on
    a besoin à la fois de “quick win” atteignables rapidement propres aux
    méthodes de conduite du changement mais aussi de concepts visuels et
    prototypes testables propres au design. Cela permettra de convaincre les
    commanditaires de la pertinence du projet, de donner de la matière aux
    actionnaires, et construire de la confiance au sein des équipes grâce à une
    vision fédératrice.
  &lt;/li&gt;
  &lt;li&gt;
    &lt;strong&gt;Les solutions viennent de l’interne&lt;/strong&gt; : plutôt que de
    concevoir de zéro une solution, on s’appuie avant tout sur l’existant et sur
    les ressources internes. Cela correspond à la notion
    &lt;em&gt;“d’innovation frugale”&lt;/em&gt; propres aux méthodes de management de
    l’innovation. Cela aura pour résultat de créer des solutions plébiscitées en
    interne par les collaborateurs.
  &lt;/li&gt;
&lt;/ul&gt;

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;Le développement d’une innovation ne repose pas sur la qualité intrinsèque des inventions mais sur la capacité collective des acteurs à leur donner sens et usage. […] Les inventions doivent venir du corps social concerné pour qu’elles puissent être transformées en innovation.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;MARCHAL, Aurélie. &lt;em&gt;Ibid&lt;/em&gt;.p.65&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;ul&gt;
  &lt;li&gt;
    &lt;strong&gt;Donner du temps à l’organisation pour s’approprier les
      changements&lt;/strong&gt;
    : selon la perspective des designers la solution peut-être conçue et
    délivrer en quelques mois, néanmoins il faut du temps à l’organisation pour
    s’approprier ces changements, et il est nécessaire d’accompagner les
    équipes. Il faut donc découper la solution en morceaux de petites tailles et
    les mettre en place progressivement pour laisser le temps à l’organisation
    de se préparer à implémenter le prochain morceau de solution.
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  En deux mots : l’enjeu principal est de designer un changement et de réunir
  les conditions nécessaires pour qu’il puisse être implémenté par les décideurs
  puis approprié par les cibles dans l’organisation. Le but étant d’ancrer le
  concept designé dans les réalités de l’entreprise. L’idée n’est pas de limiter
  la création de concepts innovants mais d’engager le management et le niveau
  opérationnel avec des changements qui soient atteignables et qui fassent sens
  pour l’organisation.
&lt;/p&gt;
&lt;h3 id=&quot;la-méthode-combinant-approche-organisationnelle-et-design-de-services&quot;&gt;
  La méthode combinant approche organisationnelle et design de services
&lt;/h3&gt;
&lt;p&gt;
  Voici la méthode combinant approche organisationnelle et design de services
  que je propose.
&lt;/p&gt;
&lt;h4 id=&quot;la-redéfinition-de-la-problématique-une-recherche-de-la-pertinence&quot;&gt;
  La redéfinition de la problématique : une recherche de la pertinence
&lt;/h4&gt;
&lt;p&gt;
  Les commanditaires font parvenir une sollicitation avec les principaux
  éléments de contexte et une première ébauche de problématique. Une séance de
  questionnement de la problématique est systématiquement menée avec le(s)
  commanditaire(s), son but :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;affiner la problématique&lt;/li&gt;
  &lt;li&gt;approfondir les éléments de contexte&lt;/li&gt;
  &lt;li&gt;vérifier que la méthode est adaptée pour répondre au besoin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A l’issue, une séance de cadrage est menée :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;décryptage de l’approche&lt;/li&gt;
  &lt;li&gt;
    présentation d’un premier retroplanning synthétique de l’intervention et des
    instances décisionnelles
  &lt;/li&gt;
  &lt;li&gt;
    identification avec le commanditaire des usagers à impliquer dans la
    démarche
  &lt;/li&gt;
  &lt;li&gt;définition des rôles de chacun dans l’équipe projet&lt;/li&gt;
  &lt;li&gt;
    formalisation de la collaboration au moyen d’un document d’engagement
    réciproque (situation initiale, objectif à atteindre, livrables, rôles,
    instances, ressources, risques, premiers indicateurs de suivis identifiés)
    qui fera figure de document de référence tout au long du projet
  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;immersion&quot;&gt;Immersion&lt;/h4&gt;
&lt;p&gt;Le praticien se rend sur le terrain pour deux raisons :&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    discerner si le besoin soulevé par la commande se vérifie et s’affine sur le
    terrain
  &lt;/li&gt;
  &lt;li&gt;récolter des enseignements afin de prioriser les orientations futures&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il a à sa disposition différentes approches :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    Recueil des contributions dans des discussions avec les usagers via des
    entretiens (grille d’entretien, grille d’analyse).
  &lt;/li&gt;
  &lt;li&gt;Définition de l’usager type (persona).&lt;/li&gt;
  &lt;li&gt;Observation via une immersion in-situ.&lt;/li&gt;
  &lt;li&gt;
    Modélisation des flux de processus de travail existants dans le département
    concerné (diagramme de flux, transformation des inputs en outputs via
    trigger-condition-action).
  &lt;/li&gt;
  &lt;li&gt;
    Cartographie des personnes et des interdépendances organisationnelles (Qui
    travaille avec qui ? Qui a besoin des données de qui ? Qui a besoin de la
    validation de qui ? Mise en valeur des interdépendances entre personnel,
    ressources, clients, services).
  &lt;/li&gt;
  &lt;li&gt;
    Identification des points clés organisationnels (mode de prise de décision,
    cycle budgétaire, gouvernance, mode de partage de la connaissance).
  &lt;/li&gt;
  &lt;li&gt;
    Collecte des données organisationnelles du département (quantification du
    temps passé sur chaque type de tâche, budget, taux de rotation des collaborateurs,
    benchmark, étude de marchés, feedback clients…).
  &lt;/li&gt;
  &lt;li&gt;
    Estimation de la capacité à changer pour le département (niveau
    d’implication des managers dans le projet, identification des ressources
    allouées au changement, incitations des collaborateurs à mettre en œuvre le
    changement).
  &lt;/li&gt;
  &lt;li&gt;
    Représentation du parcours client via User Journey, mise en scène via
    maquette (jouets, briques de construction).
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  A l’issue de l’immersion, le praticien analyse en chambre les données
  récoltées.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Instance décisionnelle&lt;/strong&gt; : Une instance est organisée avec les
  commanditaires pour leur présenter les enseignements de l’immersion,
  l’éventuel affinage de la problématique initiale et les premières pistes de
  travail décelées.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Livrables&lt;/strong&gt; : Synthèse des données clés de l’organisation, de
  l’enseignement issu des immersions, des problématiques identifiées et
  définition des axes de travail.
&lt;/p&gt;
&lt;h4 id=&quot;co-création&quot;&gt;Co-création&lt;/h4&gt;
&lt;p&gt;Le praticien imagine et définit, en co-construction avec un panel de &lt;em&gt;parties prenantes&lt;/em&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Je parle bien ici de parties prenantes et non pas d’usager pour inciter à incorporer des cibles non-usagères issues du département : chef de service, toute personne qui a une influence sur la partie d’organisation&lt;/small&gt;
      &lt;/span&gt;
      , les propositions concrètes pour répondre aux pistes de travail identifiées à l’étape précédente. Le but n’est pas tellement de générer des idées mais plutôt d’impliquer les parties prenantes dans le processus et surtout de sélectionner tous ensemble la meilleure approche à adopter.&lt;/p&gt;
&lt;p&gt;Il a à sa disposition différentes approches :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    Mindmapping des associations d’idées et des concepts pouvant répondre à la
    problématique puis tri et vote
  &lt;/li&gt;
  &lt;li&gt;Brainstorming collectif&lt;/li&gt;
  &lt;li&gt;
    Diagramme des causes (dissocier les causes des symptômes du problème,
    identifier les facteurs contributifs)
  &lt;/li&gt;
  &lt;li&gt;Atelier de créativité collectif&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  A l’issue de l’idéation, un ou plusieurs grands axes de travail sont
  sélectionnés.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Instance décisionnelle&lt;/strong&gt; : présentation des pistes de solutions
  imaginées pour répondre aux axes de travail ainsi que les freins qu’ils
  tentent de résoudre, validation ou non des propositions par l’instance.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Livrables&lt;/strong&gt; : Synthèse des pistes de solutions imaginées.&lt;/p&gt;

&lt;h4 id=&quot;prototypage&quot;&gt;Prototypage&lt;/h4&gt;
&lt;p&gt;
  On conçoit à moindre coût une version initiale d’une solution identifiée : le
  prototype.
&lt;/p&gt;
&lt;p&gt;
  Le prototype est à construire sur-mesure en fonction des étapes précédentes
  mais on pourrait imaginer par exemple :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    La construction d’un pilote. Celui-ci se distingue du prototype en se dotant
    d’une capacité de suivi et d’évaluation continue. Par exemple, un scénario
    de passage à une organisation matricielle assorti d’une mise en situation
    pour estimer l’impact sur le temps de réponse aux inputs des clients, la
    modification des flux d’informations, les modifications à apporter au
    système d&#39;informations… Le pilote devrait être conçu dans le but de tester
    le changement mais surtout de comprendre les gap organisationnels avec les
    processus actuels, les équipes et les systèmes en interaction. Une bonne
    pratique est de proposer plusieurs scénarios : (1) Un scénario d’évolution
    qui redéfinit principalement les périmètres. On est plutôt dans une
    clarification. (2) Un scénario de rupture qui reconstruit les périmètres de
    façon distinctive. Cela a pour but de
    &lt;a href=&quot;https://www.design-organisationnel.com/post/prendre-des-risques-en-design-organisationnel&quot;&gt;permettre aux décideurs d’explorer les frontières des croyances de
      l’organisation et de leur faire prendre conscience de ses limites
      actuelles&lt;/a&gt;.
  &lt;/li&gt;
  &lt;li&gt;
    La modélisation et la création d’une base de données centralisant les
    données nécessaires au département
  &lt;/li&gt;
  &lt;li&gt;Le logigramme d’un nouveau workflow d’attribution des tâches&lt;/li&gt;
  &lt;li&gt;
    La mise en scène d’une nouvelle approche front-office pour dynamiser
    l’expérience client via une maquette en jouets mobiles utilisable par les
    collaborateurs occupant actuellement les positions représentées
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  Pour le prototype conçu on systématise plusieurs pratiques issues des sciences
  managériales :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Définition des critères de succès/d’échecs du test à venir&lt;/li&gt;
  &lt;li&gt;Estimation du coût de mise en place du pilote&lt;/li&gt;
  &lt;li&gt;Définition d’une échelle de temps fixe pour l’expérimentation&lt;/li&gt;
  &lt;li&gt;
    Définition des indicateurs de suivi qui fixent les conditions d’expiration
    de l’expérimentation (au bout de … jours si… alors on stop
    l’expérimentation)
  &lt;/li&gt;
  &lt;li&gt;
    Conception d’indicateurs d’impacts mesurables qui prouvent que le prototype
    apporte réellement un changement
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  &lt;strong&gt;Instance décisionnelle&lt;/strong&gt; : présentation des prototypes et mise
  en lien avec les freins qu’ils tentent de résoudre, mise en valeur des
  indicateurs qui confirment/infirment que le prototype lève les freins, détail
  des raisons qui ferait que l’objectif visé par le prototype pourrait ne pas
  être atteint.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Livrables&lt;/strong&gt; : prototypes et indicateurs liés, protocole de
  test.
&lt;/p&gt;
&lt;h4 id=&quot;test&quot;&gt;Test&lt;/h4&gt;
&lt;p&gt;
  Il s’agit de tester en conditions réelles mais à échelle réduite le prototype
  auprès des acteurs concernés.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    Récolte des observations durant le test pour affiner le prototype si besoin
    (possible retour à l’étape 4. Prototypage avec les ajustements nécessaires)
  &lt;/li&gt;
  &lt;li&gt;
    Identification des goulots d’étranglements organisationnels provoqués par le
    scénario de changement. Le test permet de mettre en évidence les complexités
    qui seront induites par le changement. Les donnés rassemblées lors du test
    sont à corréler avec les &lt;abbr&gt;KPI&lt;/abbr&gt; (Key Performance Indicator)
    fixés par les commanditaires du projet de transformation pour estimer s’il
    est viable de lancer le changement.
  &lt;/li&gt;
  &lt;li&gt;Estimation des nouvelles compétences, rôles, et postes requis.&lt;/li&gt;
  &lt;li&gt;
    Cartographie des changements induits sur la collaboration des collaborateurs (qui
    va collaborer avec qui, qui aura besoin des données de qui, qui attend la
    validation de qui).
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  La simulation organisationnelle est une des méthodes qui peut-être mobilisée.
  Celle-ci consiste à “faire jouer” les salariés concernés dans ce qui
  pourrait-être leur organisation future dans des conditions données. Cette
  démarche présente plusieurs intérêts :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    Mettre le scénario à l’épreuve du fonctionnement réel pour corriger les
    dysfonctionnements potentiels avant une mise en service.
  &lt;/li&gt;
  &lt;li&gt;
    Identifier si le scope du changement organisationnel envisagé est assez
    large au regard des workflows.
  &lt;/li&gt;
  &lt;li&gt;Permettre aux salariés d’être acteurs du changement à venir.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  &lt;strong&gt;Instance décisionnelle&lt;/strong&gt; : présentation des résultats du test.
  Les commanditaires tranchent sur la pérennisation du prototype.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Livrables&lt;/strong&gt; : synthèse de la démarche de tests, résultats des
  tests, préconisations/accompagnement proposé pour pérenniser les prototypes.
&lt;/p&gt;
&lt;h4 id=&quot;implémentation&quot;&gt;Implémentation&lt;/h4&gt;
&lt;p&gt;
  Il s’agit de rendre atteignable pour le commanditaire la mise en place du
  changement sur le temps long via :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    découpage du changement en sous-parties atteignables à échéances régulières
    (quick-win)
  &lt;/li&gt;
  &lt;li&gt;suivi post-projet des difficultés soulevées&lt;/li&gt;
  &lt;li&gt;
    relève des indicateurs de changement (le projet atteint-il les objectifs
    initiaux et est-il cohérent avec les KPI de l’organisation ?)
  &lt;/li&gt;
  &lt;li&gt;étude d’impact&lt;/li&gt;
  &lt;li&gt;
    prévoir temps de bilan avec toutes les parties prenantes pour tirer des
    leçons de l’accompagnement offert dans une logique d’amélioration continue
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Livrables&lt;/strong&gt; : plan de conduite du changement.&lt;/p&gt;
&lt;h3 id=&quot;mise-en-perspective-de-la-méthode-avec-la-réalité-des-organisations&quot;&gt;
  Mise en perspective de la méthode avec la réalité des organisations
&lt;/h3&gt;
&lt;p&gt;
  La transformation organisationnelle combinée au design est une méthode longue
  mais celle-ci permet de s’assurer de la conversion du projet de changement en
  réalité en commençant l’implémentation directement avec les équipes.
  Accompagner les premières étapes de l’implémentation du projet au sein de la
  structure donne une impulsion qui permet d’initier l’ancrage du changement,
  charge à l’organisation de pérenniser et consolider le département impacté
  pour que le projet porte ses fruits sur le long terme.
&lt;/p&gt;
&lt;p&gt;
  De même, toute démarche d’expérimentation nécessite une contractualisation
  avec la structure. Celle-ci doit s’engager en amont à mettre en place un
  environnement propice à l’expérimentation :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;autoriser le droit à l’échec&lt;br&gt;&lt;/li&gt;
  &lt;li&gt;
    documenter les échecs comme les succès pour capitaliser sur l’expérience
    acquise&lt;br&gt;
  &lt;/li&gt;
  &lt;li&gt;accorder aux porteurs de projets une part temporelle dédiée au projet&lt;/li&gt;
  &lt;li&gt;rendre visible les expérimentations en communiquant autour du projet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  En mélangeant designers et praticiens de la transformation organisationnelle,
  un programme de transformation se base sur des fondations solides qui limitent
  le risque d’erreur.
&lt;/p&gt;
&lt;h3 id=&quot;un-exemple-de-projet-dinnovation-organisationnelle-issu-de-la-méthode-design-de-services&quot;&gt;
  Un exemple de projet d’innovation organisationnelle issu de la méthode design
  de services
&lt;/h3&gt;
&lt;p&gt;
  Le projet d’innovation organisationnelle que je vais détailler a été
  exclusivement porté par la méthode du design de services et réalisé par Simon
  Cario et Elsa Portalier, tous deux designer de services au sein du laboratoire
  d’innovation publique de l’Etat en Pays de la Loire : Etat’LIN, ainsi que
  l’agence VraimentVraiment et le Labsolu, laboratoire d’innovation publique du
  Conseil Régionnal des Pays de la Loire.
&lt;/p&gt;
&lt;p&gt;
  Je n’ai malheureusement pas encore eu l’occasion de mener un projet utilisant
  précisément la méthode partagé ci-dessus dans le III., à savoir combinant
  l’approche “transformation organisationnelle” et l’approche “design de
  services”.
&lt;/p&gt;
&lt;p&gt;
  En 2022, l’Etat et la Région sollicitent le Lab’ à propos des “CLEFOP” : ce
  sont des instances composées d’acteurs publics de l’emploi. Elles ont pour
  mission de recueillir et répondre aux problématiques d’emploi que rencontrent
  les territoires : accompagnement en ressources humaines des entreprises ;
  accompagnement des jeunes et des demandeurs d’emploi; attractivité des
  métiers… La problématique initiale porte sur une volonté de l’État et des
  partenaires sociaux de dynamiser le travail local des CLEFOP.
&lt;/p&gt;
&lt;p&gt;
  Suite au cadrage, la problématique s’affine : l’ambition du projet est de
  co-construire des leviers permettant d’associer davantage les entreprises dans
  les actions des CLEFOP pour mieux répondre à leurs besoins. Pour ce faire les
  objectifs initiaux exprimés par les services métiers de l’État et de la Région
  sont :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    valoriser les CLEFOP sur les territoires auprès des acteurs économiques
  &lt;/li&gt;
  &lt;li&gt;faire que les entreprises en soient davantage actrices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  On est donc bien sur un périmètre d’enjeux organisationnels : comment inclure
  et motiver des parties prenantes à contribuer à une instance ?
&lt;/p&gt;
&lt;h4 id=&quot;immersion-1&quot;&gt;Immersion&lt;/h4&gt;
&lt;p&gt;Le travail d’immersion a reposé sur :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Des entretiens avec tous types de parties prenantes des CLEFOP.&lt;/li&gt;
  &lt;li&gt;
    Une visualisation schématique du parcours de la remontée d’un besoin du
    terrain jusqu’à l’action mise en place par le CLEFOP pour y répondre
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
  Les données issues de l’immersion sont analysées et synthétisées et sont
  présentées au commanditaire. Quatre pistes de travail sont proposées :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;Renforcer l’implication des entreprises&lt;/li&gt;
  &lt;li&gt;Faire connaître les actions du CLEFOP aux entreprises&lt;/li&gt;
  &lt;li&gt;Assurer la diffusion des initiatives CLEFOP qui fonctionnent&lt;/li&gt;
  &lt;li&gt;
    Réorganiser les rôles et les actions au sein des CLEFOP pour obtenir plus
    d’impact auprès des entreprises
  &lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/schema_immersion_clefop.jpg&quot; title=&quot;Schéma replaçant les pistes d&amp;#39;action dans l&amp;#39;écosystème CLEFOP, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Schéma synthétisant les enseignements de l’immersion CLEFOP&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Schéma replaçant les pistes d&amp;#39;action dans l&amp;#39;écosystème CLEFOP,
    conception et tous droits réservés Simon Cario, Elsa Portalier, Martin
    Delhumeau, VraimentVraiment
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h4 id=&quot;co-création-1&quot;&gt;Co-création&lt;/h4&gt;
&lt;p&gt;Un atelier collectif à distance est organisé pour :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    tester l’adhésion aux différentes pistes de travail issues de l’immersion
  &lt;/li&gt;
  &lt;li&gt;
    se demander à quoi pourrait ressembler une proposition concrète pour y
    répondre
  &lt;/li&gt;
  &lt;li&gt;recenser ce qui existe déjà sur le sujet&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/schema-cocreation-clefop.png&quot; title=&quot;L&amp;#39;atelier à distance de réaction aux pistes de travail proposées organisé sur Miro, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Capture d’écran d’un atelier de co-conception en ligne sur Miro reprenant un grand axe de travail pour faire l’inventaire des solutions pourraient y répondre&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    L&amp;#39;atelier à distance de réaction aux pistes de travail proposées
    organisé sur Miro, conception et tous droits réservés Simon Cario, Elsa
    Portalier, Martin Delhumeau, VraimentVraiment
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
  Cinq entretiens sont organisés, ceux-ci sont structurés autour d’une des
  quatre pistes de travail issues de l’immersion (une piste différente à chaque
  fois). Dans le but de :
&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    présenter ce qui existe déjà ailleurs pour répondre à la piste de travail
    présentée
  &lt;/li&gt;
  &lt;li&gt;imaginer quelle forme le prototype pourrait prendre&lt;/li&gt;
  &lt;li&gt;se demander à quel moment le prototype pourrait être utile&lt;/li&gt;
  &lt;li&gt;identifier les conditions nécessaires pour que le test fonctionne&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/schema-cocreation-clefop2.png&quot; title=&quot;Support de présentation des solutions qui existent déjà ailleurs pour répondre la piste de travail, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Capture d’écran d’un atelier de co-conception en ligne sur Miro reprenant ensemble de solutions existant ailleurs, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Capture d’écran d’un atelier de co-conception en ligne sur Miro reprenant
    ensemble de solutions existant ailleurs
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
  Un benchmark de solutions existantes dans d’autres structures est présenté :
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    un parcours utilisateur formalisant les processus d’identification et
    d’accompagnement des personnes en situation d’illettrisme au sein des
    agences Pole Emploi
  &lt;/li&gt;
  &lt;li&gt;un guide de pilotage de la communication interne d’un bailleur social&lt;/li&gt;
  &lt;li&gt;
    un guide pratique des différents formats de rencontre inter-acteur des
    Missions Locales
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  A la suite de ces ateliers, plusieurs prototypes sont envisagés pour répondre
  aux axes de travail.
&lt;/p&gt;
&lt;h4 id=&quot;prototypage-1&quot;&gt;Prototypage&lt;/h4&gt;
&lt;p&gt;Trois prototypes sont conçus :&lt;/p&gt;
&lt;ol type=&quot;1&quot;&gt;
  &lt;li&gt;
    Pour répondre à l’axe de travail “I. Renforcer l’implication des
    entreprises” : modélisation du parcours pour parvenir à une action CLEFOP.
    Conception d’un nuancier “formats de rencontre” constitué de fiches
    méthodologiques expliquant différents outils pour capter, mobiliser,
    concevoir, faire le bilan.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/parcours_action_clefop.jpg&quot; title=&quot;Cartographie du parcours pour aboutir à une action CLEFOP, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Visualisation sous format parcours utilisateur du parcours d’une action CLEFOP&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Cartographie du parcours pour aboutir à une action CLEFOP, conception et
    tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau,
    VraimentVraiment
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/nuanciers_format_rencontre.jpg&quot; title=&quot;Nuancier des formats de rencontre, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Nuancier des formats d’implication des entreprises&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Nuancier des formats de rencontre, conception et tous droits réservés Simon
    Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ol start=&quot;2&quot; type=&quot;1&quot;&gt;
  &lt;li&gt;
    Pour répondre à l’axe de travail : “IV. Réorganiser les rôles et les actions
    au sein des CLEFOP pour plus d’impact auprès des entreprises” : une
    cartographie des rôles et des acteurs du CLEFOP est conçue.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/carto_roles_acteurs.jpg&quot; title=&quot;Cartographie des rôles et des acteurs, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Cartographie des rôles et des acteurs accompagnées de fiches outils pour répartir les rôles d’intermédiaire avec les entreprises&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Cartographie des rôles et des acteurs, conception et tous droits réservés
    Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ol start=&quot;3&quot; type=&quot;1&quot;&gt;
  &lt;li&gt;
    Pour répondre à l’axe de travail : “IV. Réorganiser les rôles et les actions
    au sein des CLEFOP pour plus d’impact auprès des entreprises” : un carnet de
    bord de suivi des indicateurs d’une action CLEFOP est proposé.
  &lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://www.teotimepacreau.fr/media/Schemas_NCA/carnet_indicateurs_clefop.png&quot; title=&quot;Carnet de bord de suivi des indicateurs d&amp;#39;une action CLEFOP, conception et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau, VraimentVraiment&quot; alt=&quot;Quatre photographies du carnet de bord de suivi des indicateurs d’une action CLEFOP&quot;&gt;
  &lt;figcaption aria-hidden=&quot;true&quot;&gt;
    Carnet de bord de suivi des indicateurs d&amp;#39;une action CLEFOP, conception
    et tous droits réservés Simon Cario, Elsa Portalier, Martin Delhumeau,
    VraimentVraiment
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;
  Suite à la présentation des prototypes au commanditaire, un protocole de test
  cadrant les expérimentations est proposé. Celui-ci précise des premiers
  indicateurs d’évaluation de l’efficacité des prototypes, auprès de qui tester,
  quels freins lever…
&lt;/p&gt;
&lt;h4 id=&quot;test-1&quot;&gt;Test&lt;/h4&gt;
&lt;p&gt;
  Les enseignements principaux de la phase de test des prototypes sont présentés
  au commanditaire. Une instance “d’atterrissage du projet” est organisée pour
  rappeler les étapes de l’accompagnement global. Un calendrier de déploiement
  potentiel des prototypes par les CLEFOP est proposé. Le commanditaire est
  ainsi incité à diffuser les outils en interne et charge à lui de conduire
  l’appropriation.
&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
  Combiner design de services et transformation organisationnelle représente un
  atout majeur pour les organisations. Il s’agit avant tout de réunir deux
  postures : la posture “haute” du consultant qui analyse, établi un diagnostic
  étayé, préconise des solutions et a une vision globale; avec la posture
  “basse” du designer qui prend ses racines en immersion sur le terrain, qui ose
  questionner la commande, qui construit des solutions sur-mesure en optimisant
  les ressources et qui développe une compréhension fine du problème à résoudre.
  Dans une économie de service, la qualité de service rendue est essentielle en
  termes de compétitivité. Aussi, repenser les points de contacts de
  l’organisation avec le client mais également questionner le management des
  personnes délivrant les services est un vecteur majeur de performance.
&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id=&quot;bibliographie&quot;&gt;Bibliographie&lt;/h2&gt;
&lt;h3 id=&quot;livres&quot;&gt;Livres&lt;/h3&gt;
&lt;p&gt;
  MARCHAL, Aurélie.
  &lt;em&gt;Innovation organisationnelle &amp;amp; transformation managériale par le design
    thinking&lt;/em&gt;. Paris : CreateSpace Independent Publishing Platform, 2011.Disponible
  gratuitement &lt;a href=&quot;https://www.am-designthinking.com/livres/innovation-organisationnelle-et-transformation-manageriale-par-le-design-thinking/&quot;&gt;en ligne&lt;/a&gt; 
  
&lt;/p&gt;
&lt;p&gt;
  CNAM &amp;amp; CODESIGN-IT. ZACKLAD Manuel, GAREL Gilles, ARRUABARRENA Béa,
  BERTHINIER-PONCET Anne, GUEZEL Naïk.
  &lt;em&gt;Les labs internes : De l’innovation au design&lt;/em&gt;. Paris : Pluriverse
  Edition. 2021. Disponible gratuitement &lt;a href=&quot;https://observatoiredeslabs.ricod.net/index.php/publications/&quot;&gt;en ligne&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  CNAM, CODESIGN-IT, CGET(désormais ANCT) &amp;amp; FUTURS PUBLICS.
  &lt;em&gt;Le Lab des Labs&lt;/em&gt;. 2019. Disponible gratuitement &lt;a href=&quot;https://www.codesign-it.com/publications/le-lab-des-labs-en-telechargement-libre&quot;&gt;en ligne&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  DEPARTEMENT DE LA LOIRE-ATLANTIQUE.
  &lt;em&gt;Construire l’innovation publique. Retour d’expérience du Département de
    Loire-Atlantique&lt;/em&gt;. La documentation Française. 2018. Disponible en vente papier &lt;a href=&quot;https://www.vie-publique.fr/catalogue/22323-construire-linnovation-publique-retour-dexperience-du-departement-de-loire&quot;&gt;en ligne&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&quot;revues&quot;&gt;Revues&lt;/h3&gt;
&lt;p&gt;
  AGENCE NATIONALE POUR L’AMELIORATION DES CONDITIONS DE TRAVAIL.
  &lt;a href=&quot;https://www.anact.fr/10-questions-sur-la-conduite-des-projets-de-transformation7&quot;&gt;&lt;em&gt;10 questions sur la conduite de projets de transformation&lt;/em&gt;&lt;/a&gt;. 2017. [consulté le 1 Avril 2024]
&lt;/p&gt;
&lt;p&gt;
  STEPHANE VIAL et ALAIN FINDELI.
  &lt;a href=&quot;https://shs.cairn.info/revue-sciences-du-design-2018-1?lang=fr&quot;&gt;&lt;em&gt;Sciences du design n°7 : Design management&lt;/em&gt;&lt;/a&gt;. Montréal &amp;amp; Paris :
  Presses Universitaires de France. 2018. 
&lt;/p&gt;&lt;h3 id=&quot;articles&quot;&gt;Articles&lt;/h3&gt;
&lt;p&gt;
  JOOST MINNAAR.
  &lt;a href=&quot;https://www.corporate-rebels.com/blog/trend-3-experiment-adapt&quot;&gt;&lt;em&gt;Want to become agile ? Stop planning and start experimenting&lt;/em&gt;&lt;/a&gt;. 2017.
  [consulté le 3 Mai 2024].  
&lt;/p&gt;
&lt;p&gt;
  MARIANNE ABRAMOVICI. &lt;a href=&quot;https://www.blogmarianneabramovici.com/post/servuction-revenons-aux-sources&quot;&gt;&lt;em&gt;Servuction revenons aux sources&lt;/em&gt;&lt;/a&gt;. 2023. [consulté
  le 24 Avril 2024].
  
&lt;/p&gt;
&lt;p&gt;
  MARZIA ARICO. &lt;a href=&quot;https://designmavericks.substack.com/p/organisational-fundamentals-for-designers&quot;&gt;&lt;em&gt;Organisational Fundamentals for Designers&lt;/em&gt;&lt;/a&gt;. 2024.
  [consulté le 15 Mai 2024].
&lt;/p&gt;
&lt;p&gt;
  MELVIN BRAND FLU.
  &lt;em&gt;Service transformation : service design on steroid&lt;/em&gt;. Initialement paru
  dans la revue consacrée au design de service :
  &lt;a href=&quot;https://www.service-design-network.org/touchpoint&quot;&gt;Touchpoint—The Journal of Service Design&lt;/a&gt;. 2011. [consulté le 22 Avril 2024]. Désormais disponible sur le site de &lt;a href=&quot;https://liveworkstudio.com/insight/service-transformation-service-design-on-steroids/&quot;&gt;Livework&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
  MELVIN BRAND FLU.
  &lt;a href=&quot;https://www.linkedin.com/pulse/20140820060814-1165330-the-underestimated-business-impact-of-service-design/&quot;&gt;&lt;em&gt;The underestimated business impact of service design&lt;/em&gt;&lt;/a&gt;. 2014. [consulté
  le 23 Avril 2024]
&lt;/p&gt;
&lt;p&gt;
  PAVEL SAMSONOV. &lt;a href=&quot;https://www.doc.cc/articles/form-factor-trap&quot;&gt;&lt;em&gt;Design without process, or the form factor trap&lt;/em&gt;&lt;/a&gt;.
  2024. [consulté le 01 Juin 2024].
&lt;/p&gt;
&lt;p&gt;
  SARAH DEVEREAUX. &lt;a href=&quot;https://www.murmur.com/blog/what-does-safe-to-try-actually-mean&quot;&gt;&lt;em&gt;What does safe to try actually mean&lt;/em&gt;&lt;/a&gt;. 2022. [consulté
  le 4 Mai 2024].
&lt;/p&gt;
&lt;h3 id=&quot;vidéos&quot;&gt;Vidéos&lt;/h3&gt;
&lt;p&gt;
  MARCHAL, Aurélie.
  &lt;a href=&quot;https://youtu.be/-89WSjJDcn0?feature=shared&quot;&gt;&lt;em&gt;L’innovation et la conduite du changement par le design thinking&lt;/em&gt;&lt;/a&gt;.
  2016.
&lt;/p&gt;
&lt;p&gt;
  MARCHAL, Aurélie. &lt;a href=&quot;https://youtu.be/YNca99M6OoQ?feature=shared&quot;&gt;&lt;em&gt;Planifier la transformation ?&lt;/em&gt;&lt;/a&gt;. 2020.
&lt;/p&gt;
&lt;h2 id=&quot;observations&quot;&gt;Observations des pairs&lt;/h2&gt;
&lt;ul&gt;J&#39;ai adressé l&#39;essai à différents praticiens du design de transformation organisationnelle pour recueillir leurs observations :
&lt;li&gt;&lt;a href=&quot;https://www.bestrategicdesign.com/&quot;&gt;Brigitte Borja de Mozota&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.blogcxservices.com/qui-suis-je&quot;&gt;Marianne Abramovici&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.am-designthinking.com/qui-sommes-nous/&quot;&gt;Aurélie Marchal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nl.linkedin.com/in/brandflu&quot;&gt;Melvin Brand Flu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marzia.studio/&quot;&gt;Marzia Arico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/davidgateau/&quot;&gt;David Gateau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pavelsamsonov.com/&quot;&gt;Pavel Samsonov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.improconsult.co.uk/blog&quot;&gt;John Mortimer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oyena.fr/&quot;&gt;Marine Parent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vagueshorizons.fr/&quot;&gt;Mickaël Poiroux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pablopernot.fr/&quot;&gt;Pablo Pernot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;strong&gt;Grégoire Serikoff&lt;/strong&gt; :

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;- Les approches traditionnelles de conseil génèrent un besoin accru de conseil. Pour être plus explicite, la manière dont
sont conçus les plans de transformation et de réorganisation, très verticalement et “en étoile” plutôt qu’&quot;en réseau”, génère
un besoin important de conduite du changement, pour permettre l’appropriation et la mise en oeuvre de processus et
l’utilisation d’outils créés sans impliquer les utilisateurs. Cela se traduit mécaniquement par l’engagement supplémentaire
de ressources externes (jours/hommes de consultants). Les approches de design collaboratives, si elles sont déployées
dès le début, permettent de réduire considérablement le besoin d’une conduite du changement. Il en résulte une
accélération de la transformation, une meilleure pertinence des décisions (choix et renoncements), et une bien moindre
incidence sur le bien-être des collaborateurs (du management intermédiaire jusqu’aux opérationnels). Les coûts sont
également significativement réduits.
&lt;br&gt;
- Cette inclusion dans la démarche de conception d’une transformation ou d’une réorganisation doit être élargie à
l’écosystème de l’entreprise ou de l’administration, en invitant des parties prenantes externes (partenaires, clients,
fournisseurs, autorités, académique, influenceurs…).
&lt;br&gt;
- La démarche doit certes permettre d’identifier des tendances fortes, mais aussi d’isoler et d’amplifier des signaux faibles,
à tous les échelons de l’organisation. Ce sont ces signaux faibles qui sont porteurs des informations les plus structurantes
pour innover.
&lt;br&gt;
- La problématisation est cruciale. Pour créer une solution, on doit « créer le problème » de manière collaborative, c’est-à-dire défragmenter la connaissance éparse, interroger en profondeur les déterminants de de problème, ou plutôt de cette
problématique (une problématique étant un système de problèmes). Cette problématisation doit être continue, pendant
toute la démarche de résolution de la problématique. La démarche est par conséquent une suite continue d’allers-retours
entre qualification de la problématique et résolution.
&lt;br&gt;
- L’innovation ne peut être que systémique, parce qu&#39;elle doit répondre à des problèmes et besoins qui sont eux-mêmes
systémiques (principe de récursivité). Si on crée un nouveau produit ou un service pour répondre à un problème ou besoin,
il sera nécessaire de créer aussi une offre, des processus pour décider, vendre, fabriquer, délivrer, maintenir, recycler, gérer
les stocks, transporter, etc. Donc oui, une innovation, quelle qu’elle soit, doit comprendre un volet d’innovation managériale
et organisationnelle.
&lt;br&gt;
- J’ajouterai 2 facteurs aux 3 que vous citez concernant l’approche traditionnelle d’un consultant. Le facteur de stratégie
commerciale interne du cabinet de conseil, et le facteur de politique interne du client. Ces 2 facteurs, générateurs de biais
cognitifs et de travers comportementaux, ont une influence considérable sur les propositions des consultants et leurs
modalités d’accompagnement.
&lt;br&gt;
- Vous écrivez : &quot;Le modèle partagé précédemment repose sur un principe global : conceptualiser l’entièreté d’un projet de
transformation depuis la commande exprimée (point A) vers une situation idéale (point B) et recommander un plan de
transformation du point A au point B.” Ma pratique professionnelle s’appuie fortement sur l’approche méthodologique MG
Taylor / Collaboration Code. J’y ai appris qu’une trajectoire ne se dessine pas du point A au point B, mais du point B au
point A. L’axiome dédié, qui confirme vos propos, est : « You can&#39;t get there from here, but you can get here from there. ».
&lt;br&gt;
- Une transformation, comme d’ailleurs tout projet critique sur le chemin stratégique de l’organisation, ne peut être menée
qu’en créant les meilleures conditions pour une autonomie maximale des parties prenantes, permettant l’émergence, avec
des feedbacks et des arbitrages fréquents. Il doit s’agir d’une démarche de design itérative, non-linéaire, asynchrone et
facilitée alternant rapidité et lenteur, qui fait appel à la modélisation, à la visualisation, au narratif, à la création de
prototypes sous forme d’artefacts tangibles…
&lt;br&gt;
- Je trouve dommage, dans votre texte, que vous rameniez tout à une méthode, le design de service. Le design de service
est une approche à forte valeur ajoutée, mais il en existe un paquet d’autres à combiner, sur-mesure en fonction de chaque
projet. Il ne peut pas y avoir de démarche prédéterminée. En effet, l’innovation est “le dernier processus sauvage”. Et il
entend bien le rester.
&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Grégoire Serikoff, email, 10/12/24&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;br&gt;
&lt;strong&gt;Melvin Brand Flu&lt;/strong&gt; :

    &lt;blockquote&gt;
      &lt;p lang=&quot;en&quot;&gt;The customers’ experience, needs, or wants help drive innovation or identify opportunities, but this does not inform or transform the behaviours and practices of the organization. The design object might be the customer but the transformation object is the team/processes/system that must change or adapt. I am a true believer in the power of (service) design in connecting an organization’s operational context (doing things better, faster) and strategic context (achieving better, different outcomes). It is important to apply (service) design tools and methods not just on customers, but give onstage and offstage staff and stakeholders equal, if not the majority, time and focus. That way (service) design is not just another method but is a vehicle to tap into the internal expertise and knowledge of an organization and achieve tangible results inside and outside the organization. Service design is about the journey, not about the sprint.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Melvin Brand Flu, commentaire LinkedIn, Novembre 2024&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;br&gt;
&lt;strong&gt;Mickaël Poiroux&lt;/strong&gt; :

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;
1️⃣ Tu mets en avant l&#39;inspiration de l&#39;approche produit (citation &quot;your work still involves picking, designing, testing, and launching something for someone else to use. Kind of sounds like product development, no?&quot;).
🔸 J&#39;ai l&#39;impression que ta référence au mode produit se concentre sur le test utilisateur, rapide et cyclique : cela vient juste conforter ce que l&#39;on peut retrouver à travers le prototypage dans le design. Par contre la citation mise en exergue force le trait en comparant le changement a un produit. C&#39;est là une pente glissante qui oublie la complexité du tissu relationnel entre sujets (&amp; actants) que représente une organisation, et non pas un produit &quot;objet&quot;.
2️⃣ Tu résumes à un moment en disant que &quot;l’enjeu principal est de designer un changement et de réunir les conditions nécessaires pour qu’il puisse être implémenté par les décideurs puis approprié par les cibles dans l’organisation.&quot;.
🔸 Il n&#39;y aura guère d&#39;innovation si on souhaite que les décideurs implémentent le changement. Pour moi, l&#39;innovation vient d&#39;une implémentation d&#39;un changement par des porteurs d&#39;initiatives (dans les marges ou en sous-marin de l&#39;organisation) que doivent s&#39;approprier les décideurs pour les porter à l&#39;échelle de l&#39;organisation. On peut certes imaginer une transformation sans innovation, mais je ne crois pas que ce soit ce dont nous ayons besoin dans l&#39;époque.
3️⃣ Tu opposes &quot;la posture “haute” du consultant&quot; vs &quot;la posture “basse” du designer&quot;
🔸 Je le comprends et c&#39;est pourquoi je revendique de ne pas faire de conseil et d&#39;être un &quot;accompagnateur&quot; de transformation. Pour autant, il manque dans la revue le développement d&#39;une posture basse de la transfo en organisation, s&#39;appuyant sur une posture de coaching. D&#39;ailleurs, beaucoup de consultant en orga (y compris public) développe cette corde du coaching à leur arc pour faire face aux limites de leur approche traditionnelle.&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Mickaël Poiroux, commentaire LinkedIn, Novembre 2024&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    
&lt;br&gt;
&lt;strong&gt;Pablo Pernot, annotations autour du corps de l&#39;essai résumées par mes soins via un LLM&lt;/strong&gt; :

    &lt;blockquote&gt;
      &lt;p lang=&quot;undefined&quot;&gt;
1. Pratiques de conseil traditionnelles
Il observe que peu prennent le soin de « challenger » la demande initiale en situation de conseil.
Travail « en chambre » : Il dénonce les décisions de transformation prises de manière isolée, sans impliquer les parties prenantes de l&#39;organisation.
L&#39;objectif du changement : Il insiste sur une règle fondamentale : « on ne change PAS pour CHANGER, on change pour atteindre un objectif ».
&lt;br&gt;
2. Validation et nuances de modèles théoriques
Modèle de Kotter : Il valide la pertinence de la « roue de Kotter » (conduite du changement), précisant que d&#39;après ses observations, ses points sont « assez bons ».
Limites de Porter : Face aux outils comme les cinq forces de Porter, il se montre sceptique sur leur utilité réelle pour la transformation, estimant que celle-ci est davantage liée à l&#39;état global du monde et à de grands ensembles qu&#39;à un contexte concurrentiel resserré.
Accord sur l&#39;appropriation : Il exprime un accord fort (« on est bien d&#39;accord », « en phase ») avec l&#39;idée que le succès d&#39;une transformation dépend de la capacité réelle de l&#39;organisation à s&#39;approprier le changement.
&lt;br&gt;
3. Suggestions méthodologiques et théoriques
Mise à jour des références : Pablo suggère d&#39;actualiser certaines réflexions avec les « Cynefin dynamics » de Dave Snowden.
Ouverture vers l&#39;agilité : Il recommande de s&#39;intéresser à l&#39;« Open Agile Adoption » de Dan Mezick en complément des réflexions sur le design de services en milieu organisationnel.
Interdépendance : Pour lui, la transformation organisationnelle et l&#39;appropriation des méthodes sont indissociables : « l&#39;un ne peut pas se faire sans l&#39;autre »&lt;/p&gt;
      &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
        &lt;sup class=&quot;sidenote-caller&quot;&gt;
        &lt;/sup&gt;
        &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;Pablo Pernot, annotations PDF résumées via LLM, Novembre 2024&lt;/small&gt;
      &lt;/span&gt;
    &lt;/blockquote&gt;
    



&lt;h2&gt;Licence&lt;/h2&gt;
&lt;p&gt;Contrairement aux autres contenus de ce site, cette page est sous licence CC BY-NC-ND : cette licence permet aux réutilisateurs de copier et de distribuer le matériel sur n&#39;importe quel support ou format sous une forme non-remixée uniquement, à des fins non commerciales uniquement, et seulement tant que l&#39;attribution est donnée au créateur.&lt;/p&gt;

&lt;img src=&quot;https://www.teotimepacreau.fr/img/licence-by-nc-nd.png&quot; alt=&quot;licence-by-nc-nd&quot;&gt;

</content>
  </entry>
  <entry>
    <title>Produire un document print sans logiciels propriétaires grâce aux technologies du web</title>
    <link href="https://www.teotimepacreau.fr/blog/produire-un-document-print-sans-logiciel-de-traitement-de-texte/" />
    <updated>2024-10-15T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/produire-un-document-print-sans-logiciel-de-traitement-de-texte/</id>
    <content type="html">&lt;h2 id=&quot;doctrine-%3A-pourquoi-sortir-des-logiciels-de-traitement-de-texte&quot; tabindex=&quot;-1&quot;&gt;Doctrine : pourquoi sortir des logiciels de traitement de texte&lt;/h2&gt;
&lt;p&gt;Microsoft Word, LibreOffice, Google Docs, ces logiciels de création et modification de documents sont les premiers qui viennent à l’esprit quand on doit produire du texte. Pourtant ceux-ci apportent leur lot de difficulté en conditionnant la production du texte à travers les choix implicites de l’éditeur du logiciel. Ceux-ci ne sont pas neutres.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;undefined&quot;&gt;En sciences humaines et sociales, les logiciels de traitement de texte, comme LibreOffice Writer, Microsoft Word et Google Docs, sont utilisés par la majorité des auteurs et des éditeurs. Ce sont des outils polyvalents, puissants, capables de gérer toutes les étapes de la chaîne éditoriale. Mais leurs avantages sont contrebalancés par une série d’inconvénients plus ou moins problématiques.&lt;br&gt;
D’abord, et du fait de leur polyvalence, ces logiciels tendent souvent vers l’usine à gaz. Leur interface est notoirement encombrée, pleine de distractions. Et ils sont gourmands en ressources (énergie, mémoire) ; or malgré cela, ils gèrent mal les documents longs et complexes.&lt;br&gt;
Ensuite, ce sont des logiciels ancrés dans le paradigme de l’imprimé, qui sont donc fondamentalement inadaptés à la communication via le Web. Dans un monde où le papier et le numérique sont appelés à cohabiter durablement, c’est une lacune considérable.&lt;br&gt;
Autre problème : leur modèle économique (en tout cas pour les logiciels propriétaires) est de moins en moins avantageux pour le consommateur. La tendance est à l’abonnement : payer pour accéder à ses propres données, sans aucune garantie sur la longévité du service.&lt;br&gt;
Enfin, leurs formats sont soit complètement fermés &lt;em&gt;(.doc)&lt;/em&gt;, soit difficiles à utiliser via d’autres outils &lt;em&gt;(.docx)&lt;/em&gt;. Les logiciels de traitement de texte verrouillent les auteurs dans un écosystème propriétaire dans lesquels les choix sont réduits. Certes, LibreOffice existe; mais la compatibilité entre formats a des limites, situation entretenue par les éditeurs de logiciels commerciaux car ils en tirent profit.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;PERRET, Arthur. &lt;a href=&quot;https://www.arthurperret.fr/cours/ecriture-scientifique-format-texte.html&quot;&gt;&lt;em&gt;Cours sur l’écriture scientifique au format texte&lt;/em&gt;&lt;/a&gt;. 2022&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Au-delà des des difficultés directes qu’entraînent les logiciels de traitement de texte, explorons leur effet sur la “chaîne de publication”. Antoine Fauchié a consacré sa thèse de doctorat à la question &lt;a href=&quot;https://memoire.quaternum.net/&quot;&gt;“Vers un système modulaire de publication : éditer avec le numérique”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Antoine Fauchié décrit les étapes de fabrication d’un document : &lt;a href=&quot;https://memoire.quaternum.net/3-un-systeme-modulaire/3-1-les-etapes-d-une-chaine-de-publication/&quot;&gt;Écrire → Partager, valider → Composer → Générer, publier&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;“Ecrire” : les logiciels de traitement de texte apposent automatiquement un style à l’écriture alors qu’au début du processus d’écriture on souhaite plutôt se concentrer uniquement sur le sens de l’écrit et sur la structure sémantique.&lt;/li&gt;
&lt;li&gt;“Partager, valider” : la gestion de l’édition à plusieurs. Les allers-retours de version du document par mail entre les différents contributeurs n’est pas idéale. On a plutôt besoin de versionner le document pour éviter les allers-retours entre les différents contributeurs. La méthode “Word” est d’utiliser le nom du document pour versionner “presentation-inha-v3-corrections-antoine-ok-jeudi.doc”. Au bout de multiples allers-retours la technique de versionnage par le nom du document montre ses limites. Se pose aussi la question de la collaboration à plusieurs sur le même document : procède-t-on par échange de mails ? par commentaire ? Et comment conserver l’historique des modifications pour revenir à une version d’il y a 6 mois ?&lt;/li&gt;
&lt;li&gt;“Composer” : mise en forme du document. Pour une mise en forme classique certains utiliseront les styles de Word, pour une mise en forme avancée des designers utiliseront Adobe InDesign. Dans les deux cas, la mise en forme du document par un logiciel propriétaire entraîne une certaine rupture dans la collaboration : un non-initié à InDesign pourra difficilement apporter des modifications à la mise en forme. On se confronte également rapidement aux &lt;a href=&quot;https://www.mac4ever.com/mac/173857-adobe-l-utilisation-des-couleurs-pantone-coute-desormais-15-dollars-par-mois&quot;&gt;modèles économiques changeant d’Adobe et comparses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;“Générer, publier” : on rencontre un écueil majeur : les documents produits par un logiciel de traitement de texte ignore les formats “modernes” d’affichage du texte. Quid de l’affichage du texte dans une page web ? Quid de l’affichage responsive du texte sur un mobile ? Quid de l’accessibilité d’un PDF pour les personnes en situation de handicap visuel ?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alors, quelles solutions ?&lt;/p&gt;
&lt;p&gt;Julie Blanc a &lt;a href=&quot;https://julie-blanc.fr/blog/2020-11-05_chiragan/&quot;&gt;représenté le fonctionnement d’une chaîne éditoriale reposant sur une source unique et s’appuyant sur les technologies du web&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Julie Blanc est docteure en ergonomie et design de l’Université Paris 8. &lt;a href=&quot;https://phd.julie-blanc.fr/&quot;&gt;Sa thèse&lt;/a&gt; porte sur l’utilisation des technologies du web pour l’impression par les designers graphiques. Elle explique avec justesse les dangers de s’appuyer uniquement sur des logiciels propriétaires dans le travail de mise en forme graphique.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/chaine-de-publication-web2print.png&quot; alt=&quot;De gauche à droite : markdown, flèche vers HTML, flèche vers CSS et PagedJS, 2 sorties de document Web et Print&quot;&gt;&lt;figcaption&gt;Schématisation d’une chaîne de publication Web2Print basé sur le principe du Single Source Publishing, tous droits réservés à Julie Blanc&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On peut reprendre les étapes de fabrication d’un document recommandé par Antoine Fauchié : Écrire → Partager, valider → Composer → Générer, publier. Ci-dessous une proposition d’outillage pour faciliter le processus. Celle-ci dépend bien sûr des usages de chacun et repose sur le principe d’une source unique (l’idée du &lt;em&gt;&lt;a href=&quot;https://skhole.ecrituresnumeriques.ca/episodes/ep2_fauchie/&quot;&gt;Single Source Publishing&lt;/a&gt;&lt;/em&gt; est de pouvoir produire des formes différentes à partir d’une même source). D’autres chaînes de publication peuvent-être plus adaptées selon les contextes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pour l’étape “Ecrire”, on s’appuie sur le format &lt;code&gt;Markdown&lt;/code&gt; . Il s’agit d’un langage de balisage léger permettant de se concentrer d’abord sur le fond du texte plutôt que sur la forme. le processus d’écriture est plus fluide qu’en &lt;code&gt;HTML&lt;/code&gt;. La syntaxe est simple à apprendre.&lt;/p&gt;
 &lt;blockquote&gt;
   &lt;p lang=&quot;undefined&quot;&gt;«  Markdown  » c’est deux choses : une syntaxe de balisage de texte brut et un outil logiciel qui convertit le balisage de texte brut en HTML pour la publication sur le web.&lt;/p&gt;
   &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
     &lt;sup class=&quot;sidenote-caller&quot;&gt;
     &lt;/sup&gt;
     &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BRASSARD, Louis-Olivier. &lt;a href=&quot;https://debugue.ecrituresnumeriques.ca/saison-04/seance-03-les-langages-de-balisage/&quot;&gt;&lt;em&gt;Extrait du cours de Debugue tes humanités sur les langages de balisage&lt;/em&gt;&lt;/a&gt;. 2018&lt;/small&gt;
   &lt;/span&gt;
 &lt;/blockquote&gt;
 &lt;blockquote&gt;
   &lt;p lang=&quot;undefined&quot;&gt;Plutôt que de rédiger du texte non structuré, ou à l’inverse de devoir connaître une trop importante somme de balises HTML, Markdown traduit simplement une intention sémantique via une syntaxe simple compréhensible par des humains.&lt;/p&gt;
   &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
     &lt;sup class=&quot;sidenote-caller&quot;&gt;
     &lt;/sup&gt;
     &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;FAUCHIE, Antoine. &lt;a href=&quot;https://www.quaternum.net/2018/10/18/markdown-comme-condition-d-une-norme-de-l-ecriture-numerique/&quot;&gt;&lt;em&gt;Extrait d&#39;un billet de blog à propos du format Markdown&lt;/em&gt;&lt;/a&gt;. 2018&lt;/small&gt;
   &lt;/span&gt;
 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L’étape “Partager, valider” supporte tout le processus d’édition : on souhaite suivre les modifications proposées par les différents contributeurs et versionner le document facilement. &lt;a href=&quot;https://git-scm.com/&quot;&gt;Git&lt;/a&gt; est un protocole libre de versionnage et suivi des modifications. Celui-ci simplifie grandement la collaboration en permettant à tous les contributeurs de proposer des modifications qui peuvent être soumises pour approbation. Il permet également de retracer toutes les modifications et de restaurer des versions très antérieures. Git présente de formidables opportunités pour faciliter la collaboration dans le monde professionnel : il évite de nombreux allers-retours de document et permet de sortir de l’approche “modification des documents dans la colonne de commentaire Word”. On peut l’utiliser pour versionner la mise en forme si l’on travaille via des langages de mise en forme (CSS). Git ne peut cependant pas traiter de fichiers binaires, exit donc les formats “doc, docx, odt…” mais il gère tous les fichiers en lignes numérotées donc Markdown, HTML, CSS…&lt;/p&gt;
 &lt;blockquote&gt;
   &lt;p lang=&quot;undefined&quot;&gt;Git, ce n’est pas un outil, c’est plutôt un protocole de travail. Git, c’est une façon de travailler, de gérer des documents dans l’espace et dans le temps. [...] Git répond au problème : &quot;je travaille sur un projet avec plusieurs fichiers informatiques (n’importe lesquels) et je cherche à éviter d’avoir des titres à rallonge comme fichier_reluparXX_v1, v2, etc.&quot; &lt;br&gt;L’idéal, si c’est utilisé au sein d’une équipe, c’est de le mettre en place dès que les fichiers arrivent et que le travail commence. Ça évite les problèmes de nomenclature dont on parlait, et le risque de ne pas tous.tes travailler sur la bonne version. Git va venir structurer la façon de travailler, ça va la contraindre aussi, forcément. Ce n’est pas une méthode totalement ouverte, elle va avoir des impacts sur la façon de travailler.&lt;br&gt;Ce qui est intéressant, c’est que tu vas pouvoir tracer toutes les modifications en fonction des rôles des personnes qui composent l’équipe; tout le monde peut travailler de façon parallèle, plusieurs personnes peuvent travailler sur le même fichier en même temps et ensuite fusionner les différentes contributions. Chacun.e travaille sur un fichier sur son ordinateur et versionne son travail, sans forcément être connecté.e à Internet. Une connexion est seulement nécessaire pour envoyer les modifications sur un dépôt commun. Il peut y avoir des conflits, s’il y a eu des modifications aux mêmes endroits.&lt;/p&gt;
   &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
     &lt;sup class=&quot;sidenote-caller&quot;&gt;
     &lt;/sup&gt;
     &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;FAUCHIE, Antoine. &lt;a href=&quot;https://hal.science/hal-03622394/document&quot;&gt;&lt;em&gt;Extrait d&#39;une interview à propos du protocole Git comme outil d&#39;édition et d&#39;écriture&lt;/em&gt;&lt;/a&gt;. 2022&lt;/small&gt;
   &lt;/span&gt;
 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L’étape “Composer” consiste en la conversion du fichier Markdown vers du HTML. On met en forme via des feuilles de style CSS qui permettent d’aller bien plus loin dans la personnalisation que ce qu’offrent la plupart des logiciels de mise en forme graphique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L’étape “Générer, publier” consiste en l’adaptation du HTML et du CSS aux formats souhaités : print, mobile, desktop… &lt;a href=&quot;https://pagedjs.org/documentation/&quot;&gt;PagedJS&lt;/a&gt; est une librairie Javascript open source gratuite qui pagine le contenu comme ce qui peut-être attendu dans un format livre. PagedJS a été initié par Adam Hyde et est développé par Julie Blanc, Fred Chasen et Julien Taquet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;une-introduction-pratique-%C3%A0-la-conception-de-documents-sans-logiciel-de-traitement-de-texte&quot; tabindex=&quot;-1&quot;&gt;Une introduction pratique à la conception de documents sans logiciel de traitement de texte&lt;/h2&gt;
&lt;h2 id=&quot;etape-1-%3A-conversion-du-markdown-vers-html-gr%C3%A2ce-%C3%A0-pandoc&quot; tabindex=&quot;-1&quot;&gt;Etape 1 : conversion du Markdown vers HTML grâce à Pandoc&lt;/h2&gt;
&lt;p&gt;Pandoc est l’outil en ligne de commande à installer pour convertir du Markdown vers du HTML : &lt;code&gt;pandoc [NCA.md](http://nca.md/) -o NCA.html --standalone --extract-media=media&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l’attribut &lt;code&gt;—standalone&lt;/code&gt; est important car il indique à Pandoc de créer un document HTML ENTIER autour de notre HTML et non pas d’exporter juste un body HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;—extract-media=media&lt;/code&gt; permet de spécifier le nom du dossier où seront stockées les images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On se retrouve avec un fichier HTML sans style.&lt;/p&gt;
&lt;h2 id=&quot;etape-2-%3A-mise-en-forme-minimale-via-pagedjs&quot; tabindex=&quot;-1&quot;&gt;Etape 2 : mise en forme minimale via PagedJS&lt;/h2&gt;
&lt;p&gt;Pour que PagedJS agisse sur notre document HTML il est nécessaire de placer le &lt;em&gt;polyfill&lt;/em&gt; en tant que script dans notre document HTML. Le fichier polyfill se récupère dans la &lt;a href=&quot;https://pagedjs.org/documentation/2-getting-started-with-paged.js/#using-paged.js-as-a-polyfill-in-web-browsers&quot;&gt;documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Il faut l’appeler dans le &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; : &lt;code&gt;&amp;lt;script src=&amp;quot;paged.polyfill.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Dernière étape avant de pouvoir apercevoir le rendu de notre document dans le navigateur : il faut récupérer un fichier CSS constituant “l’interface d’affichage du document” c’est à dire un découpage du document en plusieurs pages visuelles plutôt que la visualisation par défaut d’un document HTML.&lt;/p&gt;
&lt;p&gt;Le fichier &lt;code&gt;interface.css&lt;/code&gt; est à récupérer &lt;a href=&quot;https://gitlab.coko.foundation/pagedjs/interface-polyfill&quot;&gt;ici&lt;/a&gt;. On place le fichier dans le &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; : &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;interface.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/exemple-document-pagin%C3%A9-pagedjs.png&quot; alt=&quot;Rendu visuel d&#39;un document paginé avec PagedJS : division en pages comme dans un livre&quot;&gt;&lt;figcaption&gt;Rendu visuel d’un document paginé avec PagedJS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Jusqu’ici nous n’avons pas touché au style de notre document, nous nous sommes contentés de mettre en place l’affichage en “page séparées” et la technologie de mise en page print.&lt;/p&gt;
&lt;p&gt;On peut désormais ajouter une feuille de style à notre fichier HTML dans le &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; : &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;tufte.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;&lt;/code&gt;.
On commence par définir les gabarits de page :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@charset&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@page&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; A4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 28mm 22mm 21mm 27mm&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/*Tufte typical margins*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tout l’intérêt de l’outil réside dans sa flexibilité : on peut définir n’importe quel gabarit de page et n’importe quel type de marge grâce à &lt;code&gt;@page&lt;/code&gt; : une règle CSS spécifique à l’impression de documents. Ici j’applique des marges spécifiques, &lt;em&gt;non-standards&lt;/em&gt;, pour appliquer le style “&lt;a href=&quot;https://www.teotimepacreau.fr/blog/designer-des-tableaux-clairs-et-efficaces/#:~:text=Pour%20tous%20les%20sujets%20de%20visualisation%20de%20l%E2%80%99information%2C%20Edward%20Tufte%20est%20l%E2%80%99auteur%20de%20r%C3%A9f%C3%A9rence.%20Ses%20travaux%20de%20recherche%20avanc%C3%A9s%20dans%20sa%20th%C3%A8se%20%E2%80%9CThe%20Visual%20Display%20of%20Quantitative%20Information%E2%80%9D%20ont%20pos%C3%A9s%20un%20standard.&quot;&gt;Tufte&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;Enfin, PagedJS ne bénéfice pas du Hot Module Replacement (HMR) offert par les outils de build type Vite et frameworks web : ceux-ci permettent de voir les changements effectués dans le code source en temps réel sans rechargement de la page.&lt;/p&gt;
&lt;p&gt;Dans PagedJS on est obligé de réactualiser manuellement la page si l’on a pas activé une surveillance spécifique de certains fichiers et la page remonte tout en haut. Pas pratique quand on est entrain de modifier la 28ème page par exemple !&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://polylogue.org/apres-la-page-la-double-page/&quot;&gt;Nicolas Taffin&lt;/a&gt; a créé le script &lt;a href=&quot;https://gitlab.com/nicolastaf/pagedjs-reload-in-place&quot;&gt;reload-in-place.js&lt;/a&gt; pour que la page scroll automatiquement sur le dernier endroit que vous étiez entrain de modifier avant le reload de la page.&lt;/p&gt;
&lt;h2 id=&quot;etape-3-%3A-%C3%A9tendre-les-fonctionnalit%C3%A9s-de-base-offertes-par-pagedjs&quot; tabindex=&quot;-1&quot;&gt;Etape 3 : étendre les fonctionnalités de base offertes par PagedJS&lt;/h2&gt;
&lt;p&gt;Assez rapidement, on se rend compte qu’il manque trois éléments élémentaires dans la mise en page print :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Une numérotation des pages (automatique)&lt;/li&gt;
&lt;li&gt;Un sommaire (généré automatiquement)&lt;/li&gt;
&lt;li&gt;Un moyen de faire commencer certains titres automatiquement sur une nouvelle page (on ne souhaite pas avoir un titre de niveau 2 qui commence à la dernière ligne d’une page)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Une partie des plugins d’extenstion de PagedJS se trouve sur le repo &lt;a href=&quot;https://gitlab.coko.foundation/pagedjs/pagedjs-plugins&quot;&gt;https://gitlab.coko.foundation/pagedjs/pagedjs-plugins&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;comment-num%C3%A9roter-les-pages-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment numéroter les pages ?&lt;/h3&gt;
&lt;p&gt;Il suffit d’ajouter dans un de nos fichier CSS :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Numérotation des pages */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@page&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;left&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@bottom-right&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@page&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;right&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@bottom-right&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* pas de numéro de page pour la couverture : requiert de wrapper d&#39;une &amp;lt;div data-page=macouverture&gt;&amp;lt;/div&gt; le contenu de notre page dans notre HTML*/&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@page&lt;/span&gt; macouverture&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@bottom-right&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@bottom-left&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les pages de gauche recoivent leur numéro de page, incrémenté automatiquement, en bas à droite dans la marge.&lt;/p&gt;
&lt;p&gt;Les pages de droite de même.&lt;/p&gt;
&lt;p&gt;La page de couverture n’est pas numérotée.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/numerotation-pages-pagedjs.png&quot; alt=&quot;Rendu visuel du document avec la numérotation automatique des pages en bas à droite&quot;&gt;&lt;figcaption&gt;Chaque page est doté d’un numéro automatique&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;comment-mettre-en-place-un-sommaire-automatique-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment mettre en place un sommaire automatique ?&lt;/h3&gt;
&lt;p&gt;Le script de génération automatique d’un sommaire via PagedJS a été conçu par l’&lt;a href=&quot;https://ateliers.esad-pyrenees.fr/web/pages/ressources/ctrl-alt-print/pagedjs/&quot;&gt;Atelier ESAD Pyrénées - Julien Bidoret&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il consiste en un fichier &lt;code&gt;createToc.js&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createToc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; tocElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tocElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; titleElements &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;titleElements&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tocElementDiv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tocElement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tocUl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ul&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  tocUl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;list-toc-generated&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  tocElementDiv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tocUl&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 

  &lt;span class=&quot;token comment&quot;&gt;// add class to all title elements&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tocElementNbr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; titleElements&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; titleHierarchy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; titleElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;titleElements&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  

      titleElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

          &lt;span class=&quot;token comment&quot;&gt;// add classes to the element&lt;/span&gt;
          element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;title-element&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data-title-level&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; titleHierarchy&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

          &lt;span class=&quot;token comment&quot;&gt;// add id if doesn&#39;t exist&lt;/span&gt;
          tocElementNbr&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          idElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;idElement &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;title-element-&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; tocElementNbr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
          &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; newIdElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// create toc list&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tocElements &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.title-element&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  

  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; tocElements&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tocElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tocElements&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tocNewLi &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;li&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Add class for the hierarcy of toc&lt;/span&gt;
      tocNewLi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;toc-element&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      tocNewLi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;toc-element-level-&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; tocElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;titleLevel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Keep class of title elements&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; classTocElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tocElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; n&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; classTocElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; n&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;classTocElement&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;title-element&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              tocNewLi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;classTocElement&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;   
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;// Create the element&lt;/span&gt;
      tocNewLi&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;a href=&quot;#&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; tocElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&quot;&gt;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; tocElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/a&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      tocUl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tocNewLi&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;on appelle le fichier &lt;code&gt;createToc.js&lt;/code&gt; dans le &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; accompagné d’un script secondaire directement intégré dans notre document HTML :&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--createToc génère la table des matières à condition de placer &amp;lt;div id=&quot;my-toc-content&quot;&gt;&amp;lt;/div&gt; quelque part dans le body, il récupère les niveaux de titres du document grâce au script class extender ci-dessous--&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;createToc.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
      &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;handlers&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Paged&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Handler&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;chunker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; polisher&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; caller&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chunker&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; polisher&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; caller&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//register handler beforeParsed() and call createToc script&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;beforeParsed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token function&quot;&gt;createToc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;tocElement&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#my-toc-content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;titleElements&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;h1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;h2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;h3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//les niveaux de titres sont à personnaliser. max 3 niveaux de titres autorisés dans le sommaire&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      Paged&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;registerHandlers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;handlers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le script secondaire permet de personnalier les niveaux de titres qui seront récupérés, apposer un id pour personnaliser en CSS le sommaire.&lt;/p&gt;
&lt;p&gt;Il est également proposé un style pour le sommaire à placer dans un fichier CSS dédié :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@page&lt;/span&gt; toc&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#table-of-content&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; toc&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;break-before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; right&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element a::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; p. &quot;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;target-counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;href&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; right&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element-level-1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 25px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element-level-2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 25px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/* counters */&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;counter-reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; counterTocLevel1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element-level-1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;counter-increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; counterTocLevel1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;counter-reset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; counterTocLevel2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element-level-1::before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;counterTocLevel1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;. &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element-level-2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;counter-increment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; counterTocLevel2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element-level-2::before&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; top&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;counterTocLevel1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;. &quot;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;counterTocLevel2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;. &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;/* hack for leaders */&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;overflow-x&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; black &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.................................................................................................................................................&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;letter-spacing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element a::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 6px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;#list-toc-generated .toc-element a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;comment-faire-commencer-automatiquement-certains-titres-sur-la-page-d%E2%80%99apr%C3%A8s-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment faire commencer automatiquement certains titres sur la page d’après ?&lt;/h2&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* force the level 1 titles to always start on a new page */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;break-before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;comment-imprimer-notre-document-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment imprimer notre document ?&lt;/h3&gt;
&lt;p&gt;Pour imprimer notre document, il suffit d’entrer &lt;code&gt;CTRL+P&lt;/code&gt; dans le navigateur pour exporter au format PDF, envoyer vers une imprimante…&lt;/p&gt;
&lt;h2 id=&quot;pourquoi-avoir-choisi-tufte.css&quot; tabindex=&quot;-1&quot;&gt;Pourquoi avoir choisi tufte.css&lt;/h2&gt;
&lt;p&gt;La feuille de style CSS Tufte reprend les idées démontrées par les livres et les documents d’&lt;a href=&quot;https://www.teotimepacreau.fr/blog/designer-des-tableaux-clairs-et-efficaces/#:~:text=Pour%20tous%20les%20sujets%20de%20visualisation%20de%20l%E2%80%99information%2C%20Edward%20Tufte%20est%20l%E2%80%99auteur%20de%20r%C3%A9f%C3%A9rence.%20Ses%20travaux%20de%20recherche%20avanc%C3%A9s%20dans%20sa%20th%C3%A8se%20%E2%80%9CThe%20Visual%20Display%20of%20Quantitative%20Information%E2%80%9D%20ont%20pos%C3%A9s%20un%20standard.&quot;&gt;Edward Tufte&lt;/a&gt;. Ce dernier a théorisé la présentation d’information au format texte pour qu’elle soit le plus compréhensible possible. Le style de Tufte est connu pour la mise en forme des graphiques et tableaux, le choix des polices d’écriture adaptées en fonction du type de contenus et l’utilisation de notes de marge.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;undefined&quot;&gt;L’objectif de « Tufte CSS » n’est pas de dire que « les sites Web devraient ressembler à cette interprétation des livres de Tufte », mais plutôt « voici quelques techniques développées par Tufte que nous avons trouvé utiles dans l’impression; peut-être que vous pouvez trouver un moyen de les rendre utiles sur le Web ». Tufte CSS est simplement un croquis d’une manière de mettre en œuvre cet ensemble d’idées. Ce devrait être un point de départ, pas un objectif de design, car tout projet doit présenter ses informations selon les meilleures conditions.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;DUCAMP Christophe, Jeff. &lt;a href=&quot;https://www.christopheducamp.com/note/tufte-css/&quot;&gt;&lt;em&gt;Article CSS Tufte&lt;/em&gt;&lt;/a&gt;. 2017&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Pour une description plus poussée du style Tufte et de ses usages voir &lt;a href=&quot;https://www.arthurperret.fr/blog/2018-12-04-semantique-et-mise-en-forme.html&quot;&gt;le billet de blog consacré d’Arthur Perret&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Réviser SQL avec &#39;SQL Murder Mystery&#39;</title>
    <link href="https://www.teotimepacreau.fr/blog/reviser-sql-avec-sql-mystery/" />
    <updated>2024-09-19T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/reviser-sql-avec-sql-mystery/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://mystery.knightlab.com/&quot;&gt;SQL Murder Mystery&lt;/a&gt; est un site proposant de résoudre une enquête policière en mettant en pratique SQL.
Une seule indication est donnée au départ : “the crime was a ​murder​ that occurred sometime on ​Jan.15, 2018​ and that it took place in ​SQL City”.
Tout l’exercice consiste à requêter une base de données sous-jacente que les services de police auraient constitués. Celle-ci est schématisée par un &lt;a href=&quot;https://www.teotimepacreau.fr/blog/modelisation-base-de-donnees/&quot;&gt;Entity-Relationships-Diagram&lt;/a&gt;. Il faut donc trouver la logique en requêtant les tables à la suite les unes des autres pour déduire qui est le criminel puis le commanditaire.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/ERD-SQL-Mystery.png&quot; alt=&quot;Le schéma ERD de la base de données de l&#39;enquête&quot;&gt;&lt;figcaption&gt;Schéma ERD de la base de données de l’enquête&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;1-%3A-retrouver-la-description-du-crime_scene_report&quot; tabindex=&quot;-1&quot;&gt;1 : Retrouver la description du crime_scene_report&lt;/h2&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; crime_scene_report
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;20180115&#39;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;murder&#39;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; city &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;SQL City&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On apprend dans le champ &lt;code&gt;description&lt;/code&gt; de crime_scene_report :
“The first witness lives at the last house on “Northwestern Dr”. The second witness, named Annabel, lives somewhere on “Franklin Ave”.”&lt;/p&gt;
&lt;h2 id=&quot;2.1-%3A-trouver-qui-est-le-premier-t%C3%A9moin-et-son-id&quot; tabindex=&quot;-1&quot;&gt;2.1 : Trouver qui est le premier témoin et son id&lt;/h2&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; address_number 
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; address_street_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &#39;Northwestern Dr&lt;span class=&quot;token punctuation&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;ORDER&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; address_number &lt;span class=&quot;token keyword&quot;&gt;DESC&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#pour trouver directement le numéro de la dernière maison de la rue&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La dernière maison de la rue est logiquement le numéro le plus élévé de la rue : 4919 &lt;code&gt;address_number&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;On cherche ensuite à connaître tous les détails de ce témoin vivant au 4919 rue Northwestern Dr.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; person
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; address_street_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Northwestern Dr&#39;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; address_number &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4919&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;license_id&lt;/th&gt;
&lt;th&gt;address_number&lt;/th&gt;
&lt;th&gt;address_street_name&lt;/th&gt;
&lt;th&gt;ssn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;14887&lt;/td&gt;
&lt;td&gt;Morty Schapiro&lt;/td&gt;
&lt;td&gt;118009&lt;/td&gt;
&lt;td&gt;4919&lt;/td&gt;
&lt;td&gt;Northwestern Dr&lt;/td&gt;
&lt;td&gt;111564949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;2.2-trouver-l%E2%80%99id-du-second-t%C3%A9moin&quot; tabindex=&quot;-1&quot;&gt;2.2 Trouver l’id du second témoin&lt;/h2&gt;
&lt;p&gt;On sait que le second témoin se nomme Annabel et vie dans la rue Franklin. La colonne &lt;code&gt;name&lt;/code&gt; de la table &lt;code&gt;person&lt;/code&gt; est composée du prenom ET du nom. Or nous n’avons que le prénom, il faut donc utiliser une méthode SQL de matching partiel.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; person
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; address_street_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Franklin Ave&quot;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; name &lt;span class=&quot;token operator&quot;&gt;LIKE&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Annabel%&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;license_id&lt;/th&gt;
&lt;th&gt;address_number&lt;/th&gt;
&lt;th&gt;address_street_name&lt;/th&gt;
&lt;th&gt;ssn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16371&lt;/td&gt;
&lt;td&gt;Annabel Miller&lt;/td&gt;
&lt;td&gt;490173&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Franklin Ave&lt;/td&gt;
&lt;td&gt;318771143&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;3.-trouver-la-retranscription-des-interrogatoires-de-chaque-t%C3%A9moin&quot; tabindex=&quot;-1&quot;&gt;3. Trouver la retranscription des interrogatoires de chaque témoin&lt;/h2&gt;
&lt;p&gt;On a l’id de chaque témoin.
Retrouvons l’intérrogatoire de temoin n°1 :&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; interview
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; person_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;14887&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;person_id&lt;/th&gt;
&lt;th&gt;transcript&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;14887&lt;/td&gt;
&lt;td&gt;I heard a gunshot and then saw a man run out. He had a “Get Fit Now Gym” bag. The membership number on the bag started with “48Z”. Only gold members have those bags. The man got into a car with a plate that included “H42W”.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Retrouvons l’interrogatoire de témoin n°2 :&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; interview
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; person_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;16371&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;person_id&lt;/th&gt;
&lt;th&gt;transcript&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16371&lt;/td&gt;
&lt;td&gt;I saw the murder happen, and I recognized the killer from my gym when I was working out last week on January the 9th.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;4.-tracer-le-membre-de-la-salle-de-sport-aper%C3%A7u&quot; tabindex=&quot;-1&quot;&gt;4. Tracer le membre de la salle de sport aperçu&lt;/h2&gt;
&lt;p&gt;On sait que le suspect à un sac qui commence par “48Z”. Seuls les membres “gold” ont ces sacs. Le suspect est rentré dans une voiture avec une plaque incluant le n° “H42W”.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; get_fit_now_member
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; membership_status &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;gold&#39;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; id &lt;span class=&quot;token operator&quot;&gt;LIKE&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;48Z%&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;person_id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;membership_start_date&lt;/th&gt;
&lt;th&gt;membership_status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;48Z7A&lt;/td&gt;
&lt;td&gt;28819&lt;/td&gt;
&lt;td&gt;Joe Germuska&lt;/td&gt;
&lt;td&gt;20160305&lt;/td&gt;
&lt;td&gt;gold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48Z55&lt;/td&gt;
&lt;td&gt;67318&lt;/td&gt;
&lt;td&gt;Jeremy Bowers&lt;/td&gt;
&lt;td&gt;20160101&lt;/td&gt;
&lt;td&gt;gold&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Il y a 2 résultats : on se souvient que le 2ème témoin se souvient que les évènements se sont déroulés le 9 Janvier.
Or le premier résultat a un membership_start_date de 20160305. Il ne peut donc s’agir que de Jeremy Bowers.&lt;/p&gt;
&lt;p&gt;L’interface nous le confirme : “Congrats, you found the murderer! But wait, there’s more… If you think you’re up for a challenge, try querying the interview transcript of the murderer to find the real villain behind this crime”.&lt;/p&gt;
&lt;h2 id=&quot;5.-continuons-avec-le-challenge-propos%C3%A9-%3A-retrouvez-l%E2%80%99interrogatoire-du-meutrier&quot; tabindex=&quot;-1&quot;&gt;5. Continuons avec le challenge proposé : retrouvez l’interrogatoire du meutrier&lt;/h2&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; interview
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; person_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;67318&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;person_id&lt;/th&gt;
&lt;th&gt;transcript&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;67318&lt;/td&gt;
&lt;td&gt;I was hired by a woman with a lot of money. I don’t know her name but I know she’s around 5’5&amp;quot; (65&amp;quot;) or 5’7&amp;quot; (67&amp;quot;). She has red hair and she drives a Tesla Model S. I know that she attended the SQL Symphony Concert 3 times in December 2017.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;6.-trouver-qui-est-all%C3%A9-3-fois-au-concert-%22sql-symphony-concert-%22-en-d%C3%A9cembre-2017&quot; tabindex=&quot;-1&quot;&gt;6. Trouver qui est allé 3 fois au concert &amp;quot;SQL Symphony Concert &amp;quot; en Décembre 2017&lt;/h2&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; facebook_event_checkin
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; event_name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;SQL Symphony Concert&#39;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;AND&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;LIKE&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;201712__&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;BY&lt;/span&gt; person_id
&lt;span class=&quot;token keyword&quot;&gt;HAVING&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;person_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient 2 entrées :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;person_id&lt;/th&gt;
&lt;th&gt;event_id&lt;/th&gt;
&lt;th&gt;event_name&lt;/th&gt;
&lt;th&gt;date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;24556&lt;/td&gt;
&lt;td&gt;1143&lt;/td&gt;
&lt;td&gt;SQL Symphony Concert&lt;/td&gt;
&lt;td&gt;20171224&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99716&lt;/td&gt;
&lt;td&gt;1143&lt;/td&gt;
&lt;td&gt;SQL Symphony Concert&lt;/td&gt;
&lt;td&gt;20171229&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Il nous faut donc affiner pour savoir laquelle des deux personnes est la commanditaire&lt;/p&gt;
&lt;h2 id=&quot;7.-trouver-laquelle-des-deux-personnes-conduit-une-tesla-model-s&quot; tabindex=&quot;-1&quot;&gt;7. Trouver laquelle des deux personnes conduit une Tesla Model S&lt;/h2&gt;
&lt;p&gt;On procède à une jointure des tables &lt;code&gt;person&lt;/code&gt; et &lt;code&gt;drivers_license&lt;/code&gt; basé sur l’id des 2 personnes étant allées à l’évènement.&lt;/p&gt;
&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; drivers_license
&lt;span class=&quot;token keyword&quot;&gt;JOIN&lt;/span&gt; person
&lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;license_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; drivers_license&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id
&lt;span class=&quot;token keyword&quot;&gt;WHERE&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;24556&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;OR&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;99716&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On obtient une seule entrée :&lt;/p&gt;
&lt;div class=&quot;table-wrapper&quot; style=&quot;overflow-x:auto&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;age&lt;/th&gt;
&lt;th&gt;height&lt;/th&gt;
&lt;th&gt;eye_color&lt;/th&gt;
&lt;th&gt;hair_color&lt;/th&gt;
&lt;th&gt;gender&lt;/th&gt;
&lt;th&gt;plate_number&lt;/th&gt;
&lt;th&gt;car_make&lt;/th&gt;
&lt;th&gt;car_model&lt;/th&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;license_id&lt;/th&gt;
&lt;th&gt;address_number&lt;/th&gt;
&lt;th&gt;address_street_name&lt;/th&gt;
&lt;th&gt;ssn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;202298&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;green&lt;/td&gt;
&lt;td&gt;red&lt;/td&gt;
&lt;td&gt;female&lt;/td&gt;
&lt;td&gt;500123&lt;/td&gt;
&lt;td&gt;Tesla	Model S&lt;/td&gt;
&lt;td&gt;99716&lt;/td&gt;
&lt;td&gt;Miranda Priestly&lt;/td&gt;
&lt;td&gt;202298&lt;/td&gt;
&lt;td&gt;1883&lt;/td&gt;
&lt;td&gt;Golden Ave&lt;/td&gt;
&lt;td&gt;987756388&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;L’interface nous le confirme : “Congrats, you found the brains behind the murder! Everyone in SQL City hails you as the greatest SQL detective of all time. Time to break out the champagne!”.&lt;/p&gt;
&lt;h2 id=&quot;ce-que-j%E2%80%99ai-appris&quot; tabindex=&quot;-1&quot;&gt;Ce que j’ai appris&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Le matching partiel SQL avec &lt;code&gt;%&lt;/code&gt; et &lt;code&gt;_&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GROUP BY&lt;/code&gt; et &lt;code&gt;HAVING&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La jointure de base en SQL&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Comment faire tourner une application NodeJS sur un VPS ?</title>
    <link href="https://www.teotimepacreau.fr/blog/comment-faire-tourner-application-nodejs-sur-vps/" />
    <updated>2024-09-16T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/comment-faire-tourner-application-nodejs-sur-vps/</id>
    <content type="html">&lt;h2 id=&quot;la-logique-n%C3%A9cessaire-pour-d%C3%A9ployer-une-application-sur-un-vps&quot; tabindex=&quot;-1&quot;&gt;La logique nécessaire pour déployer une application sur un VPS&lt;/h2&gt;
&lt;p&gt;Quand on développe une application NodeJS, l’un des premiers besoins qui se dresse est “comment puis-je faire tourner cette application en continu même quand mon PC local est éteint ?”.&lt;/p&gt;
&lt;p&gt;Avoir un &lt;a href=&quot;https://www.teotimepacreau.fr/blog/heberger-soi-meme-des-applications/&quot;&gt;Virtual Private Server (VPS) présente l’avantage d’avoir une machine qui tourner 24h/24&lt;/a&gt;, c’est donc idéal pour éxecuter notre application NodeJS en continu.
Mais comment y parvenir ?&lt;/p&gt;
&lt;p&gt;En effet notre VPS possède son propre OS (dans la majorité des cas Linux). Quand notre app évolue, on a pas envie de tirer les derniers changement de code, installer les nouvelles dépendances, faire redémarrer le processus d’éxecution.&lt;/p&gt;
&lt;p&gt;Dockeriser l’application va nous permettre de créer un environnement propre pour l’application et ainsi éviter les conflits de version de Node. Cela assure que l’application va se comporter de la même façon peu importe si elle tourner sur notre machine locale ou sur le VPS.&lt;/p&gt;
&lt;h2 id=&quot;comment-dockeriser-une-application-node-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment Dockeriser une application Node ?&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/schema_dockerisation_nodejs.png&quot; alt=&quot;Schema Dockerisation d&#39;une application NodeJS : première étape élaborer un Dockerfile, seconde étape builder l&#39;image, troisième étape on obtient l&#39;image Docker, quatrième étape choisir un cloud pour distribuer l&#39;image Docker, cinquième étape execution de l&#39;image DOcker dans un container sur notre VPS&quot;&gt;&lt;figcaption&gt;Schéma ‘Dockeriser et éxecuter une application Node’&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Prenons l’exemple d’un script NodeJS de scrapping des offres d’emploi de remplacement de l’Education Nationale, on a besoin de la dépendance &lt;a href=&quot;https://pptr.dev/&quot;&gt;Puppeteer&lt;/a&gt; pour scrapper les données via Javascript ainsi que d’une solution pour envoyer hebdomadairement le résultat par mail : &lt;a href=&quot;https://resend.com/&quot;&gt;Resend&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notre programme NodeJS peut ressembler à ça :&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; puppeteer &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;puppeteer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cron &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;node-cron&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; Resend &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;resend&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;dotenv/config&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; resend &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Resend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;RESEND_API_KEY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;scrapper&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; browser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; puppeteer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;launch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;headless&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--no-sandbox&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;--disable-setuid-sandbox&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;//désactivation du sandbox de Chromium car fait bugger le container Docker une fois déployé&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; page &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; browser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;newPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;goto&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&quot;https://recrutement.education.gouv.fr/recrutement/offres?term=&amp;amp;Region__c=52&amp;amp;Departement__c=044&amp;amp;Population__c=EN2D%3BDE&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// PSEUDO CODE : je souhaite recevoir toutes les semaines la date et le titre de l&#39;annonce. I. Dans chaque article, je sélectionne la date et l&#39;annonce, j&#39;insère dans un array d&#39;objet [{date: , titre:}]&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; dateArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$$eval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;::-p-text(Publié le)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;elements&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elements&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; titreArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$$eval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.fr-card__title&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;elements&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;elements&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; arrayConsolide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dateArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;titre&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; titreArray&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;arrayConsolide&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; browser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; arrayConsolide&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;mailer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; arrayConsolide &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;scrapper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; htmlContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    arrayConsolide&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;annonce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      htmlContent &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
        &amp;lt;h2&gt;Recherche &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;annonce&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;titre&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/h2&gt;
        &amp;lt;p&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;annonce&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;/p&gt;
      &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; resend&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;emails&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;FROM_EMAIL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//process.env.FROM_EMAIL&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;TO_EMAIL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Nouvelles annonces remplacement education nationale&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; htmlContent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; error &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; data &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;le serveur ne parvient pas à envoyer le mail :&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// mailer()&lt;/span&gt;
cron&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;20 10 * * 3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mailer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Europe/Paris&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//run tous les mercredis à 10h00&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il nous faut donc “convertir” le script en image Docker pour pouvoir le faire tourner en continu sur un VPS. Voici les étapes pour y parvenir.&lt;/p&gt;
&lt;h3 id=&quot;1.-cr%C3%A9er-le-dockerfile&quot; tabindex=&quot;-1&quot;&gt;1. Créer le Dockerfile&lt;/h3&gt;
&lt;p&gt;Le Dockerfile est un fichier permettant de spécifier les instructions pour créer une image Docker. Il suit toujours la même logique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la première ligne est toujours l’image de départ choisie. Celle-ci conditionne l’environnement d’éxecution de l’image.&lt;/li&gt;
&lt;li&gt;les lignes intermédiaires contiennent la suite d’instructions.&lt;/li&gt;
&lt;li&gt;la ligne de fin est la commande qui lance le processus&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#spécifie une image de base sur laquelle on se base&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ghcr.io/puppeteer/puppeteer:latest &lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# dossier qui sera utilisé dans le container&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;WORKDIR&lt;/span&gt; /app&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# on commence par copier le package.json pour pouvoir ensuite installer les dépendances&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; package.json /app&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# on installe les dépendances&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; npm install&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# on copie tout notre dossier de code dans le workdir&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; . /app&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# on démarre le script&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [ &lt;span class=&quot;token string&quot;&gt;&quot;npm&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;start&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2.-connecter-docker-%C3%A0-un-registry&quot; tabindex=&quot;-1&quot;&gt;2. Connecter Docker à un registry&lt;/h3&gt;
&lt;p&gt;Un &lt;em&gt;registry&lt;/em&gt; est une sorte de “drive” permettant de déposer les images Docker de façon centralisée. Ce qui permet de les partager avec d’autres utilisateurs ou d’autres machines. Nous verrons plus tard que le registry permet aussi de reconstruire l’image dynamiquement en fonction de nos changements de code.
Il en existe plusieurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker Hub&lt;/li&gt;
&lt;li&gt;Github Container Registry…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme le code de notre app Node est déjà stocké sur Github pour assurer son versionnage, nous en profitons pour utiliser le Github Container Registry.&lt;/p&gt;
&lt;p&gt;Il est nécessaire de générer un access token dans Github pour connecter Docker à celui-ci :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/github-access-token.png&quot; alt=&quot;Capture d&#39;écran interface de génération d&#39;un access token dans Github&quot;&gt;&lt;figcaption&gt;Générer un access token dans github&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Puis via une ligne de commande Docker, on connecte Docker au Github Container Registry.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;sudo docker login --username nomdutilisateur --password github_access_token ghcr.io&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3.-construire-l%E2%80%99image-docker&quot; tabindex=&quot;-1&quot;&gt;3. Construire l’image Docker&lt;/h3&gt;
&lt;p&gt;L’étape de build est indispensable pour construire l’image Docker.&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;sudo docker build . -t ghcr.io/nomdutilisateur/nomdelimage
&lt;span class=&quot;token comment&quot;&gt;# le . signifie que Docker doit se baser sur le dossier racine, puis on part obligatoirement de l&#39;adresse ghcr.io (adresse du Github Container Registry) suivie de notre nom d&#39;utilisateur Github puis on nomme comme on souhaite notre image.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4.-pousser-l%E2%80%99image-docker-vers-le-registry&quot; tabindex=&quot;-1&quot;&gt;4. Pousser l’image Docker vers le registry&lt;/h3&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;sudo docker push ghcr.io/nomdutilisateur/nomdelimage&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On retrouve désormais notre image Docker dans l’onglet “Packages” du menu de Github.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/github-access-token.png&quot; alt=&quot;Capture d&#39;écran de l&#39;interface Packages du menu de Github : le package de notre app apparaît bien&quot;&gt;&lt;figcaption&gt;L’onglet Packages de Github&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;5.-faire-tourner-l%E2%80%99image-docker-en-continu-sur-notre-vps&quot; tabindex=&quot;-1&quot;&gt;5. Faire tourner l’image Docker en continu sur notre VPS&lt;/h3&gt;
&lt;p&gt;On se connecte à notre VPS puis il suffit d’entrer &lt;code&gt;docker run ghcr.io/nomdutilisateur/nomdelimage&lt;/code&gt;. Le container tourne en permanence et selon notre exemple nous recevons bien le scrap de toutes les offres de remplacement de l’éducation nationale toutes les semaines dans notre boîte mail.&lt;/p&gt;
&lt;h2 id=&quot;mettre-en-place-un-d%C3%A9ploiement-continu-(cd)-de-notre-image-docker&quot; tabindex=&quot;-1&quot;&gt;Mettre en place un déploiement continu (CD) de notre image Docker&lt;/h2&gt;
&lt;p&gt;Au moindre changement/amélioration du code de notre app NodeJS, celle-ci ne se reflète pas dans notre image Docker.
Mettre en place un processus de déploiement en continu permet de s’assurer qu’à chaque fois que notre code est poussé vers le repository Github cela puisse reconstruire l’image Docker et la pousser vers le registry.&lt;/p&gt;
&lt;p&gt;Pour cela, Github propose les &lt;a href=&quot;https://docs.github.com/fr/actions/about-github-actions/understanding-github-actions&quot;&gt;Github Actions&lt;/a&gt; une solution pour automatiser des actions quand un évènement se déroule dans notre dépôt de code.&lt;/p&gt;
&lt;p&gt;Au préalable il faut déposer notre token de connexion Docker-Github en tant que secret du repo. On va dans le repo → settings → secrets → actions et on place le Docker_github_token en “repository secret”.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/github-action-token.png&quot; alt=&quot;Capture d&#39;écran de l&#39;interface de dépôt du token pour le lier au repo&quot;&gt;&lt;figcaption&gt;Lier le token Docker-Github au repo&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On doit créer un fichier YAML contenant les instructions d’automatisation puis le placer dans la racine du repo .github/workflows/notrefichier.yaml&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Docker Image CI for GHCR &lt;span class=&quot;token comment&quot;&gt;#on nomme notre process&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  push &lt;span class=&quot;token comment&quot;&gt;#se déclenche au push de code ver&amp;amp; le repo&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;build_and_publish&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ubuntu&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; actions/checkout@v3 &lt;span class=&quot;token comment&quot;&gt;#la version actuelle des actions checkout de github workflow : ça prend notre code du repo et le met dans le Action Runner pour que ça puisse build le code&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Build and push the Image
        &lt;span class=&quot;token key atrule&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;
          sudo docker login --username nomdutilisateur --password $ ghcr.io
          sudo docker build . --tag ghcr.io/nomdutilisateur/nomdelimage
          sudo docker push ghcr.io/nomdutilisateur/nomdelimage&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A chaque push de code vers notre repo, la Github Action build notre image puis la pousse vers la registry, ce qui nous permet d’avoir une image toujours prête à être tirée sur notre VPS.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;div id=&quot;RgZyX-e6W9E&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/RgZyX-e6W9E&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div id=&quot;uRQ7Qm_0BZ8&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/uRQ7Qm_0BZ8&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/skills/test-with-actions/blob/main/.github/steps/1-add-a-test-workflow.md&quot;&gt;https://github.com/skills/test-with-actions/blob/main/.github/steps/1-add-a-test-workflow.md&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>La normalisation d&#39;une base de données</title>
    <link href="https://www.teotimepacreau.fr/blog/normalisation-base-de-donnees/" />
    <updated>2024-09-12T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/normalisation-base-de-donnees/</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt; : Cet article est la suite de mon précédent article : &lt;a href=&quot;https://www.teotimepacreau.fr/blog/modelisation-base-de-donnees/&quot;&gt;Les bases pour modéliser une base de données&lt;/a&gt;. Pour une introduction à la modélisation conceptuelle et au principe de relations et cardinalités, s’y référer.&lt;/p&gt;
&lt;h2 id=&quot;passer-du-mod%C3%A8le-conceptuel-de-donn%C3%A9es-%C3%A0-la-base-de-donn%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;Passer du Modèle Conceptuel de Données à la base de données&lt;/h2&gt;
&lt;p&gt;Chaque entité devient une table. Les attributs de notre entité deviennent les colonnes de la tables. Les relations sont soient tranformées en table soient elles disparaissent.&lt;/p&gt;
&lt;h3 id=&quot;comment-transformer-les-relations-en-tables-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment transformer les relations en tables ?&lt;/h3&gt;
&lt;p&gt;Les cardinalités maximales nous renseignent sur le type de relation :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une cardinalité maximale de 1 dans les deux sens de la relation est appelée One To One. Elle nous indique que la relation est fantôme, il faut donc fusionner les 2 entités en une seule et supprimer la relation.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/relation-one-to-one.png&quot; alt=&quot;Capture d&#39;écran du passage de 2 entités reliés par une relation One To One en fusion d&#39;une seule entité&quot;&gt;&lt;figcaption&gt;Passage de 2 entités reliés par une relation One To One en fusion d’une seule entité, crédit schéma : Université Le Mans&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;une cardinalité maximale de 1 d’un côté et de n de l’autre côté est appelée One To Many, Many To One dans l’autre sens. L’entité faible (celle ayant la cardinalité maximale de 1) absorbe la clé primaire de l’entité forte (celle ayant la cardinalité maximale n) en clé étrangère. La relation disparaît.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/relation-many-to-one.png&quot; alt=&quot;Capture d&#39;écran du passage de 2 entités reliés par une relation Many To One en fusion d&#39;une seule entité&quot;&gt;&lt;figcaption&gt;Passage de 2 entités reliés par une relation May To One en table (FK = clé étrangère. PK = clé primaire)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Une cardinalité maximale de n dans les deux sens est appelée Many To Many. La relation doit-être transformée en entité (appelée table de liaison) et copier les clés primaires des 2 entités à laquelle elle est liée pour les tranformer en clé étrangère dans la nouvelle entité.&lt;/p&gt;
&lt;p&gt;Enfin, toute relation porteuse d’attributs se transforme en entité. Comme pour Many To Many, on copie les clés primaires des entités liés et on les transforment en clés étrangères.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/relation-many-to-many-et-relation-porteuse-attributs.png&quot; alt=&quot;Capture d&#39;écran du passage de 2 entités reliés par une relation Many To Many porteuse d&#39;attributs en table&quot;&gt;&lt;figcaption&gt;Passage d’une relation Many To Many porteuse d’attributs à une table, crédit schéma : Université Le Mans&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;formes-normales&quot; tabindex=&quot;-1&quot;&gt;Formes normales&lt;/h2&gt;
&lt;p&gt;Les formes normales sont des règles certifiant que la base de données respecte certaines contraintes de modélisation.&lt;/p&gt;
&lt;p&gt;En effet, on souhaite que notre base de données puisse répondre à 3
principes pour de bonne élaboration :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pouvoir supprimer une entrée sans supprimer les données connexes. Par exemple : une table Livre ne doit pas avoir en colonnes l’auteur car si on supprime l’entrée cela supprimera l’auteur.&lt;/li&gt;
&lt;li&gt;éviter la répétition d’infos similaires car peu efficient pour le stockage. Par exemple : répéter sur 5000 entrée le même auteur, la même catégorie…&lt;/li&gt;
&lt;li&gt;assurer la consistance des données (avoir à entrer manuellement plusieurs fois le même nom d’auteur entraîne des erreurs)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il y a 5 niveaux de formes normales, certifiant de façon graduelle la qualité de notre base de données. Pour des raisons de simplicité, nous détaillerons seulement les 3 premiers niveaux, qui suffisent dans 99% des cas.&lt;/p&gt;
&lt;p&gt;1NF :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;avoir une table sans clé primaire n’est pas permis&lt;/li&gt;
&lt;li&gt;Utiliser les lignes pour véhiculer de l’information n’est pas permis&lt;/li&gt;
&lt;li&gt;2 data-types différents ne peuvent exister dans une même colonne&lt;/li&gt;
&lt;li&gt;Enregistrer un groupe de données qui se répète de colonnes en colonnes n’est pas permis (ex: qté_1, item_1, qté_2, item_2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2NF :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tous les attributs non-clés d’une table doivent dépendre uniquement de la clé primaire dans son entièreté (une clé primaire peut être là combinaison de plusieurs colonnes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3NF :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tous les attributs non-clés d’une table doivent dépendre uniquement de la clé primaire, dans son entièreté, et rien d’autre que cette clé. La méthode est de représenter les dépendances fonctionnelles pour les colonnes non-clés de notre table.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/3eme_forme_normale.png&quot; alt=&quot;Capture d&#39;écran d&#39;une table avec en colonnes : Player_ID, Player_Rating, Player_Skill_Level avec 4 entrées pour illuster inconsistances qu&#39;entraîne une table qui ne répond pas à la 3ème forme normale&quot;&gt;&lt;figcaption&gt;Illustration des inconsistances qu’entraîne une table qui ne répond pas à la 3ème forme normale. Crédit vidéo Learn Database Normalization, chaîne Youtube Decomplexify&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Avec notre illustration on peut se demander : le &lt;em&gt;Player_Rating&lt;/em&gt; est-il dépendant uniquement du &lt;em&gt;Player_ID&lt;/em&gt; en clé primaire ou de la combinaison du &lt;em&gt;Player_ID&lt;/em&gt; et du &lt;em&gt;Player_Skill_Level&lt;/em&gt; ? En effet, le niveau de skill du joueur ne peut pas être “Beginner” s’il est contenu entre 4 et 6.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;div id=&quot;GFQaEYEc8_8&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/GFQaEYEc8_8&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://perso.univ-lemans.fr/~cpiau/BD/SQL_PAGES/SQL0.html#L2-2&quot;&gt;https://perso.univ-lemans.fr/~cpiau/BD/SQL_PAGES/SQL0.html#L2-2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Livre : BAPTISTE, Jean-Luc. &lt;em&gt;&lt;a href=&quot;https://www.editions-eni.fr/livre/merise-guide-pratique-3e-edition-modelisation-des-donnees-et-des-traitements-manipulations-avec-le-langage-sql-9782409015342&quot;&gt;Merise - guide pratique - modélisation des données et des traitements&lt;/a&gt;, manipulations avec le langage SQL&lt;/em&gt;. Editions ENI. 2021.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>La révolution visuelle qu&#39;apporte Figma aux non-designers</title>
    <link href="https://www.teotimepacreau.fr/blog/figma-pour-les-non-designers/" />
    <updated>2024-08-23T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/figma-pour-les-non-designers/</id>
    <content type="html">&lt;p&gt;A mon arrivée chez &lt;a href=&quot;https://www.modernisation.gouv.fr/laboratoires/etatlin&quot;&gt;Etat’LIN, le laboratoire d’innovation publique de l’Etat en Pays de la Loire&lt;/a&gt;, j’ai été intégré à une équipe de designers de service. L’une des premières choses qui m’a frappé est la capacité des designers à donner vie aux idées. Les réflexions s’accompagnent toujours d’une matérialisation sous forme de schéma ou de dessin qui sont ensuite accrochés aux murs pour obtenir une image claire de la situation en un coup d’oeil. Cela a pour effet de rendre tangible les intentions et facilite l’alignement de l’équipe sur une idée.
Cette manière de procéder peut paraître habituelle pour ceux qui travaillent dans les milieux habitués aux méthodes issues du design. Mais pour moi, venant de métiers de gestion opérationnelle et d’approche classique de gestion, cela semblait complètement étranger. Un instinct de traduction des idées en formes matérielles plutôt qu’un réflexe d’écrit.&lt;/p&gt;
&lt;p&gt;-&amp;gt; &lt;em&gt;Alors, comment rendre visible, en un coup d’oeil, des idées et systèmes complexes ?&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/prototypage-design.png&quot; alt=&quot;Photo de prototypes d&#39;une interface numérique sur des wireframe papier&quot;&gt;&lt;figcaption&gt;Exemple de traduction d’idées en prototype et notes tangibles&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Depuis la pandémie, nous sommes tous devenus habitués aux “tableaux blancs collaboratif visuel”.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/figjam_collaboratif.png&quot; alt=&quot;Capture d&#39;écran d&#39;un atelier collaboratif sur Figjam&quot;&gt;&lt;figcaption&gt;Un atelier collaboratif sur le tableau collaboratif de Figma&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Ces outils fournissent des canvas collaboratifs - des espaces infinis et zoomables pour le travail. Ils sont bien plus que de simples “tableaux blancs virtuels” car ils apportent une nouvelle manière de rendre accessible et tangible le travail lié à la connaissance.&lt;/p&gt;
&lt;h2 id=&quot;quel-outil-num%C3%A9rique-utiliser-pour-sch%C3%A9matiser-sans-savoir-dessiner-%3F&quot; tabindex=&quot;-1&quot;&gt;Quel outil numérique utiliser pour schématiser sans savoir dessiner ?&lt;/h2&gt;
&lt;p&gt;Les travaux liés à la stratégie, l’organisation ou les approches type “consultant” requièrent de présenter, de façon macro, des concepts abstraits. Il est souvent indispensable de présenter une vue d’ensemble aux commanditaires :&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;en&quot;&gt;The language of strategy is about “10,000ft view” or “birds eye view” or “bigger picture”. But which of our digital tools provide this big picture view? Typically, presentations…. except this linear flow of 16x9 rectangles is not the right tool for the job.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;CRITCHLOW, Tom. &lt;a href=&quot;https://newsletter.seomba.com/i/33888235/a-canvas-for-strategy-work&quot;&gt;&lt;em&gt;A canva for strategy work&lt;/em&gt;&lt;/a&gt;. Article, 2021&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;La solution la plus répandue pour présenter des concepts, analyses, plans… est de présenter un diapo PowerPoint. Cependant, le flow linéaire des slides que l’on connaît tous a un &lt;a href=&quot;https://www.teotimepacreau.fr/blog/amazon-memo-6-pages/#:~:text=meetings%20non-n%C3%A9cessaires-,pourquoi%20powerpoint%20n%E2%80%99est%20pas%20efficace%20en%20reunion%20et%20banni%20par%20amazon,-From%3A%20Bezos%2C%20Jeff&quot;&gt;écueil majeur : il est facile de se laisser happer par la façon dont sont présentées les informations plutôt que par le fond des idées. Le format invite naturellement à couper l’orateur pour poser des questions durant la présentation alors que la réponse peut-être inclus dans la slide d’après.&lt;/a&gt;. De plus, les slides sont peu adaptées pour présenter une vision macro d’ensemble et montrer les interconnexions.&lt;/p&gt;
&lt;p&gt;Figma est idéal pour présenter du contenu façon “big picture” et permet également d’aller profondément dans le détail via le zoom infini. L’outil rend simple les allers-retours, liens entre les éléments, l’intégration de formats multiples (PDF, images, textes, vidéos…). Cette expérience zoomable et intuitive facilite le travail stratégique, pour présenter les points clés, systèmes, modèles…&lt;/p&gt;
&lt;h3 id=&quot;le-changement-fondamental-apport%C3%A9-dans-l%E2%80%99%C3%A9change-de-feedback&quot; tabindex=&quot;-1&quot;&gt;Le changement fondamental apporté dans l’échange de feedback&lt;/h3&gt;
&lt;p&gt;Une grande partie du travail de consultant nécessite des allers et retours avec le commanditaire pour affiner le travail fourni via des observations. Les blocs de commentaires des éditeurs de texte type Word sont souvent utilisés pour y répondre : on sélectionne une portion de texte et l’on adjoint un commentaire. Est-ce réellement efficace ? Il y a besoin de nombreux allers-retours du document qui font perdre du temps quand on n’utilise pas d’éditeur de texte collaboratif type Google Docs. Et comment faire quand j’ai non pas une observation textuelle à ajouter mais un autre document vers lequel pointer ? Lier des concepts entre eux ?&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/commentaires_word.png&quot; alt=&quot;Capture d&#39;écran de l&#39;interface de commentaires Word&quot;&gt;&lt;figcaption&gt;L’interface de commentaires Word&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Figma change totalement l’approche traditionnelle d’échange de feedback en permettant d’adjoindre des documents PDF, des images, des posts-it en plus des commentaires et de tracer physiquement des liens entres les annotations et les documents étudiés. De plus, pas de fichier à s’envoyer en boucle : le canva collaboratif se met à jour avec les ajouts. Le format canva ouvre de nouveaux horizons pour la collaboration et permet une finesse d’analyse que l’on peut difficilement atteindre avec une succession de commentaire d’éditeur de texte.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/analyse_collaborative_figma.png&quot; alt=&quot;Capture d&#39;écran d&#39;une analyse collaborative de document sur Figma : 8 pages de PDF sont annotées et liées à des posts-it, images et documents&quot;&gt;&lt;figcaption&gt;Une analyse collaborative de document sur Figma par &lt;a href=&quot;https://x.com/dcardo/status/1361821788406247426&quot;&gt;Daniel Cardoso Llach, chercheur sur l’impact des technologies sur les processus de design&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;exemple-pratique&quot; tabindex=&quot;-1&quot;&gt;Exemple pratique&lt;/h3&gt;
&lt;p&gt;Il m’a été demandé de faire le bilan de la réorganisation à l’oeuvre depuis une année d’une direction de la DREAL (Direction Régionale de l’Environnement, de l’Aménagement et du Logement) composé d’une vingtaine de collaborateurs.
Après avoir questionné et qualifié la commande avec le commanditaire, nous avons convenu que le besoin exprimé était de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;caractériser les évolutions introduites par la réorganisation avec les managers et d’esquisser des premières pistes d’actions correctrices.&lt;/li&gt;
&lt;li&gt;récolter l’expression et le ressenti de l’ensemble des agents du service au sujet de la réorganisation, envisager des pistes d’amélioration puis prioriser les actions à engager.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il me fallait donc concevoir deux séminaires en construisant des outils sur-mesure et en ré-adaptant des outils de facilitation connus. Après avoir segmenté les différents objectifs à atteindre dans les temps impartis, j’ai consulté la boîte à outils de facilitation &lt;a href=&quot;https://www.utilo.org/outils/&quot;&gt;Utilo&lt;/a&gt; en matchant les thématiques du guide aux buts identifiés des temps collectifs.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/utilo.png&quot; alt=&quot;Capture d&#39;écran de thématiques du guide Utilo&quot;&gt;&lt;figcaption&gt;Thématiques du guide Utilo&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Pour adapter les outils et créer les supports manquants, j’utilise Figma. Lors du temps de validation préalable avec le commanditaire, il est très simple de présenter l’idée globale et le détail des outils graĉe au format en canva. Le principal avantage est de réduire les allers-retours avec le commanditaire et de pouvoir expliquer en détail les points qui suscitent des interrogations.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/facilitation_organisationnelle.png&quot; alt=&quot;Canva de facilitation organisationnelle&quot;&gt;&lt;figcaption&gt;Le canva de facilitation organisationnelle proposé&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;La restitution des ateliers est facilement intégrable et permet d’avoir un livrable prêt à être remis.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://newsletter.seomba.com/p/the-visual-revolution-in-knowledge&quot;&gt;https://newsletter.seomba.com/p/the-visual-revolution-in-knowledge&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Les bases pour modéliser une base de données</title>
    <link href="https://www.teotimepacreau.fr/blog/modelisation-base-de-donnees/" />
    <updated>2024-08-02T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/modelisation-base-de-donnees/</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt; : Cet article aborde une approche de modélisation issue de la méthode de &lt;a href=&quot;https://fr.wikipedia.org/wiki/Merise_(informatique)&quot;&gt;Merise&lt;/a&gt;. Il existe de nombreuses autres méthodes et approches qui font varier la complexité.&lt;/p&gt;
&lt;h2 id=&quot;pr%C3%A9figurer-un-mod%C3%A8le-de-donn%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;Préfigurer un modèle de données&lt;/h2&gt;
&lt;p&gt;Prenons l’exemple d’une sollicitation d’un service marketing qui procède à des enquêtes de satisfaction client. Celui-ci souhaite sortir de son modèle traditionnel de récolte de questionnaire de satisfaction papier puis traitement sous tableur. Le service exprime le besoin de centraliser les réponses obtenues et d’automatiser l’envoi d’enquêtes par mail.&lt;/p&gt;
&lt;p&gt;Suite à une réunion de cadrage et qualification du besoin, vous repartez avec cette problématique affinée : “des chefs de projets marketing sont en charge de l’élaboration d’enquêtes clients. On souhaite à terme spécialiser chaque chef de projet marketing sur une typologie d’enquête, chaque type d’enquête à des questions specifiques mais toutes les enquêtes commencent par un bloc de questions communes. Il faut que l’on puisse tracer quelle enquête a été crée par quel chef de projet marketing. Tous les types d’enquête recueillent l’âge, le nom, l’adresse du client. Nous souhaitons que les enquêtes soient adressées par mail aux clients.”&lt;/p&gt;
&lt;p&gt;Avant d’entrer dans la conception de la solution numérique, il est nécessaire de conceptualiser notre modèle de données. En effet, celui-ci conditionnera l’architecture de la solution. Il prendra la forme d’un schéma qui matérialisera les différentes relations entre nos données. Pour cela, voyons plus en détail une méthode simple à utiliser.&lt;/p&gt;
&lt;h2 id=&quot;dictionnaire-de-donn%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;Dictionnaire de données&lt;/h2&gt;
&lt;p&gt;La méthode Merise invite à mener des interviews et à analyser les documents utilisés par le service dans le but d’établir le dictionnaire de données.
Il s’agit d’un tableau qui recense toutes les données que comporte le problème. Une donnée est une occurence non-décomposable qui est amenée à varier. Le tableau précise les caractéristiques de la donnée retenue.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nom de la donnée&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Taille&lt;/th&gt;
&lt;th&gt;Type élémentaire ou calculé&lt;/th&gt;
&lt;th&gt;Document associé&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;age_client&lt;/td&gt;
&lt;td&gt;Entier&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nom_client&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prenom_client&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;numero_de_rue_client&lt;/td&gt;
&lt;td&gt;Alphanumérique&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nom_de_rue_client&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cp_client&lt;/td&gt;
&lt;td&gt;Entier&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Entier&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ville_client&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Fiche client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nom_categorie&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Enquete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;questions_specifiques_categorie&lt;/td&gt;
&lt;td&gt;Alphanumérique&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Enquete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;questions_communes_enquete&lt;/td&gt;
&lt;td&gt;Alphanumérique&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;Enquete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nom_chef_projet_marketing&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prenom_chef_projet_marketing&lt;/td&gt;
&lt;td&gt;Alphabétique&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;Elémentaire&lt;/td&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Le bloc “Adresse” a été divisé en 4 données séparées : “n° de rue”, “nom de rue”, “CP” et “Ville”. En effet “Adresse” était décomposable, or si l’on souhaite à terme requêter le nombre de clients qui ont participés à l’enquête dans une ville précise il est nécessaire d’avoir un champ séparé pour la ville.&lt;/p&gt;
&lt;h2 id=&quot;les-d%C3%A9pendances-fonctionnelles&quot; tabindex=&quot;-1&quot;&gt;Les dépendances fonctionnelles&lt;/h2&gt;
&lt;p&gt;A la suite du dictionnaire de données, il peut être utile d’identifier quelles données dépendent de quel identifiant unique.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Identifiant unique&lt;/th&gt;
&lt;th&gt;Données dépendantes fonctionnellement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;id_client&lt;/td&gt;
&lt;td&gt;age_client, nom_client, prenom_client, numero_rue_client, nom_rue_client, cp_client, ville_client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nom_categorie&lt;/td&gt;
&lt;td&gt;questions_specifiques_categorie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chef_marketing_id&lt;/td&gt;
&lt;td&gt;nom_chef_projet_marketing, prenom_chef_projet_marketing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;id_enquete&lt;/td&gt;
&lt;td&gt;questions_communes_enquete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;le-mod%C3%A8le-conceptuel-de-donn%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;Le Modèle Conceptuel de Données&lt;/h2&gt;
&lt;p&gt;Plusieurs types de schémas conceptuels existent, correspondants aux différents types de base de données que l’on peut rencontrer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le modèle hiérarchique&lt;/li&gt;
&lt;li&gt;le modèle réseaux sémantiques&lt;/li&gt;
&lt;li&gt;le modèle entité / attribut / relation (appelé ERD en anglais)&lt;/li&gt;
&lt;li&gt;le modèle objet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par souci de simplicité nous nous appuierons sur le modèle entité / attribut / relation qui est fréquemment utilisé pour les bases de données relationnelles.&lt;br&gt;
Si vous ne savez pas ce qu’est une base de données relationnelle ou dans quels cas l’utiliser, je vous invite à consulter &lt;a href=&quot;https://www.teotimepacreau.fr/blog/sqlite/&quot;&gt;mon article sur le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le fondement de notre BDD repose sur les entités : elles représentent les sujets qui composent le processus informationnel pour lequel nos données seront enregistrées.
Une entité possède des attributs : il s’agit de propriétés qui caractérisent l’entité. Par exemple pour une entité “citoyen” les attributs pourront être “âge, genre, situation familiale”.&lt;/p&gt;
&lt;p&gt;Pour passer du dictionnaire de données à la modélisation des Entités-Attributs, on regroupe les données qui ont un lien entre elles en se demandant de quelles données uniques elles dépendent.
Voici la modélisation de notre problème posé en introduction :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/MCD_entite_attribut.png&quot; alt=&quot;Capture d&#39;écran de la modélisation en entité-attribut&quot;&gt;&lt;figcaption&gt;Modélisation en entité-attribut&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;les-relations-et-leurs-cardinalit%C3%A9s&quot; tabindex=&quot;-1&quot;&gt;Les relations et leurs cardinalités&lt;/h3&gt;
&lt;p&gt;Les relations décrivent comment les entités interagissent entre elles. Les relations sont généralement marquées par des verbes “achète à”, “est traité par”…
La relation peut comporter des attributs, on l’appelle alors “relation porteuse”.&lt;/p&gt;
&lt;p&gt;Les cardinalités sont des indicateurs qui matérialisent la qualité de la relation entre deux entités. Par exemple pour deux entités “Enquêtes” et “Clients”, les cardinalités sont le nombre de clients pour lesquelles il peut exister a minima et a maxima une ebquête et inversement.&lt;br&gt;
La méthode pour les définir est de toujours exprimer un minimum : “Un client peut remplir au minimum combien d’enquêtes ? 0, 1 ou n ? (n représentant l’infini)”. Et un maximum  :“Un client peut remplir au maximum combien d’enquêtes ? 0, 1 ou n ?”.&lt;/p&gt;
&lt;p&gt;Ces cardinalités sont précieuses car elles nous permettront de vérifier la qualité de notre modèle puis de transformer le modèle en tables grâce à des règles de normalisation.&lt;/p&gt;
&lt;p&gt;Voici, pour notre exemple, les relations et leurs cardinalités :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/relations-cardinalites-merise.png&quot; alt=&quot;Capture d&#39;écran de la modélisation des relations Merise&quot;&gt;&lt;figcaption&gt;Modélisation des relations et de leurs cardinalites&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;cas-particulier-de-la-n%C3%A9cessit%C3%A9-de-concat%C3%A9ner-plusieurs-identifiants-pour-identifier-de-mani%C3%A8re-unique&quot; tabindex=&quot;-1&quot;&gt;Cas particulier de la nécessité de concaténer plusieurs identifiants pour identifier de manière unique&lt;/h3&gt;
&lt;p&gt;Prenons un tout autre exemple avec un modèle conceptuel de données qui stockerait des informations au sujet d’appartements, l’étage, l’immeuble et la rue auxquels ils se rattachent.
Un appartement ne peut pas être identifié de manière unique par sa lettre_appartement car il peut y avoir un appart A au 1er étage et un appart A au 2ème étage, on exprime alors avec les parenthèses autour des cardinalités que les entités du côté de ces cardinalités seront identifiées par la concaténation des identifiants de toute la chaîne de la relation.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/merise-concat%C3%A9nation_identifiants.png&quot; alt=&quot;Capture d&#39;écran de la modélisation conceptuel de données de l&#39;exemple&quot;&gt;&lt;figcaption&gt;Modélisation conceptuel des données de l’exemple, crédit schéma et exemple : Idriss Neumann&lt;/figcaption&gt;&lt;/figure&gt;
&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;Rue (code_rue, nom_rue)
Immeuble (num_immeuble, code_rue#, nb_etages_total)
Etage (num_etage, num_immeuble#, code_rue#, nb_appartements_tot)
Appartement (lettre_appartement, num_etage#, num_immeuble#, code_rue#, nb_pieces_total)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cl%C3%A9-primaire-et-%C3%A9trang%C3%A8re&quot; tabindex=&quot;-1&quot;&gt;Clé primaire et étrangère&lt;/h3&gt;
&lt;p&gt;Le principe de clés est indispensable pour faire référence à un enregistrement précis d’une table.
La clé primaire est l’identifiant unique d’une entité. Celle-ci peut-être &lt;em&gt;artificielle&lt;/em&gt;, c’est à dire créée de toute pièce, ou être naturellement &lt;em&gt;candidate&lt;/em&gt; c’est à dire être une colonne déjà existante ou la concaténation de plusieurs colonnes.
La clé étrangère est une référence à l’identifiant unique d’une autre entité. Utile pour mettre en relation deux enregistrements qui ont un rapport entre eux.&lt;/p&gt;
&lt;h2 id=&quot;comment-sch%C3%A9matiser-facilement-notre-mod%C3%A8le-conceptuel-de-donn%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;Comment schématiser facilement notre Modèle Conceptuel de Données&lt;/h2&gt;
&lt;p&gt;J’utilise l’outil gratuit en ligne &lt;a href=&quot;https://app.diagrams.net/&quot;&gt;Draw.io&lt;/a&gt; qui a un sous-menu dédié “Relation entre les éléments”.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/interface_drawio.png&quot; alt=&quot;Interface de Draw.io&quot;&gt;&lt;figcaption&gt;Interface de &lt;a href=&quot;http://Draw.io&quot;&gt;Draw.io&lt;/a&gt;, volet latéral composé du sous-menu relation entre les éléments&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;div id=&quot;OxJo051TMr8/&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/OxJo051TMr8/&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://fr.wikiversity.org/wiki/Introduction_aux_syst%C3%A8mes_de_bases_de_donn%C3%A9es/Introduction/&quot;&gt;https://fr.wikiversity.org/wiki/Introduction_aux_systèmes_de_bases_de_données/Introduction/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.base-de-donnees.com/mcd/&quot;&gt;https://www.base-de-donnees.com/mcd/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ineumann.fr/docs/bdd/initiation-merise&quot;&gt;https://www.ineumann.fr/docs/bdd/initiation-merise&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Miser sur l&#39;autonomie des collaborateurs via la double boucle de feedback en management</title>
    <link href="https://www.teotimepacreau.fr/blog/double-boucle-feedback-management/" />
    <updated>2024-06-07T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/double-boucle-feedback-management/</id>
    <content type="html">&lt;p&gt;Personne ne souhaite être un micro-manager, mais bien souvent le manque de temps et la pression des objectifs empêche de laisser une part importante d’autonomie aux équipes. Pourtant &lt;a href=&quot;https://hbr.org/2021/10/forget-flexibility-your-employees-want-autonomy&quot;&gt;l’autonomie est le critère majeur d’engagement au travail&lt;/a&gt;. L’autonomie accordée est une marque de confiance dans les compétences du salarié. C’est un élément indispensable à toute performance.
Alors comment garder une équipe aux compétences variées synchronisée sans être constamment dans la surveillance des tâches ?&lt;/p&gt;
&lt;h2 id=&quot;mettre-en-place-des-objectifs-pour-inciter-plut%C3%B4t-que-surveiller&quot; tabindex=&quot;-1&quot;&gt;Mettre en place des objectifs pour inciter plutôt que surveiller&lt;/h2&gt;
&lt;p&gt;Nous manquons souvent de sens dans les organisations. En comprenant l’intention globale d’une tâche celle-ci paraît toute de suite plus motivante et claire. Voici une méthode pour rendre du sens :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Créer un objectif de premier niveau&lt;/strong&gt;: Cet objectif devrait viser une atteinte cyclique (trimestriel/annuel…) réaliste. Celui-ci doit-être co-construit avec l’ensemble de l’équipe pour s’assurer qu’il est partagé et bien compris par tous, révisable si besoin. Il donne une vision du but global à atteindre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Créer des sous-objectifs&lt;/strong&gt;: Une fois que toute l’équipe est alignée sur le premier objectif il faut confier à chaque membre de l’équipe la responsabilité de fixer lui-même son sous-objectif. Celui-ci devrait représenter une petite partie de &lt;em&gt;l’objectif de premier niveau&lt;/em&gt;. Il devrait résumer clairement le plan pour atteindre l’objectif. Les updates doivent être menés par le collaborateur selon le rythme adapté à l’ampleur de la tâche.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;la-double-boucle-de-feedback-pour-partager-ensemble-les-avanc%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;La double boucle de feedback pour partager ensemble les avancées&lt;/h2&gt;
&lt;p&gt;On distingue deux types de rituel :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la boucle de feedback &lt;strong&gt;journalière&lt;/strong&gt; aide l’équipe à rester synchronisée, à débugger les problèmes, prioriser les tâches.&lt;/li&gt;
&lt;li&gt;la boucle de feedback à &lt;strong&gt;échéance fixe&lt;/strong&gt; (hebdomadaire/mensuelle…) permet de partager les updates des sous-objectifs et garder l’équipe alignée dans l’avancement des tâches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette méthode permet de partager le contexte de façon quotidtienne et de rester aligné avec un &lt;em&gt;sous-objectif&lt;/em&gt; atteignable à court terme et un &lt;em&gt;objectif de premier niveau&lt;/em&gt; qui donne du sens.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://continuouscoordination.org/keep-a-steady-beat/&quot;&gt;https://continuouscoordination.org/keep-a-steady-beat/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://steady.space/blog/cure-for-micromanagement/&quot;&gt;https://steady.space/blog/cure-for-micromanagement/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Synchroniser un repo Github avec Gitlab</title>
    <link href="https://www.teotimepacreau.fr/blog/synchroniser-github-et-gitlab/" />
    <updated>2024-06-04T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/synchroniser-github-et-gitlab/</id>
    <content type="html">&lt;p&gt;Pour des raisons techniques, j’ai eu besoin de cloner un repo existant sur Github dans l’alternative open-source &lt;a href=&quot;https://about.gitlab.com/&quot;&gt;Gitlab&lt;/a&gt;. Je souhaitais synchroniser tout les changements effectués dans le repo Gitlab en les poussant vers le repo Github.
Gitlab offre la synchronisation en PUSH vers Github à tous les utilisateurs tandis que la synchronisation en GET est réservée aux comptes Gitlab PREMIUM (payant).&lt;/p&gt;
&lt;h2 id=&quot;clonage-d%E2%80%99un-repo-github-dans-gitlab&quot; tabindex=&quot;-1&quot;&gt;Clonage d’un repo Github dans Gitlab&lt;/h2&gt;
&lt;p&gt;Gitlab propose de créer un repo en clônant un repo pré-existant d’un autre service via “Importer un projet”. Il suffit de fournir l’URL du repo Github.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/gitlab-clonage1.png&quot; alt=&quot;Capture de la page de proposition des modalités de création de repo Gitlab&quot;&gt;&lt;figcaption&gt;Clonage d’un repo pré-existant&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;L’interface demande ensuite de remplir des champs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le nom d’utilisateur correspond au nom d’utilisateur du repo distant Github&lt;/li&gt;
&lt;li&gt;le mot de passe correspond à un token d’accès personnel que nous devons générer depuis &lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;https://github.com/settings/tokens&lt;/a&gt; pour autoriser Gitlab à tirer depuis notre compte Github&lt;/li&gt;
&lt;li&gt;cocher la case “Dépôt miroir”&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/gitlab-clonage2.png&quot; alt=&quot;Capture des Champs demandés par Gitlab pour autoriser le clonage du projet&quot;&gt;&lt;figcaption&gt;Champs demandés par Gitlab pour autoriser le clonage du projet&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;pousser-le-repo-gitlab-vers-github-automatiquement&quot; tabindex=&quot;-1&quot;&gt;Pousser le repo Gitlab vers Github automatiquement&lt;/h2&gt;
&lt;p&gt;La poussée des modifications vers le dépôt Github comprend Les branches, les étiquettes et les commits.&lt;/p&gt;
&lt;p&gt;Pour cela il faut se rendre dans le repo Gitlab -&amp;gt; Paramètres -&amp;gt; Dépôt -&amp;gt; Dépôts miroirs. Il faut de nouveau coller l’url du dépôt distant Github et placer le nom d’utilisateur Github. Le champ “mot de passe” correspond au token généré précédemment sur Github.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/gitlab-synchronisation.png&quot; alt=&quot;Capture des champs requis pour synchroniser&quot;&gt;&lt;figcaption&gt;Champs requis pour synchroniser&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;N’importe quel commit effectué sera poussé depuis Gitlab vers Github.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Créer un menu hamburger fonctionnant sans Javascript grâce à Popover API</title>
    <link href="https://www.teotimepacreau.fr/blog/menu-hamburger-fonctionnant-sans-javascript-accessible/" />
    <updated>2024-05-23T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/menu-hamburger-fonctionnant-sans-javascript-accessible/</id>
    <content type="html">&lt;h2 id=&quot;les-bases-d%E2%80%99un-menu-en-html-s%C3%A9mantique&quot; tabindex=&quot;-1&quot;&gt;Les bases d’un menu en HTML sémantique&lt;/h2&gt;
&lt;p&gt;Un menu est constitué de liens, on utilise donc la balise HTML &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; pour représenter les liens.&lt;/p&gt;
&lt;p&gt;Quand il y a plusieurs liens, il convient de créer une liste de liens en wrappant les &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; dans des &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;. Cela confère plusieurs avantages pour les utilisateurs assistés par un lecteur d’écran :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l’annonce vocale préalable de chaque liens&lt;/li&gt;
&lt;li&gt;un raccourci pour sauter entre chaque élément de liste&lt;/li&gt;
&lt;li&gt;l’annonce voccale de l’index de l’item sélectionné (par exemple “élément de liste, deux parmi quatre”)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On wrap les &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; dans une liste non-ordonnée &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;. Enfin, on wrap le tout dans l’élément HTML de navigation sémantique &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;. Utiliser &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; permet de bénéficier du &lt;strong&gt;landmark&lt;/strong&gt; de navigation pour que le navigateur identifie plus facilement la section dédiée (un &lt;strong&gt;landmark&lt;/strong&gt; est une région de la page de première importance reconnue par le navigateur).&lt;/p&gt;
&lt;h2 id=&quot;popover%2C-l%E2%80%99api-de-navigateur-d%C3%A9di%C3%A9e-aux-%C3%A9l%C3%A9ments-flottants&quot; tabindex=&quot;-1&quot;&gt;Popover, l’API de navigateur dédiée aux éléments flottants&lt;/h2&gt;
&lt;p&gt;Popover est un nouvel attribut HTML &lt;a href=&quot;https://developer.mozilla.org/fr/docs/Web/API/Popover_API&quot;&gt;supporté par l’ensemble des navigateurs&lt;/a&gt;. Il offre un mécanisme natif pour afficher du contenu au dessus de la page &lt;strong&gt;sans Javascript&lt;/strong&gt;. L’élément est masqué par défaut avec &lt;code&gt;display: none&lt;/code&gt; jusqu’au déclenchement de son ouverture par l’élément qui le contrôle.
Plusieurs fonctionnalités lui sont automatiquement associées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Top-layer”, une couche de superposition est automatiquement créée pour que le popover s’affiche au-dessus de n’importe quel &lt;code&gt;z-index&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;“Light-dismiss”, un simple clic en dehors du popover le ferme automatiquement.&lt;/li&gt;
&lt;li&gt;“Tab focus”, le focus se place automatiquement dans le popover après ouverture.&lt;/li&gt;
&lt;li&gt;“Keyboard support”, tapper sur&lt;code&gt;ESC&lt;/code&gt; ferme le popover et retourne le focus au contenu en arrière plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;video controls=&quot;&quot; muted=&quot;&quot;&gt;
    &lt;source src=&quot;https://www.teotimepacreau.fr/img/popover-sans-javascript.mp4&quot; alt=&quot;Ouverture et fermeture d&#39;un menu de navigation popover sur un navigateur où Javascript est désactivé&quot; title=&quot;Ouverture et fermeture d&#39;un menu de navigation popover sur un navigateur où Javascript est désactivé&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;
  Ouverture et fermeture d&#39;un menu de navigation popover sur un navigateur où Javascript est désactivé
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&quot;comment-cr%C3%A9er-notre-menu-hamburger-de-navigation-avec-popover&quot; tabindex=&quot;-1&quot;&gt;Comment créer notre menu hamburger de navigation avec Popover&lt;/h3&gt;
&lt;p&gt;Quand on crée un menu hamburger, plusieurs règles d’UX s’imposent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le reste de la page doit rester utilisable pour l’utilisateur. On ne souhaite pas que l’ouverture du menu vienne interrompre l’action en cours. En terme technique c’est un comportement &lt;strong&gt;non-modal&lt;/strong&gt; &lt;a href=&quot;https://www.nngroup.com/articles/modal-nonmodal-dialog/&quot;&gt;(pour plus d’informations sur la différence modal - non modal voir ce lien)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;on souhaite que le menu se superpose au contenu plutôt que de pousser le contenu vers un côté. &lt;a href=&quot;https://ux.stackexchange.com/questions/46305/navigation-drawer-tablet-push-or-overlay/&quot;&gt;Cela préserve l’importance du contenu de la page en arrière plan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;un simple clic en dehors du menu ou la touche &lt;code&gt;ESC&lt;/code&gt; doit fermer le menu&lt;/li&gt;
&lt;li&gt;un bouton actionne l’ouverture et la fermeture du menu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’API Popover est composée d’un attribut HTML &lt;code&gt;popover&lt;/code&gt; à placer sur l’élément à faire flotter. On place, sur un un bouton d’ouverture un attribut &lt;code&gt;popovertarget&lt;/code&gt; qui prend en valeur l’ID de notre élément flottant. On spécifie l’action via &lt;code&gt;popovertargetaction&lt;/code&gt; : celle-ci peut prendre 3 valeurs &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;hide&lt;/code&gt; ou &lt;code&gt;auto&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertarget&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertargetaction&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;show&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popover&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertarget&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertargetaction&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;HOME&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/blog&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;BLOG&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/projets&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;PROJETS&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;animer-l%E2%80%99ouverture-et-la-fermeture-du-popover&quot; tabindex=&quot;-1&quot;&gt;Animer l’ouverture et la fermeture du Popover&lt;/h3&gt;
&lt;p&gt;Il est possible de donner un style d’avant ouverture au popover via le sélecteur CSS &lt;code&gt;:popover-open&lt;/code&gt; et la règle &lt;code&gt;@starting-style&lt;/code&gt;. &lt;code&gt;@starting-style&lt;/code&gt; est une nouvelle règle CSS qui permet de définir le style d’un élément &lt;em&gt;avant&lt;/em&gt; son entrée dans le champ. On donne ensuite un style à l’état ouvert dans &lt;code&gt;:popover-open&lt;/code&gt;. Enfin on donne un style à l’état fermé directement dans l’attribut &lt;code&gt;[popover]&lt;/code&gt;. La propriété &lt;code&gt;display&lt;/code&gt; est dite “discrète” par nature : &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties#discrete&quot;&gt;cela signifie qu’elle ne peut pas être animée de façon native&lt;/a&gt;. Pour pouvoir animer &lt;code&gt;display&lt;/code&gt;, la propriété &lt;code&gt;transition-behavior: allow-discrete&lt;/code&gt; est désormais prise en charge par tous les navigateurs sauf Firefox.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;[popover]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100dvh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 60dvw&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; transform .2s ease-out&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; opacity .2s ease-out&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    display .2s ease-out&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition-behavior&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; allow-discrete&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/*POPOVER EN ETAT FERMÉ*/&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-50px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;[popover]:popover-open&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@starting-style&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/*POPOVER AVANT L&#39;ENTREE DANS LE CHAMP*/&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;-50px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;/*POPOVER EN ETAT OUVERT*/&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;translateX&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;
  &lt;video controls=&quot;&quot; muted=&quot;&quot; height=&quot;400&quot; style=&quot;height: 400px!important&quot;&gt;
    &lt;source src=&quot;https://www.teotimepacreau.fr/img/popover.mp4&quot; alt=&quot;Ouverture et fermeture d&#39;un menu de navigation popover avec animation d&#39;opacité et de déplacement&quot; title=&quot;Animation d&#39;ouverture et de fermeture du popover&quot; type=&quot;video/mp4&quot;&gt;
  &lt;/video&gt;
  &lt;figcaption&gt;
  Animation d&#39;ouverture et de fermeture du popover
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;les-attributs-d%E2%80%99accessibilit%C3%A9-inclus-par-d%C3%A9faut-dans-le-popover&quot; tabindex=&quot;-1&quot;&gt;Les attributs d’accessibilité inclus par défaut dans le popover&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aria-expanded&lt;/code&gt; : quand un popover est invoqué par un &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; le navigateur associe automatiquement l’état étendu &lt;code&gt;aria-expanded=”true”&lt;/code&gt; ou replié &lt;code&gt;aria-expanded=”false”&lt;/code&gt; au bouton associé (fonctionne seulement quand l’élément HTML bouton invoque le popover)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aria-details&lt;/code&gt; : il s’agit d’un attribut qui démontre la relation entre deux éléments HTML. Si notre popover ne suit pas directiment notre bouton, le navigateur se charge d’établir automatiquement le &lt;code&gt;aria-details&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;les-attributs-d%E2%80%99accessibilit%C3%A9-qu%E2%80%99il-est-pertinent-d%E2%80%99ajouter-%C3%A0-notre-hamburger-menu-popover&quot; tabindex=&quot;-1&quot;&gt;Les attributs d’accessibilité qu’il est pertinent d’ajouter à notre hamburger menu popover&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;aria-controls&lt;/code&gt;. Permet d’indiquer quel est l’élément actionné par le bouton. On indique l’ID de l’élément actionné. &lt;strong&gt;Se place sur le bouton.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aria-haspopup=&amp;quot;true&amp;quot;&lt;/code&gt;. Indique que le bouton sécrète un menu. Cela permet d’avertir que, lorsque le bouton est pressé, l’utilisateur sera déplacé vers le menu. &lt;strong&gt;Se place sur le bouton.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aria-label&lt;/code&gt;. Permet de donner un nom accessible à un élément. On souhaite expliquer avec un nom accessible le rôle du bouton d’ouverture : “ouvrir la navigation principale”. Pour l’élément &lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt; on indique seulement le niveau de la navigation car le lecteur d’écran annoncer d’emblée qu’il s’agit d’un élément de navigation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aria-current=&amp;quot;page&amp;quot;&lt;/code&gt;. Permet de signifier sur quel page de la navigation se trouve actuellement l’utilisateur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type=”button”&lt;/code&gt;. Permet de s’assurer que le bouton ne tente pas de soumettre un formulaire (comportement par défaut). &lt;strong&gt;Se place sur le bouton.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;popovertarget&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;popovertargetaction&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;show&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;ouvrir la navigation principale&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;aria-controls&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;aria-haspopup&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Principale&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;popover&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-label&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fermer la navigation principale&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-controls&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertarget&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mobile-navigation&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;popovertargetaction&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;hide&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-current&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/index&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;HOME&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/blog&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;BLOG&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/projets&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;PROJETS&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://hidde.blog/popover-accessibility/&quot;&gt;https://hidde.blog/popover-accessibility/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hidde.blog/dialog-modal-popover-differences/#heading-3/&quot;&gt;https://hidde.blog/dialog-modal-popover-differences/#heading-3/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/articles/website-navigation/&quot;&gt;https://web.dev/articles/website-navigation/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hidde.blog/popover-semantics/&quot;&gt;https://hidde.blog/popover-semantics/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nerdy.dev/using-starting-style-and-transition-behavior-for-enter-and-exit-stage-effects/&quot;&gt;https://nerdy.dev/using-starting-style-and-transition-behavior-for-enter-and-exit-stage-effects/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Le mémo à 6 pages d&#39;Amazon</title>
    <link href="https://www.teotimepacreau.fr/blog/amazon-memo-6-pages/" />
    <updated>2024-04-29T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/amazon-memo-6-pages/</id>
    <content type="html">&lt;p&gt;&lt;em&gt;[&lt;strong&gt;DISCLAIMER&lt;/strong&gt;] Est-ce que j’aime Amazon ? Pas nécessairement. Est-ce que j’admire Jeff Bezos ou d’autres milliardaires des GAFAM ? Non. Par contre, l’efficacité d’Amazon en tant qu’organisation et service client est indéniable.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jeff Bezos estime que la lecture et l’écriture ont joués un rôle majeur dans la construction d’Amazon en tant qu’organisation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.aboutamazon.com/news/company-news/2017-letter-to-shareholders&quot;&gt;En 2017, dans sa lettre annuelle aux actionnaires d’Amazon, Jeff Bezos expose les standards d’organisation de l’entreprise&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;en&quot;&gt;We don’t do PowerPoint (or any other slide-oriented) presentations at Amazon. Instead, we write narratively structured six-page memos. We silently read one at the beginning of each meeting in a kind of “study hall.” Not surprisingly, the quality of these memos varies widely. Some have the clarity of angels singing. They are brilliant and thoughtful and set up the meeting for high-quality discussion. Sometimes they come in at the other end of the spectrum.
[…]I find that much of the time, readers react to great memos very similarly. They know it when they see it. The standard is there, and it is real, even if it’s not easily describable.
Here’s what we’ve figured out. Often, when a memo isn’t great, it’s not the writer’s inability to recognize the high standard, but instead a wrong expectation on scope: they mistakenly believe a high-standards, six-page memo can be written in one or two days or even a few hours, when really it might take a week or more! They’re trying to perfect a handstand in just two weeks, and we’re not coaching them right. The great memos are written and re-written, shared with colleagues who are asked to improve the work, set aside for a couple of days, and then edited again with a fresh mind. They simply can’t be done in a day or two. The key point here is that you can improve results through the simple act of teaching scope – that a great memo probably should take a week or more.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BEZOS, Jeff. &lt;a href=&quot;https://www.aboutamazon.com/news/company-news/2017-letter-to-shareholders&quot;&gt;&lt;em&gt;2017 Letter to Shareholders&lt;/em&gt;&lt;/a&gt;.&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Amazon s’est construit sur une culture de l’écrit dans le but de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clarifier les raisonnements&lt;/li&gt;
&lt;li&gt;faciliter les transferts de connaissance&lt;/li&gt;
&lt;li&gt;éliminer les meetings non-nécessaires&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pourquoi-powerpoint-n%E2%80%99est-pas-efficace-en-r%C3%A9union-et-banni-par-amazon&quot; tabindex=&quot;-1&quot;&gt;Pourquoi PowerPoint n’est pas efficace en réunion et banni par Amazon&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/bezos_email.webp&quot; alt=&quot;Capture d&#39;écran d&#39;un mail de Jeff Bezos adressé à ses équipes. Contenu du mail &amp;quot;From: Bezos, Jeff Sent: Wednesday, June 09, 2004 6:02 pm Subject: Re: No powerpoint presentations from now on at steam. A little more help with the question “why.” Well structured, narrative text is what we’re after rather than just text. If someone builds a list of bullet points in word, that would be just as bad as powerpoint. The reason writing a good 4 page memo is harder than “writing” a 20 page powerpoint is because the narrative structure of a good memo forces better thought and better understanding of what’s more important than what, and how things are related. Powerpoint-style presentations somehow give permission to gloss over ideas, flatten out any sense of relative importance, and ignore the interconnectedness of ideas.&amp;quot;.&quot;&gt;&lt;figcaption&gt;Mail de Jeff Bezos adressé à ses équipes demandant de stopper l’utilisation de PowerPoint&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Les présentations slides type “bullet points” que l’on connaît tous ont un écueil majeur : la difficulté pour les auditeurs à comprendre où l’orateur veut en venir. Les bullet points manquent naturellement de précision et peuvent cacher des sens contradictoires. Également, il est facile de se laisser happer par la façon dont sont présentées les informations plutôt que sur le fond.
Le format invite naturellement à couper l’orateur pour poser des questions &lt;em&gt;durant&lt;/em&gt; la présentation alors que la réponse peut-être inclus dans la slide d’après.
En contrepied des présentations visuellement plaisantes, Amazon s’est construit sur une culture de l’écrit. Depuis 2004, le processus d’écriture est devenu une doctrine centrale pour guider toute prise de décision.
Chaque réunion est obligatoirement basée sur un document écrit.&lt;/p&gt;
&lt;p&gt;Un des documents clé utilisé par Amazon est le mémo à 6 pages.&lt;/p&gt;
&lt;h3 id=&quot;l%E2%80%99influence-d%E2%80%99edward-tufte&quot; tabindex=&quot;-1&quot;&gt;L’influence d’Edward Tufte&lt;/h3&gt;
&lt;p&gt;Dans l’ouvrage &lt;em&gt;Working Backwards: Insights, Stories, and Secrets from Inside Amazon&lt;/em&gt;, écrit par deux cadres du comité exécutif d’Amazon, ceux-ci révèlent l’influence des travaux d’&lt;a href=&quot;https://www.teotimepacreau.fr/blog/produire-un-document-print-sans-logiciel-de-traitement-de-texte/#:~:text=d%E2%80%99Edward%20Tufte.%20Ce%20dernier%20a%20th%C3%A9oris%C3%A9%20la%20pr%C3%A9sentation%20d%E2%80%99information%20au%20format%20texte%20pour%20qu%E2%80%99elle%20soit%20le%20plus%20compr%C3%A9hensible%20possible&quot;&gt;Edward Tufte&lt;/a&gt; sur le choix de bannir les diapositives.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p lang=&quot;en&quot;&gt;Jeff and I often discussed ways to improve the S-Team meetings. After a difficult presentation in early 2004, on a business flight we read and discussed an essay “The Cognitive Style of PowerPoint: Pitching Out Corrupts Within” by Edward Tufte, a Yale professor who is an authority on information visualization. Tufte identified in one sentence our problem:
“As analysis becomes more causal, multivariate, comparative, evidence based, and resolution-intense, the more damaging the bullet list becomes.”
Tufte’s description fit our discussions at the meetings: complex, interconnected, requiring plenty of information to explore. Such analysis is not well served by a progression of slides that makes it difficult to refer one idea to another. The Amazon audience of tightly scheduled, experienced executives was eager to get to the heart of the matter. They would pepper the presenter with questions and push to get to conclusions. Sometimes the questions did not serve to clarify a point or move the presentation along but would instead lead the entire group away from the main argument. Some questions might be premature and would be answered in a later slide. In his essay, Tufte proposed a solution:
“For serious presentations, replace PowerPoint slides with paper handouts showing words, numbers, data graphics, images together. High-resolution handouts allow viewers to contextualize, compare, narrate, and recast evidence. In contrast, data-thin, forgetful displays tend to make audiences stupid and passive, and also to diminish the credibility of the presenter.”
Tufte’s wise advice on how to banish PowerPoint:
“Making this transition in large organizations requires a straightforward executive order: ‘From now on your presentation software is Microsoft Word, not PowerPoint. Get used to it.’
That is essentially what we did. On June 9, 2004, the members of the S-Team received an email with this subject line: ‘No PowerPoint presentations from now on at S-Team.’ This message was simple, direct, earthshaking: from that day on team members were required to write short narratives [sentences, not bullet lists] describing their ideas, and PowerPoint was banned.&lt;/p&gt;
&lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
&lt;sup class=&quot;sidenote-caller&quot;&gt;
&lt;/sup&gt;
&lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BRYAR Colin, CARR Bill. &lt;a href=&quot;https://www.edwardtufte.com/notebook/edward-tufte-presentation-method-caused-jeff-bezos-amazon-aws-to-throw-out-powerpoint/&quot;&gt;&lt;em&gt;Working Backwards: Insights, Stories, and Secrets from Inside Amazon&lt;/em&gt;&lt;/a&gt;.  St. Martin’s Press, 2021.&lt;/small&gt;
&lt;/span&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;comment-construire-le-m%C3%A9mo-%C3%A0-6-pages-d%E2%80%99amazon&quot; tabindex=&quot;-1&quot;&gt;Comment construire le mémo à 6 pages d’Amazon&lt;/h2&gt;
&lt;p&gt;Le document peut se structurer avec les 6 parties suivantes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Introduction&lt;/strong&gt; : ce que le sujet couvre, données contextuelles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectifs à atteindre&lt;/strong&gt; : l’objectif général en une phrase, puis décomposé en sous-objectifs. Une donnée passée suivie par la donnée future attendue, suivi par un calcul expliqué du changement entre les deux. Le résultat chiffré à atteindre. Bullet points acceptés ici.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Principes clés que suit le projet pour être en phase avec l’organisation&lt;/strong&gt; : remettre les grands principes de l’orga. Dire comment le projet s’intègre dans ceux-ci (alignement stratégique).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;État actuel de l’activité/d’avancement du projet&lt;/strong&gt; : résumé des données actuelles qui montrent l’avancement du projet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leçons apprises&lt;/strong&gt; : récapitulatif de l’historique du projet, des étapes et surtout des échecs recontrés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priorités stratégiques&lt;/strong&gt; : démonstration de chaque tâches planifiées et comment celles-ci se rattachent aux objectifs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Les 1. 2. 4. 5. sont tous seulement des faits, la seule partie avec de la spéculation est le 6.&lt;/p&gt;
&lt;p&gt;Les bullet-points, listes et images sont interdites, aucune fioriture dans les 6 pages. Toutes les données, rapports et graphiques peuvent-être placés seulement en annexe.&lt;/p&gt;
&lt;h2 id=&quot;comment-se-d%C3%A9roule-la-r%C3%A9union&quot; tabindex=&quot;-1&quot;&gt;Comment se déroule la réunion&lt;/h2&gt;
&lt;p&gt;En amont de la réunion, le document est partagé à tous afin que chacun puisse s’en imprégner.&lt;/p&gt;
&lt;p&gt;Pendant la réunion, chaque participant a 20-30 minutes pour lire le document en silence, tout le monde lit ensemble. La plupart des personnes notent leurs questions sur le document. S’en suit autant de temps que nécessaire pour que tous les paritipants discutent et échangent. Le format de discussion n’a pas à être cadrée, le but est de trouver un consensus.&lt;/p&gt;
&lt;p&gt;Quand la réunion est terminée, il est de la responsabilité de l’auteur de mettre à jour le document et de l’adresser à tous autant de fois que nécessaire.&lt;/p&gt;
&lt;h2 id=&quot;les-avantages-de-l%E2%80%99approche&quot; tabindex=&quot;-1&quot;&gt;Les avantages de l’approche&lt;/h2&gt;
&lt;p&gt;Pourquoi cela fonctionne :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Le format du document : les 6 catégories distinctes permettent aux managers de repérer et creuser les parties qu’ils souhaitent. Adapté aux emplois du temps du top management.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L’intérêt du storytelling : le fait de présenter sous forme narrative plutôt que par bullet points est plus adapté au fonctionnement de notre cerveau. En effet, nous percevons le monde plus facilement via des histoires.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le timing de la réunion : le format timé permet de s’assurer que chaque membre a bien toutes les informations avant de poser des questions contrairement à une présentation en slides où l’on est plus facilement amener à interrompre pour poser des questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le processus autour de la rédaction du document : permet de partager une vision commune au sein de l’organisation via le process de ré-écriture et de mise à jour suite au meeting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le contenu du document : permet de jongler entre metrics et verbatim clients.&lt;/p&gt;
 &lt;blockquote&gt;
   &lt;p lang=&quot;en&quot;&gt;I&#39;ve noticed when the anecdotes and the metrics disagree, the anecdotes are usually right. That&#39;s why it&#39;s so important to check that data with your intuition and instincts, and you need to teach that to executives and junior executives.&lt;/p&gt;
   &lt;span class=&quot;conteneur-citation-dans-texte&quot;&gt;
     &lt;sup class=&quot;sidenote-caller&quot;&gt;
     &lt;/sup&gt;
     &lt;small role=&quot;note&quot; class=&quot;sidenote&quot;&gt;BEZOS, Jeff. &lt;a href=&quot;https://lexfridman.com/jeff-bezos/&quot;&gt;&lt;em&gt;Jeff Bezos: Amazon and Blue Origin&lt;/em&gt;&lt;/a&gt;. 2023&lt;/small&gt;
   &lt;/span&gt;
 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://quartr.com/insights/business-philosophy/amazon-s-writing-culture-explained&quot;&gt;https://quartr.com/insights/business-philosophy/amazon-s-writing-culture-explained&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://writingcooperative.com/the-anatomy-of-an-amazon-6-pager-fc79f31a41c9/&quot;&gt;https://writingcooperative.com/the-anatomy-of-an-amazon-6-pager-fc79f31a41c9/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://newsletter.seomba.com/p/how-to-write-an-amazon-style-narrative/&quot;&gt;https://newsletter.seomba.com/p/how-to-write-an-amazon-style-narrative/&lt;/a&gt;&lt;/p&gt;
&lt;div id=&quot;e47wAgIhZ7o&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/e47wAgIhZ7o&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>Héberger soi-même des applications en ayant peu de connaissances DevOps</title>
    <link href="https://www.teotimepacreau.fr/blog/heberger-soi-meme-des-applications/" />
    <updated>2024-04-04T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/heberger-soi-meme-des-applications/</id>
    <content type="html">&lt;p&gt;Il n’est pas nécessaire d’avoir des connaissances parfaites en administration de systèmes et réseau pour héberger soi-même des services web. Avec un minimum de connaissance du terminal de commandes, les bases minimales de Docker et une compréhension du système de Ports, il est tout à fait possible d’y parvenir.&lt;/p&gt;
&lt;h2 id=&quot;serveur&quot; tabindex=&quot;-1&quot;&gt;Serveur&lt;/h2&gt;
&lt;p&gt;Pour pouvoir héberger des applications, il est nécessaire d’avoir une machine disponible à tout moment.
Plusieurs solutions existent : acheter du hardware pour avoir un serveur physique chez soi (NAS/Homelab), faire tourner une machine existante 24h/24, faire appel à un Virtual Private Server (VPS).
Mon choix s’est porté sur le VPS par facilité d’usage et par le peu d’entretien requis. Un VPS est un serveur distant appartenant à une entreprise, dont une partie vous est louée.
Les VPS au meilleur rapport qualité/prix, européens, pour une utilisation basique sont &lt;a href=&quot;https://www.hetzner.com/&quot;&gt;Hetzner&lt;/a&gt; et &lt;a href=&quot;https://contabo.com/en/&quot;&gt;Contabo&lt;/a&gt;. Le prix par an est d’environ 60€.&lt;/p&gt;
&lt;p&gt;Un VPS a besoin d’un OS pour tourner, il est recommandé de choisir un OS Linux pour installer plus facilement des solutions open-source.&lt;/p&gt;
&lt;h2 id=&quot;acc%C3%A9der-au-vps&quot; tabindex=&quot;-1&quot;&gt;Accéder au VPS&lt;/h2&gt;
&lt;p&gt;Il suffit d’utiliser le terminal de commande de votre ordinateur :&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; nomdutilisateur@adresseIP&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;ssh&lt;/code&gt; est la commande qui permet d’accéder à une machine à distance.
&lt;code&gt;nomdutilisateur&lt;/code&gt; est souvent “admin” ou tout autre nom défini.
&lt;code&gt;adresseIP&lt;/code&gt; est l’adresse IP publique de votre VPS, par exemple : “192.0.2.0”.&lt;/p&gt;
&lt;p&gt;Ensuite le mot de passe de votre VPS vous est demandé. Attention, pour des raisons de sécurité, les touches ne s’afficheront pas. Il est recommandé de faire un simple &lt;code&gt;coller&lt;/code&gt; en faisant un unique clic droit après avoir copié votre mot de passe.&lt;/p&gt;
&lt;h2 id=&quot;%C3%AAtre-capable-d%E2%80%99installer-des-applications-sur-son-vps&quot; tabindex=&quot;-1&quot;&gt;Être capable d’installer des applications sur son VPS&lt;/h2&gt;
&lt;p&gt;Notre approche va être d’installer Docker pour être capable d’installer ensuite Portainer.
Qu’est-ce que Docker ? Docker est une plate-forme logicielle qui vous permet de concevoir, tester et déployer rapidement des applications à l’aide de conteneurs.
Pourquoi choisir Docker ? Au-delà des caractéristiques techniques, c’est l’outil que vous recontrerez le plus dans les tutos en lignes pour héberger soi-même quasiment tous les services web.&lt;/p&gt;
&lt;p&gt;Néammoins, l’apprentissage de Docker est relativement complexe, et surtout son fonctionnement en ligne de commandes est peu intuitif pour les néophytes.
Et c’est ici que Portainer prend toute son utilité : il s’agit d’une interface graphique cliquable pour Docker.
Portainer est facilement utilisable grâce à son interface cliquable qui permet de comprendre ce qui se passe visuellement, contrairement aux lignes de commande Docker. Portainer permet de s’initier aux notions de containers, de stacks (docker-compose) et de réseaux.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/portainer.png&quot; alt=&quot;Interface graphique de Portainer&quot;&gt;&lt;figcaption&gt;Interface graphique de Portainer&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Nous allons donc d’abord installer Docker sur notre VPS pour être capable d’installer ensuite Portainer.&lt;/p&gt;
&lt;p&gt;Installer Docker sur son VPS&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; docker.io&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;apt&lt;/code&gt; est une commande native dans Linux qui permet d’installer des applications.&lt;/p&gt;
&lt;p&gt;Puis installer Portainer&lt;/p&gt;
&lt;pre class=&quot;language-docker&quot;&gt;&lt;code class=&quot;language-docker&quot;&gt;docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=LOp_Cb2s7m8&quot;&gt;Tutoriel d’installation de Docker et Portainer sur son VPS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour ouvrir Portainer il suffit d’entrer dans la barre de recherche de notre navigateur web l’adresse IP suivi du port du service que l’on souhaite utiliser.
On reprend notre exemple initial avec l’adresse IP “192.0.2.0”. Reprenons notre commande entré pour installer Portainer : &lt;code&gt;-p 9000:9000&lt;/code&gt;. Cela signifie que Portainer est accessible sur le port 9000 de notre “hôte” : le VPS.
On entre donc dans la barre de recherche 192.0.2.0:9000.
On arrive sur la page de première connexion, il faut donc définir le nom d’utilisateur, le mdp.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/portaineradmin.png&quot; alt=&quot;Page de première connexion de Portainer&quot;&gt;&lt;figcaption&gt;Page de première connexion de Portainer&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On choisit ensuite l’environnement Docker&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/portainerenvironnement.png&quot; alt=&quot;Page de choix de l&#39;environnement Docker&quot;&gt;&lt;figcaption&gt;Page de choix de l’environnement Docker&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;comprendre-portainer&quot; tabindex=&quot;-1&quot;&gt;Comprendre Portainer&lt;/h2&gt;
&lt;p&gt;L’interface de Portainer s’ouvre en présentant les différents environnements que nous avons configuré. Il faut voir les environnements comme des machines virtuelles séparées, à l’image d’un environnement Linux que l’on pourrait avoir sur une machine Windows ou autre.&lt;/p&gt;
&lt;p&gt;On clique sur le nom de l’environnement.
&lt;img src=&quot;https://www.teotimepacreau.fr/img/portainerenvironnement2.png&quot; alt=&quot;Sélection de l&#39;environnement Docker&quot; title=&quot;Sélection de l&#39;environnement Docker&quot;&gt;&lt;/p&gt;
&lt;p&gt;On arrive sur le dashboard.
&lt;img src=&quot;https://www.teotimepacreau.fr/img/portainerdashboard.png&quot; alt=&quot;Dashboard Portainer&quot; title=&quot;Dashboard Portainer&quot;&gt;&lt;/p&gt;
&lt;p&gt;Explication des différents menus :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stacks&lt;/strong&gt; permet d’entrer des commandes &lt;code&gt;docker-compose&lt;/code&gt;, ce sont des empilements de containers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Containers&lt;/strong&gt; regroupe tous les services webs que l’on héberge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt; liste les images Docker utilisées par nos containers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networks&lt;/strong&gt; permet de créer des “bridge” entre nos containers pour qu’ils puissent communiquer les uns avec les autres&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Volumes&lt;/strong&gt; ce sont les base de données nécessaires à l’enregistrement des données de nos containers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;comprendre-le-principe-d%E2%80%99un-proxy-manager&quot; tabindex=&quot;-1&quot;&gt;Comprendre le principe d’un proxy manager&lt;/h2&gt;
&lt;p&gt;Imaginons que l’on installe un lecteur de flux RSS, &lt;a href=&quot;https://miniflux.app/&quot;&gt;Miniflux&lt;/a&gt;. Si nous l’installons via Portainer celui-ci sera accessible seulement au niveau &lt;em&gt;local&lt;/em&gt;, donc seulement au niveau de l’adresse IP de notre VPS suivi du port d’accès que l’on aura défini pour Miniflux.
On peut effectivement y accéder via n’importe quel naviagteur web mais celui-ci affichera que la connexion n’est pas sécurisée car nous exposons seulement du HTTP et non pas un certificat HTTPS.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/connexionHTTP.png&quot; alt=&quot;Message de Chrome en cas de connexion HTTP&quot;&gt;&lt;figcaption&gt;Message de Chrome en cas de connexion HTTP&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;De plus cela requiert d’entrer manuellement l’IP et le port plutôt qu’une URL familière constituée de lettres.&lt;/p&gt;
&lt;p&gt;Un proxy manager permet ainsi d’exposer un service d’un port local vers une URL dédiée et sécurisée via HTTPS.
C’est ici que &lt;a href=&quot;https://nginxproxymanager.com/&quot;&gt;Nginx Proxy Manager&lt;/a&gt; intervient.&lt;/p&gt;
&lt;h3 id=&quot;installer-nginx-proxy-manager-via-portainer&quot; tabindex=&quot;-1&quot;&gt;Installer Nginx Proxy Manager via Portainer&lt;/h3&gt;
&lt;p&gt;Via le menu &lt;strong&gt;Stacks&lt;/strong&gt; on clique sur &lt;code&gt;+Add stack&lt;/code&gt;, puis via &lt;code&gt;Web Editor&lt;/code&gt; on entre cette commande docker-compose&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3.3&quot;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;npm-app&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;jc21/nginx-proxy-manager:latest&#39;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;app
    &lt;span class=&quot;token key atrule&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unless&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stopped
    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;80:80&#39;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Public HTTP Port&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;443:443&#39;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Public HTTPS Port&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;81:81&#39;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Admin Web Port&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Add any other Stream port you want to expose&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# - &#39;21:21&#39; # FTP&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;DB_MYSQL_HOST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blabla-db&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;DB_MYSQL_PORT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3306&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;DB_MYSQL_USER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blabla&quot;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;DB_MYSQL_PASSWORD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;DB_MYSQL_PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A definir en variable d&#39;environnement&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;DB_MYSQL_NAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blabla&quot;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# Uncomment the line below if IPv6 is not enabled on your host&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;# DISABLE_IPV6: &#39;true&#39;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ./npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;Z
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ./letsencrypt&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/etc/letsencrypt&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;Z
    &lt;span class=&quot;token key atrule&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;db
    &lt;span class=&quot;token key atrule&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;network
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;internal

  &lt;span class=&quot;token key atrule&quot;&gt;npm-db&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;mariadb:latest&#39;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;db
    &lt;span class=&quot;token key atrule&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; unless&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stopped
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;MYSQL_ROOT_PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A definir en variable d&#39;environnement&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;blabla&#39;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;MYSQL_USER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;blabla&#39;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;DB_MYSQL_PASSWORD&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;#A definir en variable d&#39;environnement&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ./npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;data/mysql&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/var/lib/mysql&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;Z
    &lt;span class=&quot;token key atrule&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; npm&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;internal

&lt;span class=&quot;token key atrule&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;npm-internal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;npm-network&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;external&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A quoi sert cette commande ? Nous demandons à Nginx-Proxy-Manager de recueillir les ports 80 (HTTP) et les ports 443 (HTTPS), également nous créons un réseau dédidé “npm-network” qui devra être utilisé par chaque service web que nous installerons sur notre VPS.&lt;/p&gt;
&lt;p&gt;Pour entrer sur Nginx-Proxy-Manager nous visitons notre IP:81.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/nginx-accueil.png&quot; alt=&quot;Page d&#39;accueil de Nginx-Proxy-Manager&quot;&gt;&lt;figcaption&gt;Page d’accueil de Nginx-Proxy-Manager&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Nous commençons par l’obtention d’un certificat SSL qui nous permettra d’afficher nos services webs en HTTPS. Pour cela, on clique sur le menu “SSL” puis “Add SSL Certificate”.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/nginx-ssl.png&quot; alt=&quot;Obtenir un certificat SSL&quot;&gt;&lt;figcaption&gt;Obtenir un certificat SSL&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;On entre notre nom de domaine précédé par &lt;code&gt;*.&lt;/code&gt; donc &lt;code&gt;*.blabla.fr&lt;/code&gt; pour que tous nos futurs sous-domaines aient un certifat SSL. Il faut absolument activer &lt;code&gt;Use a DNS challenge&lt;/code&gt; puis choisir son fournisseur de nom de domaine. Il vous sera demandé un token API qui est fourni par votre fournisseur de domaine. Enfin cocher &lt;code&gt;I agree&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le certificat SSL obtenu, il sera désormais possible d’ajouter des Proxy viale menu “Hosts”. Mais pour cela nous allons d’abord reprendre notre exemple d’installation de Miniflux&lt;/p&gt;
&lt;h2 id=&quot;installer-une-application-et-l%E2%80%99exposer-sur-une-url-d%C3%A9di%C3%A9e&quot; tabindex=&quot;-1&quot;&gt;Installer une application et l’exposer sur une URL dédiée&lt;/h2&gt;
&lt;h3 id=&quot;installer-et-configurer-miniflux-via-portainer&quot; tabindex=&quot;-1&quot;&gt;Installer et configurer Miniflux via Portainer&lt;/h3&gt;
&lt;p&gt;Nous reprenons notre exemple d’installation de Miniflux.
Dans Portainer nous ajoutons une stack comme vu précédemment pour Nginx-Proxy-Manager.
Ici le docker-compose :&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;miniflux&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; miniflux/miniflux&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;8080:8080&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;depends_on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token key atrule&quot;&gt;condition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; service_healthy
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; DATABASE_URL=postgres&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//miniflux&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;secret@db/miniflux&lt;span class=&quot;token punctuation&quot;&gt;?&lt;/span&gt;sslmode=disable
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; RUN_MIGRATIONS=1
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; CREATE_ADMIN=1
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ADMIN_USERNAME=blabla &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; ADMIN_PASSWORD=blabla &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; postgres&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; POSTGRES_USER=blabla &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; POSTGRES_PASSWORD=blabla &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; POSTGRES_DB=blabla &lt;span class=&quot;token comment&quot;&gt;#A remplacer&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; miniflux&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;db&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/var/lib/postgresql/data
    &lt;span class=&quot;token key atrule&quot;&gt;healthcheck&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;CMD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pg_isready&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-U&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;miniflux&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;interval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s
      &lt;span class=&quot;token key atrule&quot;&gt;start_period&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 30s
&lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;miniflux-db&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;npm-internal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;npm-network&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;external&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les 4 dernières lignes “Network” sont indispensables pour que le container Miniflux comprenne qu’il doit tourner sous le réseau de Nginx-Proxy-Manager.
Mais cela ne suffit pas pour exposer notre app sur le web. Nous devons manuellement aller dans le container associé puis descendre en bas de la page pour accéder au sous-menu “Network”.&lt;/p&gt;
&lt;p&gt;Il faut associer le container Miniflux au network nginx proxy manager “npm”, via le menu déroulant “Select a Network”.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/miniflux-network.png&quot; alt=&quot;Associer le container Miniflux au network nginx proxy manager npm&quot;&gt;&lt;figcaption&gt;Associer le container Miniflux au network nginx proxy manager npm&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;se-rendre-dans-son-fournisseur-de-nom-de-domaine-pour-configurer-un-sous-domaine-pour-miniflux&quot; tabindex=&quot;-1&quot;&gt;Se rendre dans son fournisseur de nom de domaine pour configurer un sous-domaine pour Miniflux&lt;/h3&gt;
&lt;p&gt;Pour exposer notre Miniflux local sur une URL dédiée, on choisit un sous-domaine “&lt;a href=&quot;http://miniflux-reader.blabla.fr&quot;&gt;miniflux-reader.blabla.fr&lt;/a&gt;”. Pour cela, nous devons nous rendre sur notre fournisseur de nom de domaine et ajouter manuellement un DNS.&lt;/p&gt;
&lt;p&gt;On entre notre nom de sous domaine “miniflux-reader”, en type de DNS on choisit uniquement le type A car seul celui-ci est dédié aux adresses IPV4 publiques. Aucun autre type de DNS ne fonctionnera. Puis on entre l’adresse IP publique de notre VPS, par exemple : 192.0.2.0&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/DNS.png&quot; alt=&quot;Ajouter un DNS&quot;&gt;&lt;figcaption&gt;Ajouter un DNS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;se-rendre-sur-nginx-proxy-manager-pour-ajouter-le-proxy-de-miniflux&quot; tabindex=&quot;-1&quot;&gt;Se rendre sur Nginx Proxy Manager pour ajouter le proxy de Miniflux&lt;/h3&gt;
&lt;p&gt;Dernière étape : ajouter le proxy. On se rend dans le sous-menu “Hosts” puis “Add Proxy Host”.&lt;/p&gt;
&lt;p&gt;La configuration à suivre :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/nginx-proxy.png&quot; alt=&quot;Ajouter un proxy&quot;&gt;&lt;figcaption&gt;Ajouter un proxy&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Dans “Forward Port” on note le port que l’on avait défini pour l’installation de notre app, en l’occurence 8080 pour notre exemple de Miniflux.&lt;/p&gt;
&lt;p&gt;Puis on clique sur le sous-menu “SSL”, dans le menu déroulant on choisit notre certificat SSL obtenu précédemment, et il est indispensable de cocher tous les boutons en dessous car sinon le proxy ne sera pas activé pour nos sous-domaines.
Nous pouvons enfin valider avec “Save”.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/nginx-proxy-2.png&quot; alt=&quot;Sous-menu SSL d&#39;ajout de proxy&quot;&gt;&lt;figcaption&gt;Sous-menu SSL d’ajout de proxy&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Notre Miniflux est finalement accessible sur son url dédiée en HTTPS “&lt;a href=&quot;http://miniflux-reader.blabla.fr&quot;&gt;miniflux-reader.blabla.fr&lt;/a&gt;”&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Accessibilité &amp; animations : laisser la main à l&#39;utilisateur avec prefers-reduced-motion</title>
    <link href="https://www.teotimepacreau.fr/blog/prefers-motion-reduced/" />
    <updated>2024-03-17T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/prefers-motion-reduced/</id>
    <content type="html">&lt;p&gt;Le “Responsive Design” ne se limite plus à adapter l’affichage d’un site web au format desktop et mobile. Il est nécessaire de prendre en compte de nouveaux éléments :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Être responsive à l’utilisateur : prendre en compte ses préférences avec, par exemple, &lt;code&gt;dark-mode/light-mode&lt;/code&gt;, &lt;code&gt;prefers-reduced-motion&lt;/code&gt;, &lt;code&gt;prefers-contrast&lt;/code&gt;…&lt;/li&gt;
&lt;li&gt;Être responsive aux composants eux-mêmes : un composant carte peut être recomposée en fonction de la largeur d’écran disponible mais aussi de sa hauteur intrinsèque.&lt;/li&gt;
&lt;li&gt;Être responsive aux nouveaux appareils : smartphones pliables, montres connectées.
Cette approche est appelée le “New Responsive Design”
&lt;img src=&quot;https://www.teotimepacreau.fr/img/new-responsive.png&quot; alt=&quot;Graphique reprenant les éléments essentiels de l&#39;approche New Responsive Design&quot; title=&quot;Graphique reprenant les éléments essentiels de l&#39;approche New Responsive Design&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;laisser-la-main-%C3%A0-l%E2%80%99utilisateur-concernant-l%E2%80%99affichage-des-animations&quot; tabindex=&quot;-1&quot;&gt;Laisser la main à l’utilisateur concernant l’affichage des animations&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;prefers-reduced-motion&lt;/code&gt; a été intégré entre 2018 et 2020 sur tous les navigateurs. C’est une préférence activable dans les paramètres du navigateurs, celle-ci prend deux états :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;reduced&lt;/code&gt; : indique que l’utilisateur souhaitent que les interfaces minimisent le mouvement ou l’animation, de préférence au point où tous les mouvements non essentiels sont supprimés.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no-preference&lt;/code&gt; : indique que l’utilisateur n’a formulé aucune préférence. Cette valeur de mot clé est évaluée comme étant false dans le contexte booléen&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;s%E2%80%99en-saisir-en-tant-que-d%C3%A9veloppeur&quot; tabindex=&quot;-1&quot;&gt;S’en saisir en tant que développeur&lt;/h2&gt;
&lt;p&gt;Tout d’abord il est plutôt simple de simuler la préférence via navigateur mais la fonctionnalité est caché. Il convient d’ouvrir le Chrome Dev Inspector (CTRl+SHIFT+I) puis ouvrir le &lt;code&gt;...&lt;/code&gt; du bandeau “Console” puis cliquer sur “More Tools” puis “Rendering”.&lt;/p&gt;
&lt;p&gt;&lt;video controls=&quot;&quot; muted=&quot;&quot; src=&quot;https://www.teotimepacreau.fr/img/activer-reduced-motion-navigateur.mp4&quot; aria-description=&quot;Activer prefers-reduced-motion dans le navigateur&quot; title=&quot;Activer prefers-reduced-motion dans le navigateur&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Pour adapter le code en fonction de la préférence sélectionnée par l’utilisateur, il est possible de cibler via une requête CSS :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/*
  Si l&#39;utilisateur a exprimé le souhait, ne pas montrer l&#39;animation sur les boutons.
*/&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; reduce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/*
  Si l&#39;utilisateur n&#39;a pas statué sur la préférence, montrer l&#39;animation.
*/&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* `vibrate` keyframes are defined elsewhere */&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; vibrate 0.3s linear infinite both&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il est également possible d’utiliser Javascript pour détecter la préference, et choisir de jouer en conséquence ou adapter les animations :&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;// On attrape la préférence exprimée par l&#39;utilisateur&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; prefersReducedMotion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;(prefers-reduced-motion: reduce)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;// SI L&#39;UTILISATEUR N&#39;A PAS ACTIVÉ prefers-reduced-motion alors on déroule l&#39;animation&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;prefersReducedMotion&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      gsap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;.intersect&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-20dvh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;ease&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;power2.out&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;d%C3%A9monstration&quot; tabindex=&quot;-1&quot;&gt;Démonstration&lt;/h2&gt;
&lt;p&gt;&lt;video controls=&quot;&quot; muted=&quot;&quot; src=&quot;https://www.teotimepacreau.fr/img/prefers-reduced-motion.mp4&quot; aria-description=&quot;Démonstration de l&#39;avant après du déroulement des animations en fonction de la préférence exprimée par l&#39;utilisateur&quot; title=&quot;Démonstration de l&#39;avant après du déroulement des animations en fonction de la préférence exprimée par l&#39;utilisateur&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;div id=&quot;dhrX_biPH8c/&quot; class=&quot;eleventy-plugin-youtube-embed&quot; style=&quot;position:relative;width:100%;padding-top: 56.25%;&quot;&gt;&lt;iframe style=&quot;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;&quot; width=&quot;100%&quot; height=&quot;100%&quot; frameborder=&quot;0&quot; title=&quot;Embedded YouTube video&quot; src=&quot;https://www.youtube-nocookie.com/embed/dhrX_biPH8c/&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/css/C39.html/&quot;&gt;https://www.w3.org/WAI/WCAG22/Techniques/css/C39.html/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/articles/prefers-reduced-motion?hl=fr/&quot;&gt;https://web.dev/articles/prefers-reduced-motion?hl=fr/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Tour d&#39;horizon des CMS Headless basés sur Git</title>
    <link href="https://www.teotimepacreau.fr/blog/git-based-headless-cms/" />
    <updated>2024-01-31T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/git-based-headless-cms/</id>
    <content type="html">&lt;h2 id=&quot;qu%E2%80%99est-ce-qu%E2%80%99un-cms-%3F&quot; tabindex=&quot;-1&quot;&gt;Qu’est-ce qu’un CMS ?&lt;/h2&gt;
&lt;p&gt;CMS désigne Content Management System, il s’agit d’un système qui rend possible de créer, gérer de modifier facilement un site web, sans avoir besoin de connaissances techniques en langage informatique.
L’implémentation d’un CMS est donc particulièrement utile dans le développement d’un site web, afin de permettre aux non-initiés d’administrer le site.&lt;/p&gt;
&lt;h2 id=&quot;les-2-types-de-cms-%3A-traditionnel-et-headless&quot; tabindex=&quot;-1&quot;&gt;Les 2 types de CMS : traditionnel et headless&lt;/h2&gt;
&lt;p&gt;Le CMS le plus connu, Wordpress, est traditionnel dans le sens où l’administrateur vient modifier visuellement le contenu du site, ce qui entraîne une mise à jour de la base de données. Le frontend et le backend sont intrinsèquement liés, ce qui limite les possibilités de personnalisation de l’affichage et contraint à utiliser des rendus visuels normés issus de template.&lt;/p&gt;
&lt;p&gt;Un CMS Headless, quand à lui, ne s’intéresse qu’au backend et vise donc à répertorier le contenu. Cela permet de séparer les données (le “corps”) de la manière dont elles sont présentées (la “tête”), d’où le terme “headless”. Un développeur peut ainsi utiliser la technologie de son choix sans se soucier de l’impact sur le frontend, et réutiliser le contenu pour tout type de support de sortie (site web, application, logiciel…)&lt;/p&gt;
&lt;h2 id=&quot;pourquoi-adosser-un-cms-headless-%C3%A0-git-%3F&quot; tabindex=&quot;-1&quot;&gt;Pourquoi adosser un CMS Headless à Git ?&lt;/h2&gt;
&lt;p&gt;Un CMS Headless basé sur Git permet de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;versionner le contenu, ce qui facilite la restauration du contenu antérieur en cas de mauvaise manipulation&lt;/li&gt;
&lt;li&gt;“ramifier”(git branch), pour créer des bifurcations de contenu par exemple, déployables à tout moment&lt;/li&gt;
&lt;li&gt;échapper aux verrous de propriété que pourrait imposer l’éditeur du CMS&lt;/li&gt;
&lt;li&gt;enlever une couche de complexité car il n’y a pas de base de données à gérer car tout le contenu est répertorié dans des dossiers/documents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notre contenu prend forme au moyen de fichiers Markdown. Ceux-ci vont contenir toutes les données associées au fichier dans le &lt;em&gt;frontmatter&lt;/em&gt; (ex: date, description, titre, etc…) ainsi que le corps du document. Il est alors très simple de créer, éditer et supprimer ce type de fichier 100% versionné par Git.&lt;/p&gt;
&lt;h2 id=&quot;cms-headless-git-based-conseill%C3%A9s&quot; tabindex=&quot;-1&quot;&gt;CMS Headless Git Based conseillés&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.staticcms.org/&quot;&gt;Static CMS&lt;/a&gt; &lt;a href=&quot;https://mastodon.design/@timotheegoguely/111851562642935066&quot;&gt;conseillé par Timothée Goguely, voir l’échange&lt;/a&gt;, pas encore creusé de mon côté&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://decapcms.org/&quot;&gt;Decap CMS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tina.io/&quot;&gt;Tina CMS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mattrbld.com/&quot;&gt;Mattrbld&lt;/a&gt; &lt;a href=&quot;https://mastodon.design/@timotheegoguely/111852331418845469&quot;&gt;conseillé par Timothée Goguely, voir l’échange&lt;/a&gt;, pas encore creusé de mon côté&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;comparaison-de-deux-cms-headless-git-based&quot; tabindex=&quot;-1&quot;&gt;Comparaison de deux CMS Headless Git based&lt;/h2&gt;
&lt;h3 id=&quot;decap-cms&quot; tabindex=&quot;-1&quot;&gt;Decap CMS&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface d’édition en français&lt;/th&gt;
&lt;th&gt;Pré-visualition de l’édition&lt;/th&gt;
&lt;th&gt;Support d’authentification&lt;/th&gt;
&lt;th&gt;Edition possible en localhost&lt;/th&gt;
&lt;th&gt;Dépendance à une plateforme pour le déploiement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Github, Gitlab, Bitbucket(Jira)&lt;/td&gt;
&lt;td&gt;Possible mais conditionné à une configuration alternative (pas possible d’avoir les changements sur le repo distant et local en même temps)&lt;/td&gt;
&lt;td&gt;plus facile sur Netlify mais possible de déployer ailleurs avec beaucoup de configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;philosophie-de-decap-cms&quot; tabindex=&quot;-1&quot;&gt;Philosophie de DECAP CMS&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;pas d’API fournie, tout le workflow est basé sur Git&lt;/li&gt;
&lt;li&gt;très facile à installer (deux fichiers à copier coller), dépendances non obligatoire&lt;/li&gt;
&lt;li&gt;customisation du CMS uniquement en language YAML&lt;/li&gt;
&lt;li&gt;pas de cloud associé pour gérer le contenu à distance&lt;/li&gt;
&lt;li&gt;interface sobre mais efficace&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;comment-impl%C3%A9menter-decap-cms-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment implémenter Decap CMS ?&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Installer la dernière version de DECAP CMS via &lt;code&gt;npm install decap-cms&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Dans le dossier qui sert les &lt;code&gt;assets&lt;/code&gt; habituellement créer un dossier &lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Au sein du dossier &lt;code&gt;admin&lt;/code&gt; créer un fichier &lt;code&gt;index.html&lt;/code&gt; et un fichier &lt;code&gt;config.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/decap-project-structure.png&quot; alt=&quot;Exemple de structuration des dossiers pour DECAP CMS&quot;&gt;&lt;figcaption&gt;Exemple de structuration des dossiers pour DECAP CMS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Le fichier &lt;code&gt;index.html&lt;/code&gt; est le point d’entrée pour l’interface d’administration de DECAP CMS, coller dedans :&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;robots&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;noindex&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://identity.netlify.com/v1/netlify-identity-widget.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Content Manager&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Include the script that builds the page and powers Decap CMS --&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;code&gt;config.yml&lt;/code&gt; est le coeur de la configuration du CMS : il permet de créer les différents champs de saisie et de paramétrer le fonctionnement global du CMS, coller dedans :&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;local_backend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Si besoin d&#39;utiliser le CMS en localhost, si site déjà déployé supprimer cette ligne&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; git&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;gateway


&lt;span class=&quot;token comment&quot;&gt;# These lines should *not* be indented&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;media_folder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;static/uploads&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Media files will be stored in the repo under static/uploads&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;public_folder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/uploads&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# The src attribute for uploaded media will begin with /uploads&lt;/span&gt;

&lt;span class=&quot;token key atrule&quot;&gt;collections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;articles&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Used in routes, e.g., /admin/collections/articles&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Articles&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Displayed in the UI&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;folder&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/articles&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# The path to the folder where the documents are stored&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Allow users to create new documents in this collection&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;slug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Filename template, e.g., title.md&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Layout&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;layout&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blog&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Title&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Description&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Publish Date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;datetime&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Featured Photo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;featured&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Body&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;widget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;markdown&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;
&lt;p&gt;A partir d’ici il est nécessaire de déployer le site sur Netlify même pour faire simplement fonctionner le CMS en localhost&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans la configuration sur le site de Netlify il faut commencer par activer “l’identity” pour permettre aux futurs utilisateurs d’utiliser le CMS :&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/netlify-identity.png&quot; alt=&quot;Activation identity Netlify&quot;&gt;&lt;figcaption&gt;Activation identity Netlify&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Puis il faut enregistrer Github comme provider :&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/github-provider.png&quot; alt=&quot;Activation de Github provider sous Netlify&quot;&gt;&lt;figcaption&gt;Activation de Github provider sous Netlify&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;Dernière étape de la configuration Netlify : l’activation de Git-Gateway pour permettre à Github de communiquer avec notre CMS&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/git-gateway.png&quot; alt=&quot;Activation de Git-gateway sous Netlify&quot;&gt;&lt;figcaption&gt;Activation de Git-gateway sous Netlify&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;
&lt;p&gt;Pour lancer DECAP CMS en localhost il faut le lancer &lt;strong&gt;en parallèle&lt;/strong&gt; du serveur de développement. Donc un premier terminal avec &lt;code&gt;npm run dev&lt;/code&gt; pour lancer le serveur de développement classique de votre site et un second terminal avec &lt;code&gt;npx decap-server&lt;/code&gt;. Si les 2 ne sont pas run en parallel, il ne sera pas possible d’accéder à Decap CMS en localhost, celui-ci renverra constamment vers la version déployée.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Se rendre sur la page d’adminstration du CMS à partir de votre serveur de developpement local “&lt;a href=&quot;http://localhost:5173/admin/index.html&quot;&gt;http://localhost:5173/admin/index.html&lt;/a&gt;”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Permettre la connexion via Github&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/demande-connexion-decap.png&quot; alt=&quot;Demande de première connexion DECAP CMS&quot;&gt;&lt;figcaption&gt;Demande de première connexion DECAP CMS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/netlify-login-cms.png&quot; alt=&quot;Autoriser la connexion via Github&quot;&gt;&lt;figcaption&gt;Autoriser la connexion via Github&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol start=&quot;13&quot;&gt;
&lt;li&gt;L’accès à l’interface d’administration est enfin possible&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/admin-decap.png&quot; alt=&quot;Interface d&#39;administration de DECAP CMS&quot;&gt;&lt;figcaption&gt;Interface d’administration de DECAP CMS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/creation-article-decap.png&quot; alt=&quot;Création d&#39;un article sous DECAP CMS&quot;&gt;&lt;figcaption&gt;Création d’un article sous DECAP CMS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;tina-cms&quot; tabindex=&quot;-1&quot;&gt;Tina CMS&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface d’édition en français&lt;/th&gt;
&lt;th&gt;Pré-visualition de l’édition&lt;/th&gt;
&lt;th&gt;Support d’authentification&lt;/th&gt;
&lt;th&gt;Edition possible en localhost&lt;/th&gt;
&lt;th&gt;Dépendance à une plateforme pour le déploiement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Non (à moins d’utiliser React)&lt;/td&gt;
&lt;td&gt;Uniquement via des serverless functions de Vercel ou Netlify&lt;/td&gt;
&lt;td&gt;Activé par défaut (0 config)&lt;/td&gt;
&lt;td&gt;Tina Cloud gratuit pour déployer CMS jusqu’à 2 utilisateurs, possible de sinon de déployer sur toutes plateformes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;philosophie-de-tina-cms&quot; tabindex=&quot;-1&quot;&gt;Philosophie de Tina CMS&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;API GraphQL fournie par défaut (requêtes sont pré-faites nativement en fonction du schéma de données)&lt;/li&gt;
&lt;li&gt;très facile à installer mais nécessite dépendance NPM&lt;/li&gt;
&lt;li&gt;customisation du CMS en fichier JS très simple via les objets&lt;/li&gt;
&lt;li&gt;Tina cloud gratuit jusqu’à 2 utilisateurs pour ne pas avoir besoin de déployer le CMS&lt;/li&gt;
&lt;li&gt;interface moderne et soignée&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;comment-impl%C3%A9menter-tina-cms-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment implémenter Tina CMS ?&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Installer la dernière version de Tina CMS via &lt;code&gt; npx @tinacms/cli@latest init&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mettre à jour les scripts de lancement du serveur de développement local pour run en parallele le CMS&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt; &lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tinacms dev -c &#92;&quot;vite dev&#92;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tinacms build &amp;amp;&amp;amp; vite build&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token property&quot;&gt;&quot;preview&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;vite preview&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Pour lancer Tina CMS et visiter la page d’administration il suffit de lancer la commande &lt;code&gt;npm run dev&lt;/code&gt; et de visiter “&lt;a href=&quot;http://localhost:5173/admin/index.html&quot;&gt;http://localhost:5173/admin/index.html&lt;/a&gt;”&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/tina-home.png&quot; alt=&quot;Page d&#39;administration Tina CMS&quot;&gt;&lt;figcaption&gt;Page d’administration Tina CMS&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Pour customiser les champs d’entrée il suffit de modifier l’objet ‘collections’ ./tina/config.js&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; defineConfig &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tinacms&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Your hosting provider likely exposes this as an environment variable&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; branch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;GITHUB_BRANCH&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
  process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;VERCEL_GIT_COMMIT_REF&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
  process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;HEAD&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;tina&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;defineConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  branch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;// Get this from tina.io&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;clientId&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;NEXT_PUBLIC_TINA_CLIENT_ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Get this from tina.io&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;TINA_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

  &lt;span class=&quot;token literal-property property&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;outputFolder&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;admin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;publicFolder&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;static&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;tina&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;mediaRoot&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;publicFolder&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;static&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// See docs on content modeling for more info on how to setup new content models: https://tina.io/docs/schema/&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;schema&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;collections&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;article&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Articles&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;src/articles&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;titre&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Titre&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;isTitle&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;desc&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Description&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;datetime&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;date&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;Date&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;imagealt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Description de l&#39;image&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rich-text&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;body&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Corps de texte&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;isBody&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;
&lt;p&gt;Les champs créés viennent modifier l’API GraphQL, le CMS génère nativement les requêtes types dans le dossier &lt;code&gt;./tina/__generated__/client&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aller chercher les données de l’API : TinaCMS génère automatiquement deux requêtes types que l’on peut retrouver dans ./tina/__generated/queries.gql :&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Obtenir plusieurs articles et leur détails via blablablaConnection&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; client &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../[pathToTina]/tina/__generated__/client&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;queries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;articleConnection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;articleConnection&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; edges &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;edges&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obtenir un seul article et ses détails (mais indiquer son path est obligatoire)&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; client &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;../[pathToTina]/tina/__generated__/client&#39;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myPost &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;queries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;relativePath&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;HelloWorld.md&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myPost&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;title&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Les supports d’authentification nécessaire à la connexion pour les futurs utilisateurs avec le repo distant peuvent être configuré ultérieurement&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://decapcms.org/docs/add-to-your-site/&quot;&gt;https://decapcms.org/docs/add-to-your-site/&lt;/a&gt;
&lt;a href=&quot;https://tina.io/docs/&quot;&gt;https://tina.io/docs/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Le legal design : qu&#39;est-ce que c&#39;est ?</title>
    <link href="https://www.teotimepacreau.fr/blog/legal-design/" />
    <updated>2024-01-20T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/legal-design/</id>
    <content type="html">&lt;h2 id=&quot;d%C3%A9finition&quot; tabindex=&quot;-1&quot;&gt;Définition&lt;/h2&gt;
&lt;p&gt;Le legal design est une application des pratiques du design centré sur l’humain, visant à rendre les systèmes, services et documents juridiques plus compréhensibles, appropriables et accessibles.
Le but de cette démarche est de permettre aussi bien à des non-initiés qu’à des experts en droit d’accéder à des documents/process/services légaux.
On retrouve dans cette méthodologie toutes les composantes majeures du design : idéation, conception, test usagers… avec un focus sur le fait de redonner du sens à la fonction première du droit : **être actionnable et actionné pour permettre à tous de s’approprier les normes.
L’objectif étant de délivrer des services juridiques faciles à lire et à comprendre, qui favorisent la prise de décision et l’engagement, qui font gagner du temps.&lt;/p&gt;
&lt;h3 id=&quot;enjeux-du-legal-design-dans-la-fonction-publique&quot; tabindex=&quot;-1&quot;&gt;Enjeux du legal design dans la fonction publique&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Contrer la surcharge d’informations et simplifier l’analyse des commanditaires. &lt;em&gt;Exemple d’une juriste qui s’est initiée au legal design après avoir été interpellée par un maire au sujet de notes juridiques envoyées avant un conseil municipal “Il m’a dit qu’il n’avait pas le temps de lire trois pages, qu’il fallait tout mettre sur une seule page, avec des éléments très visuels pour avoir toutes les informations sur les yeux.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Adresser un message accessible à la diversité des profils techniques de l’administration.&lt;em&gt;“Le legal design aide à la pédagogie et nous permet de parler de manière plus concrète aux ingénieurs en interne, aux acheteurs publics, aux décideurs et aux élus…”&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;exemples-de-techniques-de-legal-design&quot; tabindex=&quot;-1&quot;&gt;Exemples de techniques de legal design&lt;/h2&gt;
&lt;h3 id=&quot;1.-structurer-l%E2%80%99information-dans-un-contrat&quot; tabindex=&quot;-1&quot;&gt;1. Structurer l’information dans un contrat&lt;/h3&gt;
&lt;p&gt;Un exemple basique : la plupart des contrats démarrent par une section “définitions”, alors que l’on ne connait pas encore l’objet même du contrat. De même, les questions liées au prix sont souvent reléguées à la énième page, quand c’est souvent celle qui intéresse le plus l’utilisateur.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/structuration-information-contrat.png&quot; alt=&quot;Capture d&#39;écran mobile d&#39;un contrat à génération dynamique&quot;&gt;&lt;figcaption&gt;Exemple de contrat à génération dynamique qui guide l’utilisateur&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;2.-utiliser-un-langage-facile-a-lire-et-%C3%A0-comprendre-(falc)&quot; tabindex=&quot;-1&quot;&gt;2. Utiliser un langage Facile A Lire et à Comprendre (FALC)&lt;/h3&gt;
&lt;p&gt;Méthode :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;définir les attentes du lecteur&lt;/li&gt;
&lt;li&gt;synthétiser et réduire aux informations essentielles&lt;/li&gt;
&lt;li&gt;commencer avec ce qui aide les utilisateurs à décider ou à agir&lt;/li&gt;
&lt;li&gt;s’adresser directement au lecteur&lt;/li&gt;
&lt;li&gt;limiter chaque paragraphe à une idée&lt;/li&gt;
&lt;li&gt;utiliser des mots du vocabulaire courant des utilisateurs&lt;/li&gt;
&lt;li&gt;si besoin d’utiliser des termes techniques, prendre le temps de les définir au préalable&lt;/li&gt;
&lt;li&gt;illustrer par des exemples&lt;/li&gt;
&lt;li&gt;symboliser par des des icônes, images, illustrations&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/falc-rgpd-1.png&quot; alt=&quot;Capture d&#39;écran de clauses RGPD rédigées avec les méthodes du FALC&quot;&gt;&lt;figcaption&gt;Exemple de clauses RGPD rédigées avec les méthodes du FALC&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;3.-donner-du-contexte-aux-informations&quot; tabindex=&quot;-1&quot;&gt;3. Donner du contexte aux informations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;donner une vue d’ensemble et replacer l’acte administratif dans son contexte global&lt;/li&gt;
&lt;li&gt;expliquer ce qui est touché par le périmètre de l’acte juridique et ce qui ne l’est pas&lt;/li&gt;
&lt;li&gt;donner des éléments de réassurance au lecteur : temps de lecture attendu, but visé par le document, replacer l’acte administratif dans le contexte qui l’entoure…&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/contextualiser-acte-administratif.png&quot; alt=&quot;Capture d&#39;écran d&#39;un contrat juridique qui affiche une timeline de contextualisation des étapes juridiques&quot;&gt;&lt;figcaption&gt;Exemple d’un contrat qui situe le lecteur grâce à une time des actes juridiques entourant l’acte en cours&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;exemples-de-projets-utilisant-le-legal-design&quot; tabindex=&quot;-1&quot;&gt;Exemples de projets utilisant le Legal Design&lt;/h2&gt;
&lt;h3 id=&quot;1.-travail-de-la-commission-europ%C3%A9enne-pour-inciter-%C3%A0-l%E2%80%99utilisation-de-%E2%80%9Cpages-de-garde-de-synth%C3%A8se%E2%80%9D-dans-les-contrats-d%E2%80%99assurance&quot; tabindex=&quot;-1&quot;&gt;1. Travail de la Commission Européenne pour inciter à l’utilisation de “pages de garde de synthèse” dans les contrats d’assurance&lt;/h3&gt;
&lt;p&gt;Le but : visualiser en une seule page les éléments essentiels couverts par le contrat.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/clauses-essentielles-contrat.png&quot; alt=&quot;Page de garde de contrat d&#39;assurance pensé par l&#39;UE pour que le lecteur puisse se saisir des éléments essentiels du contrat en un coup d&#39;oeil&quot;&gt;&lt;figcaption&gt;Page de garde de contrat d’assurance pensé par l’UE pour que le lecteur puisse se saisir des éléments essentiels du contrat en un coup d’oeil&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;2.-etude-du-%E2%80%9Cbehavioral-insights-group%E2%80%9D-sur-l%E2%80%99impact-des-faq-sur-la-compr%C3%A9hension&quot; tabindex=&quot;-1&quot;&gt;2. Etude du “Behavioral insights group” sur l’impact des FAQ sur la compréhension&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/effets-faq.png&quot; alt=&quot;Extrait d&#39;une étude révélant les effets des FAQ : 36% des tests montrent une compréhension améliorée, exemple d&#39;une FAQ utilisée pour expliquer les étapes d&#39;un paiement&quot;&gt;&lt;figcaption&gt;Extrait d’une étude révélant les effets des FAQ : 36% des tests montrent une compréhension améliorée&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;3.-repr%C3%A9sentation-d%E2%80%99un-processus-juridique-contractuel-afin-de-r%C3%A9duire-les-sollicitations-adress%C3%A9es-au-service-juridique&quot; tabindex=&quot;-1&quot;&gt;3. Représentation d’un processus juridique contractuel afin de réduire les sollicitations adressées au service juridique&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Constat initial :&lt;/strong&gt; “Les équipes commerciales itinérantes concluent des contrats importants mais ne sont pas autonomes pour mener une négociation juridique de A à Z ce qui les conduit régulièrement à solliciter la Direction Juridique en dernière minute, avant la vente.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Résultat :&lt;/strong&gt; Modification du document d’origine en page web responsive, plus adaptée aux usages des commerciaux en voiture. La première page de couverture donne une vision d’ensemble du processus contractuel, pour permettre aux utilisateurs de mieux se situer.
Chaque étape est cliquable, pour révéler des informations en profondeur.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/processus-contractuel.png&quot; alt=&quot;Capture d&#39;écran tablette d&#39;un processus contractuel pensé pour simplifer les étapes juridiques nécessaires à la conclusion de la vente de commerciaux sur le terrain&quot;&gt;&lt;figcaption&gt;Un processus contractuel pensé pour simplifer les étapes juridiques nécessaires à la conclusion de la vente de commerciaux sur le terrain&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://lawbydesign.co/legal-design/&quot;&gt;https://lawbydesign.co/legal-design/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://amurabi.eu/wp-content/uploads/amurabi-guide-debutant-legal-design.pdf&quot;&gt;Guide “Comment bien démarrer en legal design” par Amurabi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://amurabi.eu/renault-repenser-un-processus-contractuel-pour-autonomiser-les-operationnels//&quot;&gt;https://amurabi.eu/renault-repenser-un-processus-contractuel-pour-autonomiser-les-operationnels//&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sketchlex.com/documents/legaldesign-sketchlex-lawyersnow-legitech-mars-2019.pdf/&quot;&gt;https://sketchlex.com/documents/legaldesign-sketchlex-lawyersnow-legitech-mars-2019.pdf/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://amurabi.eu/wp-content/uploads/These-marie-potel-la-forme-fonction.pdf&quot;&gt;Thèse “La forme de la norme peut-elle lui redonner sa fonction ?”&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.lagazettedescommunes.com/892026/avec-le-legal-design-le-droit-a-la-portee-de-tous/&quot;&gt;https://www.lagazettedescommunes.com/892026/avec-le-legal-design-le-droit-a-la-portee-de-tous/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Emails HTML modernes : en finir avec les &lt;table&gt;</title>
    <link href="https://www.teotimepacreau.fr/blog/emails-html-modernes/" />
    <updated>2023-12-13T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/emails-html-modernes/</id>
    <content type="html">&lt;p&gt;Le monde du développement d’emails est rempli d’inconsistences, de hacks, d’éléments HTML obsolètes, et de règles CSS abandonnées depuis longtemps.
Les développeurs d’emails se retrouvent ainsi à devoir jongler entre des &lt;code&gt;&amp;lt;tables&amp;gt;&lt;/code&gt; layouts, des &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;td&amp;gt;&lt;/code&gt; (une façon de structurer le HTML en colonne et lignes comme on le ferait dans un tableau), les inline-styles CSS, &lt;code&gt;float&lt;/code&gt; une propriété CSS qui a perdu de son usage, à juste titre, depuis l’arrivée de &lt;code&gt;flexbox&lt;/code&gt; et &lt;code&gt;grid&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En théorie, le monde du développement d’emails devrait être simple car les emails ne sont rien de plus que des documents HTML, comme une page web, échangés entre nos clients mails. Cependant l’élément bloquant est bien cette dépendance aux clients mails qui ont tous des manières de différente de transformer le HTML en rendu visuel pour l’utilisateur.
Le support de chaque client mail des règles CSS et du HTML est différent et a pris énormément de retard par rapport au développement web classique.&lt;/p&gt;
&lt;p&gt;Ainsi, si vous avez l’habitude d’utiliser des méthodes CSS modernes comme  &lt;code&gt;dark-mode&lt;/code&gt;, &lt;code&gt;grid&lt;/code&gt;, &lt;code&gt;@font-face&lt;/code&gt; celles-ci sont soient :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pas supportés du tout&lt;/li&gt;
&lt;li&gt;ne fonctionnent pas comme attendu au rendu&lt;/li&gt;
&lt;li&gt;ne sont pas supportés de la même façon entre les différents clients mails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le développement d’emails est donc devenu un casse tête où le développeur doit sans cesser vérifier si la règle CSS ou l’élément HTML utilisé est supporté grâce à des outils indispensables comme &lt;a href=&quot;https://www.caniemail.com/&quot;&gt;https://www.caniemail.com/&lt;/a&gt; de &lt;a href=&quot;https://www.hteumeuleu.fr/&quot;&gt;Hteumeuleu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le peu d’effort mis par Google, Apple et Microsoft pour intégrer le support des nouveautés CSS et HTML s’explique par des raisons de &lt;a href=&quot;https://www.darkreading.com/cyberattacks-data-breaches/attackers-use-unicode-html-to-bypass-email-security-tools&quot;&gt;sécurité&lt;/a&gt;, de &lt;a href=&quot;https://www.linkedin.com/pulse/brief-update-email-client-wars-david-taitelbaum/&quot;&gt;guerre commerciale&lt;/a&gt;, et d’impossibilité à se mettre d’accord sur un &lt;a href=&quot;https://medium.com/email-design/will-there-ever-be-an-html-email-standard-bf8a2b7f48d8&quot;&gt;HTML email standard&lt;/a&gt;. A titre d’exemple &lt;a href=&quot;https://www.hteumeuleu.com/2020/outlook-rendering-engine/&quot;&gt;Outlook utilise encore Word pour rendre les emails sur mobile (?)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;une-r%C3%A9volution-en-cours-dans-le-monde-du-d%C3%A9veloppement-des-emails&quot; tabindex=&quot;-1&quot;&gt;Une révolution en cours dans le monde du développement des emails&lt;/h2&gt;
&lt;p&gt;Une révolution de la façon de développer des emails est en cours grâce à deux facteurs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la part d’utilisation des différents clients mails&lt;/li&gt;
&lt;li&gt;les récentes changements en terme de support des règles CSS/HTML des 3 principaux clients mails&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/part-de-marche-clients-mails.png&quot; alt=&quot;Part de marché des différents clients mails&quot;&gt;&lt;figcaption&gt;Graphique représentant les différentes par de marchés des clients mails&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Si l’on développe des emails, c’est avant tout pour qu’ils soient lus, et pour cela il est important d’avoir bien en tête les parts d’usages des différents clients mails car il est IMPOSSIBLE de développer des emails compatibles pour les dizaines de clients mails qui existent (certains clients mails encore actifs comme AOL ont des parts d’utilisation infimes).&lt;/p&gt;
&lt;h2 id=&quot;guide-de-d%C3%A9veloppement-moderne-d%E2%80%99email&quot; tabindex=&quot;-1&quot;&gt;Guide de développement moderne d’email&lt;/h2&gt;
&lt;p&gt;Les préconisations ci-dessous s’appuient sur deux considérations pragmatiques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nous prenons en compte seulement les clients Apple Mail, Gmail et Outlook qui couvre ainsi 90% des lecteurs de mails dans le monde.&lt;/li&gt;
&lt;li&gt;nous utiliserons des règles CSS/HTML supportés à minima part 70% de tout les clients mails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ainsi tous les éléments ci-dessous sont compatibles et supportés pour les 2 conditions précédentes et devraient combler la grande majorité des besoins. Il s’agit de recommandations et ne constituent, en aucun cas, un guide exhaustif de la conception d’emails HTML.&lt;/p&gt;
&lt;h3 id=&quot;stopper-les-table-layouts-et-float&quot; tabindex=&quot;-1&quot;&gt;Stopper les table layouts et float&lt;/h3&gt;
&lt;p&gt;Les table layouts dans les emails mènent à de nombreux problème d’accessibilité et de rendering.&lt;/p&gt;
&lt;p&gt;Outlook pour Windows est &lt;a href=&quot;https://blocksedit.com/content-code/dealing-with-outlook/&quot;&gt;la seule raison&lt;/a&gt; pour laquelle on pourrait être tenté de continuer à utiliser les tables, mais il représente désormais moins de 3% de l’usage total des clients mails. Les divs sont désormais totalement supportées et simplifient grandement la structuration des emails.&lt;/p&gt;
&lt;h3 id=&quot;%C3%A9l%C3%A9ments-html&quot; tabindex=&quot;-1&quot;&gt;Éléments HTML&lt;/h3&gt;
&lt;p&gt;Les divs, headings (&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;, etc.), paragraphes (&lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;), et les listes (&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) sont supportés partout.&lt;/p&gt;
&lt;p&gt;Il est donc possible de se passer totalement des &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; grâce aux divs ! Fini le besoin de structurer en colonnes et en lignes.&lt;/p&gt;
&lt;p&gt;Les élements HTML sémantiques ne sont pas supportés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;article&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;footer&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;header&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;main&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;nav&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;appliquer-du-css&quot; tabindex=&quot;-1&quot;&gt;Appliquer du CSS&lt;/h3&gt;
&lt;p&gt;Il n’est pas possible d’appliquer un style pour un fichier CSS externe via &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; src=&amp;quot;style.css&amp;quot;&amp;gt;&lt;/code&gt; car le client mail ne le lira pas.&lt;/p&gt;
&lt;p&gt;Il faut donc se tourner vers deux méthodes CSS “traditionnelles” :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les inline styles. Exemple : &lt;code&gt;&amp;lt;p style=&amp;quot;margin-top: 1rem !important; line-height: 1.5 !important;&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quelques points d’attention sur &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; :
Si vous forwardez l’email, tous les &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; seront supprimés et leur style ne sera pas appliqué. Également les comptes tiers utilisant un client mail autre que celui propriétaire verront leur &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag supprimé.&lt;/p&gt;
&lt;p&gt;Ainsi, le seul style qui ne sera pas suprrimé est le inline style.&lt;/p&gt;
&lt;p&gt;Quel est l’intérêt d’utiliser le &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag alors ?
Il permet d’appliquer des éléments généraux à tous le document HTML et évite les répétitions, donc pratique pour déclarer
&lt;a href=&quot;https://css-tricks.com/almanac/selectors/h/hover/&quot;&gt;:hover&lt;/a&gt;, les focus, un background-color sur la page… &lt;code&gt;!important&lt;/code&gt; est requis pour passer outre un inline style.&lt;/p&gt;
&lt;h3 id=&quot;%C3%A9viter-les-r%C3%A9p%C3%A9titions-en-utilisant-le-m%C3%A9canisme-css-d%E2%80%99h%C3%A9ritage&quot; tabindex=&quot;-1&quot;&gt;Éviter les répétitions en utilisant le mécanisme CSS d’héritage&lt;/h3&gt;
&lt;p&gt;Plutôt que de définir &lt;code&gt;font-family: &amp;quot;Gill Sans&amp;quot;, sans-serif;&lt;/code&gt; à chaque fois que l’on pose un &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; il est plus pratique d’utiliser l’héritage :&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;16px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; system-ui&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- email content goes here --&gt;&lt;/span&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;les-unit%C3%A9s&quot; tabindex=&quot;-1&quot;&gt;Les unités&lt;/h3&gt;
&lt;p&gt;De longueur :
Seuls les &lt;code&gt;rem&lt;/code&gt; et les &lt;code&gt;px&lt;/code&gt; sont supportés. On aura tendance à privilégier les &lt;code&gt;rem&lt;/code&gt; pour leur accessibilité naturelle en cas de zoom.
De couleur :
Seuls &lt;code&gt;#fffff&lt;/code&gt; et &lt;code&gt;rgb()&lt;/code&gt; sont supportés.&lt;/p&gt;
&lt;h3 id=&quot;fonts&quot; tabindex=&quot;-1&quot;&gt;Fonts&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;@font-face&lt;/code&gt; n’est pas supporté, impossible donc d’utiliser une font de son choix. Il est impératif de passer par les &lt;code&gt;system-fonts&lt;/code&gt;, des polices d’écriture incluses nativement dans les OS.&lt;/p&gt;
&lt;p&gt;Une règle à suivre de bonne pratique pour déclarer ses system-fonts :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “Custom Serif You Won’t Have”&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Serif You Might Have&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Serif Your System Almost Definitely has&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; “Canela”&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Adobe Caslon Pro&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Palatino&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour choisir la system-font qui correspond le mieux au design imaginé, essayez de choisir une system-font qui a une hauteur-de-x similaire.&lt;/p&gt;
&lt;h3 id=&quot;rendre-les-images-responsive&quot; tabindex=&quot;-1&quot;&gt;Rendre les images responsive&lt;/h3&gt;
&lt;p&gt;Par défaut les images vont overflow, pour contrer cela :&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;img-block&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5rem &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt;
          &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;object-fit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cover&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://i.imgur.com/twfNOSU.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;The Material Web Components website : a landing page explaining what is Material UI.&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voici une illustration pratique de ce code :&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/email-images-responsives.png&quot; alt=&quot;Images responsives dans les clients mails&quot;&gt;&lt;figcaption&gt;Illustration d’utilisation d’images responsives grâce à la technique ci-dessus dans un client mail&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;flexbox&quot; tabindex=&quot;-1&quot;&gt;Flexbox&lt;/h3&gt;
&lt;p&gt;La flexbox est désormais supportée ! Très pratique pour afficher des images côte à côte ou créer des colonnes.
&lt;code&gt;display: flex&lt;/code&gt; et &lt;code&gt;column-gap&lt;/code&gt; fonctionnent mais &lt;code&gt;flex-direction:column&lt;/code&gt; et &lt;code&gt;flex-wrap: wrap&lt;/code&gt; ne sont pas supportés dans GMAIL seulement. Ils fonctionnent dans les 2 autres clients.&lt;/p&gt;
&lt;video controls=&quot;&quot;&gt;
  &lt;source src=&quot;https://www.teotimepacreau.fr/img/flexbox-email.mp4&quot; alt=&quot;Vidéo illustration l&#39;illustration de flexbox dans un client mail&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;h3 id=&quot;position&quot; tabindex=&quot;-1&quot;&gt;Position&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;position: relative&lt;/code&gt; et &lt;code&gt;position: absolute&lt;/code&gt; ne sont pas supportés du tout&lt;/p&gt;
&lt;h3 id=&quot;liens&quot; tabindex=&quot;-1&quot;&gt;Liens&lt;/h3&gt;
&lt;p&gt;Les clients mails scannent les adresses emails et les numéros de téléphone dans le contenu de vos mails et les transforment automatiquement en liens soulignés bleus. Pour contrer ces styles par défaut il faut les wrapper dans des &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; et enlever le style par défaut.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value css language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	some@example.com
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cas-d%E2%80%99usage&quot; tabindex=&quot;-1&quot;&gt;Cas d’usage&lt;/h2&gt;
&lt;p&gt;J’ai construit un site d’inscription et d’envoi de newsletter qui repose entièrement sur ces principes, voici le &lt;a href=&quot;https://www.teotimepacreau.fr/projets/projetnewsletter/&quot;&gt;lien du projet&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://dodov.dev/blog/why-does-email-development-have-to-suck/&quot;&gt;https://dodov.dev/blog/why-does-email-development-have-to-suck/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hteumeuleu.com/blog/&quot;&gt;https://www.hteumeuleu.com/blog/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.caniemail.com/&quot;&gt;https://www.caniemail.com/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>SQLite, la solution pragmatique en production pour le web</title>
    <link href="https://www.teotimepacreau.fr/blog/SQLite/" />
    <updated>2023-11-10T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/SQLite/</id>
    <content type="html">&lt;h2 id=&quot;les-bdd-relationnelles%2C-pass%C3%A9es-de-mode-alors-qu%E2%80%99elles-r%C3%A9pondent-aux-besoins-de-la-grande-majorit%C3%A9-des-projets-des-d%C3%A9veloppement-web&quot; tabindex=&quot;-1&quot;&gt;Les BDD relationnelles, passées de mode alors qu’elles répondent aux besoins de la grande majorité des projets des développement web&lt;/h2&gt;
&lt;p&gt;Il existe deux types de BDD : &lt;a href=&quot;https://www.oracle.com/fr/database/base-donnees-relationnelle-difference-non-relationnelle/&quot;&gt;les relationnelles et les non relationnelles&lt;/a&gt;.
Les BDD relationnelles stockent les données dans des tables qui ont un lien entre elles (clé primaire qui est l’identifiant unique d’une entrée dans la table et la clé secondaire qui est l’identifiant d’une entrée qui permet de relier avec l’entrée d’une autre table). Il y a besoin de pré-définir une structure de données.
On traite les BDD relationnelles avec du SQL.
Les BDD non relationelles ne stockent pas les données dans des tables mais les stockent au format clé-valeur, dans des documents, en colonnes, en graphiques. Il n’y a pas besoin de pré-définir une structure de données. On traite les BDD non relationelles avec du NoSQL(MongoDB, Redis, Firebase…)&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/Schema_bdd.png&quot; alt=&quot;Schéma comparant les outils appropriés pour traiter une BDD relationnelle ou non relationnelle : le SQL est utilisé pour des tables relationnelles tandis que le NoSQL est approprié pour le non-relationnel&quot;&gt;&lt;figcaption&gt;Schéma comparant les outils appropriés pour traiter une BDD relationnelle ou non relationnelle&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Les grandes entreprises préfèrent aujourd’hui les BDD non relationelles car elles permettent de stocker un très grand volume de données sans que ces données soient rassemblées en un seul endroit.
La tendance actuelle vise à former les nouveaux développeurs directement sur du NoSQL pour préparer aux pratiques des grandes entreprises.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://www.teotimepacreau.fr/img/Graph_outil_BDD.png&quot; alt=&quot;Graphique du State of DB 2023 comparant les résultats de l&#39;enquête portant sur la part d&#39;utilisation de chaque outil de management de BDD : Postgres est largement en tête,puis Redis, MySQL et enfin SQLite&quot;&gt;&lt;figcaption&gt;Graphique du State of DB 2023 comparant les résultats de l’enquête portant sur la part d’utilisation de chaque outil de management de BDD&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;De plus, les technologies NoSQL comme MongoDB ne sont pas faites pour le relationnel. Pourtant des bibliothèques comme Mongoose permettent de faire des schémas et ainsi récréer des relations entre les différentes données, cela revient donc à utiliser MongoDB exactement comme pour du relationnel. Sauf que MongoDB n’est pas créé pour ça, et il arrive souvent que les schémas ne soient pas correctement mis à jour.&lt;/p&gt;
&lt;p&gt;Pourtant, le SQL a de nombreux atouts :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il est facile à apprendre&lt;/li&gt;
&lt;li&gt;il est depuis sa création le système le plus performant de gestion de BDD&lt;/li&gt;
&lt;li&gt;il est facilement maintenable dans le temps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ainsi, si l’application est de taille petite à modérée et que les données ont matière à être structurées (exemple : un catalogue de produits avec des entrées articles, prix, quantité) on préférera toujours le SQL.
Si tu as besoin d’un schéma… Si tes données sont relationnelles… Si tu veux faire des liens, des requêtes, etc… -&amp;gt; SQL&lt;/p&gt;
&lt;p&gt;Pour les cas de très grandes applications de multinationales avec des données stockées sous des formes et des emplacements différents, on préférera le NoSQL.
Le NoSQL est également plus adaptée pour le développement agile car les données ne sont pas structurées pendant les itérations.
Si tu gères un grand volume de données… Si le type de tes données est changeant… Si tu as besoin de passer à l’échelle de façon récurrente -&amp;gt; MongoDB&lt;/p&gt;
&lt;h2 id=&quot;pourquoi-choisir-sql-en-2023&quot; tabindex=&quot;-1&quot;&gt;Pourquoi choisir SQL en 2023&lt;/h2&gt;
&lt;p&gt;SQL a 50 ans. C’est l’une des seules technologies de la préhistoire de l’informatique à avoir traversé les âges. Les raisons ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sa simplicité&lt;/strong&gt; : Les instructions SQL s’écrivent d’une manière qui ressemble à celle de phrases ordinaires en anglais. Cette ressemblance voulue vise à faciliter l’apprentissage et la lecture. Les créateurs du SQL voulaient qu’il soit compréhensible aussi bien par des scientifiques que par des personnes en charge de la gestion commerciale d’entreprise sans avoir à faire appel à des informaticiens pour l’apprentissage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sa rapidité&lt;/strong&gt; : sa rapidité : SQL est plus rapide que Python pour requêter les données, son avantage est d’avoir un schéma de données pré-établi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sa stabilité&lt;/strong&gt; : les commandes de bases SELECT, UPDATE, INSERT, DELETE n’ont pas changées en 50 ans, ainsi les manières d’interagir avec les BDD sont largement documentées et partagées à tous les niveaux des équipes de développement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sqlite%2C-la-solution-pragmatique-pour-le-sql&quot; tabindex=&quot;-1&quot;&gt;SQLite, la solution pragmatique pour le SQL&lt;/h2&gt;
&lt;p&gt;SQLite est une BDD SQL avec une fonctionnalité bien particulière : l’entièreté de la BDD tient en un seul fichier qui est intégré à la solution.
SQLite est traditionnellement associé au développement d’applications Android/iOS et aux tests locaux. Pourtant SQLite se prête particulièrement bien pour les projets web par sa simplicité et par l’intérêt d’avoir son serveur et sa BDD sur la même machine.&lt;/p&gt;
&lt;h3 id=&quot;les-avantages-de-sqlite&quot; tabindex=&quot;-1&quot;&gt;Les avantages de SQLite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;facilité d’administration&lt;/strong&gt; : toutes les tâches d’administration de la BDD deviennent beaucoup plus simple. Pas besoin de compte pour administrer, la BDD est constituée d’un seul fichier intégré à l’application qu’il est possible de visualiser entièrement dans VSCode grâce à &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=qwtel.sqlite-viewer&quot;&gt;https://marketplace.visualstudio.com/items?itemName=qwtel.sqlite-viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;facilité de déploiement&lt;/strong&gt; : comme SQLite est un simple fichier binaire, il est facile de le pousser en production et de le faire migrer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;simplicité&lt;/strong&gt; : des NPM package simples d’utilisation comme &lt;a href=&quot;https://www.npmjs.com/package/sqlite3&quot;&gt;https://www.npmjs.com/package/sqlite3&lt;/a&gt; asynchrones par défaut, non bloquants et intuitifs, s’intègrent remarquablement bien avec NodeJS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;rapidité&lt;/strong&gt; : la proximité de la BDD avec l’application permet de réduire grandement la latence par rapport à d’autres BDD, si bien que SQLite est de loin le plus rapide mais également plus rapide que le &lt;a href=&quot;https://www.sqlite.org/fasterthanfs.html&quot;&gt;filesystem lui même&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;capacité&lt;/strong&gt; : la capacité de stockage est immense, une seule BDD peut contenir plus d’un milliards de Gigabits de données&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;les-limites-de-sqlite&quot; tabindex=&quot;-1&quot;&gt;Les limites de SQLite&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requêtes concurrentes&lt;/strong&gt; : comme la BDD SQLite est composée d’un seul fichier, les opérations d’ECRITURE ne peuvent pas se faire en même temps. Chaque opération est placée dans une file d’attente et la BDD est bloquée pendant ce temps. Les opérations se réalisent très rapidement, de l’ordre la milliseconde, si bien que le blocage est très court. Les opérations de LECTURE de la BDD elles supportent un nombre illimité de lectures concurrentes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;les types de données sont limitées&lt;/strong&gt; : NULL, INTEGER (chiffres entiers), REA L(nombres à virgules), TEXT, BLOB (données binaires d’une image, vidéo…). SQLite ne supporte donc pas les BOOLÉENS, les DATES&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;la validation des données&lt;/strong&gt; : SQLite vous permettra volontiers d’insérer “abcd” dans votre colonne INTEGER. Ou une chaîne de 20 caractères dans votre colonne VARCHAR(5)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pas d’outils de récupération des données en cas d’incident sur le serveur&lt;/strong&gt; : si le serveur meurt les données disparaissent. Il faut soi-même mettre en place une solution de réplication en continu de la BDD sur un serveur pour avoir un backup, notamment via &lt;a href=&quot;https://litestream.io/&quot;&gt;https://litestream.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hébergement&lt;/strong&gt; de la BDD SQLite dans le cloud n’est pas possible avec tous les providers, personnellement j’utilise &lt;a href=&quot;http://fly.io&quot;&gt;fly.io&lt;/a&gt; qui le propose nativement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cas-d%E2%80%99usage&quot; tabindex=&quot;-1&quot;&gt;Cas d’usage&lt;/h2&gt;
&lt;p&gt;J’ai construit un site d’inscription et d’envoi de newsletter qui repose entièrement sur SQLite, voici le &lt;a href=&quot;https://www.teotimepacreau.fr/projets/projetnewsletter/&quot;&gt;lien du projet&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html&quot;&gt;https://www.unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.epicweb.dev/why-you-should-probably-be-using-sqlite&quot;&gt;https://www.epicweb.dev/why-you-should-probably-be-using-sqlite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://venturebeat.com/dev/why-sqlite-may-become-foundational-for-digital-progress/&quot;&gt;https://venturebeat.com/dev/why-sqlite-may-become-foundational-for-digital-progress/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.datacamp.com/blog/all-about-sql-the-essential-language-for-database-management&quot;&gt;https://www.datacamp.com/blog/all-about-sql-the-essential-language-for-database-management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Comment réaliser la mesure d&#39;impact de son entreprise gratuitement et pourquoi ?</title>
    <link href="https://www.teotimepacreau.fr/blog/mesure-d&amp;#39;impact/" />
    <updated>2023-01-13T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/mesure-d&amp;#39;impact/</id>
    <content type="html">&lt;h2 id=&quot;contexte&quot; tabindex=&quot;-1&quot;&gt;Contexte&lt;/h2&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.consilium.europa.eu/fr/press/press-releases/2022/11/28/council-gives-final-green-light-to-corporate-sustainability-reporting-directive/&quot;&gt;directive européene CSRD (Corporate Sustainability Reporting Directive)&lt;/a&gt; prendra effet le 1er Janvier 2024 et s’imposera d’abord aux structures de plus de 250 salariés puis progressivement à toutes les entreprises, y compris les PME.&lt;/p&gt;
&lt;p&gt;Le but de cette directive est d’inciter les structures à mesurer, centraliser et publier régulièrement les données de leur impact sociétal et environnemental.&lt;/p&gt;
&lt;p&gt;Cela modifiera les exigences actuelles en matière de reporting extra-financier issues de la &lt;a href=&quot;https://finance.ec.europa.eu/capital-markets-union-and-financial-markets/company-reporting-and-auditing/company-reporting/corporate-sustainability-reporting_en&quot;&gt;Non-Financial reporting Directive (NFRD)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les entreprises devront renseigner des indicateurs dans les thématiques E, S, G (Environnementales, Sociales, Gouvernance).&lt;/p&gt;
&lt;p&gt;Environ &lt;a href=&quot;https://www.europarl.europa.eu/news/fr/press-room/20221107IPR49611/durabilite-le-parlement-adopte-de-nouvelles-regles-pour-les-multinationales&quot;&gt;50 000 entreprises seront concernées par ces nouvelles règles, contre 11 700 actuellement&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;les-outils-gratuits&quot; tabindex=&quot;-1&quot;&gt;Les outils gratuits&lt;/h2&gt;
&lt;p&gt;Plusieurs plateformes gratuites de qualité existent :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.impact.gouv.fr/&quot;&gt;Impact.gouv.fr&lt;/a&gt; est un service de l’État qui permet aux entreprises de mesurer, collecter et transmettre les données Environnementales, Sociales et de bonne Gouvernance. Un formulaire est à remplir avec les données de l’entreprise, il est possible de publier publiquement celles-ci ou non. L’outil réutilise des informations déjà à la disposition de l’administration, pour réduire au maximum la charge de travail des entreprises.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://impactntechscore.impactscore.fr/&quot;&gt;Impact Score&lt;/a&gt; d’Impact France permet de cartographier l’impact pour toutes les tailles d’entreprises. Le résultat est un score noté sur 100, prenant en compte 20 indicateurs clés. Le score repose sur 5 piliers : la stratégie, les externalités sociales et écologiques, le partage du pouvoir et de la valeur.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://communemesure.fr/&quot;&gt;Commune Mesure&lt;/a&gt; de Plateau Urbain s’adresse uniquement aux tiers lieux et aux lieux hybrides. Au moyen de data-panorama, d’un formulaire et d’une boîte à outils, l’évaluation est guidée et permet de valoriser les impacts&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.valoress-udes.fr/&quot;&gt;Valor’ESS&lt;/a&gt; de l’UDES s’adresse aux structures de l’Economie Sociale et Solidaire et permet de mettre en avant la plus-value sociale, au moyen d’indicateurs adaptés pour les petites organisations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kelimpact.grandlyon.com/&quot;&gt;Kel Impact&lt;/a&gt; de la métropole du Grand Lyon permet de  mesurer sa performance, identifier les axes d’amélioration, identifier des solutions concrètes, suivre sa progression dans le temps.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;s%E2%80%99informer-et-s%E2%80%99outiller-sur-les-enjeux-de-rse&quot; tabindex=&quot;-1&quot;&gt;S’informer et s’outiller sur les enjeux de RSE&lt;/h2&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.strategie.gouv.fr/reseau-france-strategie/plateforme-rse&quot;&gt;Plateforme RSE&lt;/a&gt; est l’espace ressource de l’Etat pour suivre les dernières recommandations sur les questions sociales, environnementales et de gouvernance. Celle-ci permet de tenir à jour ses indicateurs et d’orienter le développement.&lt;/p&gt;
&lt;h2 id=&quot;les-b%C3%A9n%C3%A9fices-de-la-mesure-d%E2%80%99impact&quot; tabindex=&quot;-1&quot;&gt;Les bénéfices de la mesure d’impact&lt;/h2&gt;
&lt;p&gt;Les indicateurs d’impact permettent non seulement de se mettre en adéquation avec la législation, mais sont aussi un formidable levier pour véhiculer une image positive de l’entreprise.&lt;/p&gt;
&lt;p&gt;Mettre en avant les actions concrètes et leurs résultats permet à la structure d’attirer une nouvelle clientèle/de nouveaux usagers.&lt;/p&gt;
&lt;p&gt;La confiance en interne des collaborateurs et leur adhésion se voit également renforcée car les données sociales et de gouvernance sont lisibles et partagées.&lt;/p&gt;
&lt;p&gt;Enfin, la mesure d’impact permet de mesurer les progrès en interne et axer la stratégie dans le réel.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Gérer facilement le rythme vertical de son site web</title>
    <link href="https://www.teotimepacreau.fr/blog/rythme-vertical-css/" />
    <updated>2022-11-26T00:00:00Z</updated>
    <id>https://www.teotimepacreau.fr/blog/rythme-vertical-css/</id>
    <content type="html">&lt;h2 id=&quot;rythme-vertical&quot; tabindex=&quot;-1&quot;&gt;Rythme vertical&lt;/h2&gt;
&lt;p&gt;Adopter un rythme vertical proportionnel et prédictible sur une page web permet de ressentir une &lt;a href=&quot;https://24ways.org/2006/compose-to-a-vertical-rhythm/&quot;&gt;hiérarchie visuelle qui facilite l’expérience utilisateur&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;comment-le-d%C3%A9terminer-%3F&quot; tabindex=&quot;-1&quot;&gt;Comment le déterminer ?&lt;/h3&gt;
&lt;p&gt;On établit une &lt;em&gt;unité de mesure commune&lt;/em&gt; qui régit tous nos espacements et tailles.
Pour la déterminer, la règle typographique communément admise est &lt;strong&gt;d’ajouter la hauteur de la ligne à la taille de la police d’écriture utilisée&lt;/strong&gt;. Cela crée notre &lt;em&gt;“unité de rythme”&lt;/em&gt; que l’on va moduler pour tous nos espacements/tailles.
Notre base est la &lt;code&gt;line-eight&lt;/code&gt; des paragraphes couplée à la &lt;code&gt;font-size&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* =16px par défaut */&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-eight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
_____________
16*1.4=22.4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notre &lt;em&gt;“unité de rythme”&lt;/em&gt; est 22.4. L’objectif est d’essayer que chaque espacement en soit le multiple.&lt;/p&gt;
&lt;h3 id=&quot;exemple-concret-d%E2%80%99utilisation&quot; tabindex=&quot;-1&quot;&gt;Exemple concret d’utilisation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;On souhaite un &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; qui ferait 4 fois la taille de notre &lt;p&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;On souhaite également adapter la hauteur de ligne pour faciliter la lecture sur le gros-titre : &lt;code&gt;line-eight: 1.1;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un premier réflexe pourrait-être d’utiliser &lt;code&gt;font-size: 4rem;&lt;/code&gt;.
Pourtant on veut que notre &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; soit 4 fois plus grand que notre &lt;em&gt;“unité de rythme”&lt;/em&gt; et non pas de notre taille de police. On module donc la font-size :&lt;/p&gt;
  &lt;p class=&quot;post-update&quot;&gt;
  &lt;span&gt;Mise à jour du &lt;time datetime=&quot;Invalid Date&quot;&gt;Invalid Date&lt;/time&gt;&lt;/span&gt;
?*1.1=67.2
&lt;=&gt;61.09*1.1=67.2
&lt;/p&gt;&lt;p&gt;On convertit 61.09px en rem : 16/61.09=3.81rem&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2 id=&quot;le-%E2%80%9Chibou-lobotomis%C3%A9%E2%80%9D-%3A-le-s%C3%A9lecteur-css-qui-fait-gagner-du-temps&quot; tabindex=&quot;-1&quot;&gt;Le “hibou lobotomisé” : le sélecteur CSS qui fait gagner du temps&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;* + *&lt;/code&gt;, &lt;a href=&quot;https://alistapart.com/article/axiomatic-css-and-lobotomized-owls/&quot;&gt;autrement appelé le “hibou lobotomisé”&lt;/a&gt; est un formidable moyen de mettre en place une règle CSS anonyme et automatique pour faciliter la mise en page.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le sélecteur “&amp;gt;” cible tous les éléments enfants de la div parente&lt;/li&gt;
&lt;li&gt;le sélecteur “*” cible tous les éléments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;article &amp;gt; * + *&lt;/code&gt; nous permet donc de cibler tous les éléments de notre article suivant directement d’autres éléments.&lt;/p&gt;
&lt;h2 id=&quot;%E2%80%A6-et-une-touche-de-custom-properties&quot; tabindex=&quot;-1&quot;&gt;… et une touche de Custom Properties&lt;/h2&gt;
&lt;p&gt;Les &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/--*&quot;&gt;Custom Properties&lt;/a&gt; permettent de déclarer des variables réutilisables. On en profite pour utiliser également la fonction “clamp” qui permet de switcher entre une valeur minimale, une valeur de circonstance et une valeur maximale. Cela permet à notre &lt;em&gt;unité de rythme&lt;/em&gt; d’évoluer en accord avec l’espace disponible.&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;--baseline&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;clamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1.4rem&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1.1200rem + 1.4000vw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 2.8rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;notre-espacement-automatique-pour-l%E2%80%99ensemble-du-site-en-2-lignes-de-code&quot; tabindex=&quot;-1&quot;&gt;Notre espacement automatique pour l’ensemble du site en 2 lignes de code&lt;/h2&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body &gt; * + *&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--baseline&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pourquoi utiliser seulement &lt;code&gt;margin-top&lt;/code&gt; ? Les marges peuvent, dans certains cas, entrer en collision et se soustraire. &lt;a href=&quot;https://cssfordesigners.com/articles/managing-vertical-margins-in-css&quot;&gt;En ne déclarant que &lt;code&gt;margin-top&lt;/code&gt; on évite cet inconvénient&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
</feed>