<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bertrand Presles</title>
    <description>The latest articles on DEV Community by Bertrand Presles (@bpresles).</description>
    <link>https://dev.to/bpresles</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F371713%2F7762b2ff-733a-463c-bafe-8fa04023f25e.jpeg</url>
      <title>DEV Community: Bertrand Presles</title>
      <link>https://dev.to/bpresles</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bpresles"/>
    <language>en</language>
    <item>
      <title>Le web décentralisé par la pratique</title>
      <dc:creator>Bertrand Presles</dc:creator>
      <pubDate>Wed, 03 Nov 2021 15:18:25 +0000</pubDate>
      <link>https://dev.to/younup/-le-web-decentralise-par-la-pratique-b89</link>
      <guid>https://dev.to/younup/-le-web-decentralise-par-la-pratique-b89</guid>
      <description>&lt;h2&gt;
  
  
  Histoire
&lt;/h2&gt;

&lt;p&gt;Le web d'aujourd'hui est basé sur le protocole HTTP, qui fonctionne en mode client/serveur de façon centralisé. Il y a d'un côté un point d'entrée unique qui va ensuite aiguiller les requêtes vers des ordinateurs qui hébergent le site web ; et de l'autre des clients, les fameux navigateurs, qui permettent de le consulter.&lt;/p&gt;

&lt;p&gt;Ce mode de fonctionnement est très simple et rapide à mettre en place. Il nécessite cependant d'investir dans des équipements qui peuvent être coûteux si le nombre de visiteurs et/ou la quantité de données échangée entre les navigateurs et le site, sont très importants. De plus, l'hébergeur peut constituer un point unique de panne (&lt;em&gt;single point of failure&lt;/em&gt;) si le site et ses sauvegardes sont hébergés que dans un data center donné. Certains auront peut-être à l'esprit l'incendie chez OVH en mars 2021.&lt;/p&gt;

&lt;p&gt;Le web a commencé à se décentraliser grâce aux frameworks JavaScript tel que ReactJS, Angular ou VueJS qui permettent de déporter le travail de génération de l'interface utilisateur du côté du navigateur. Cependant, le serveur reste en charge des traitements métiers et des données.&lt;/p&gt;

&lt;p&gt;Récemment, des technologies exploitant à la fois la cryptographie et les réseaux peer2peer (P2P) sont apparues pour offrir des solutions permettant également de décentraliser le stockage des fichiers et des données, ainsi que les traitements métier. Nous allons voir quelques unes de ces technologies dans cet article.&lt;/p&gt;

&lt;h2&gt;
  
  
  La blockchain
&lt;/h2&gt;

&lt;p&gt;La blockchain a été théorisée dès 1991 par les chercheurs Stuart Haber et W. Scott Stornett, puis en 1992 avec l'introduction de la structure de données "&lt;a href="https://fr.wikipedia.org/wiki/Arbre_de_Merkle"&gt;Arbre de Merkle&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;En 2004, les premières briques concrètes ont été lancées par l'informaticien Hal Finney en proposant un premier prototype d'algorithme de consensus, nommé la RPOW (&lt;em&gt;Reusable Proof of Work&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Mais il faut attendre 2008 pour que la blockchain commence à véritablement sortir de l'ombre, avec la publication du livre blanc du BitCoin, première crypto-monnaie de l'histoire. C'est en janvier 2009 que le premier bloc de la blockchain BitCoin sera généré.&lt;/p&gt;

&lt;p&gt;Toutefois, limiter cette technologie aux crypto-monnaies serait ne pas lui faire honneur. La blockchain est avant tout une base de données décentralisée, historisée (horodatée) et infalsifiable. Elle exploite la structure de l'arbre de Merkle et une génération régulière des blocs de données pour permettre de garantir à la fois l'intégrité des données et leur historisation.&lt;/p&gt;

&lt;p&gt;On peut donc stocker dans une blockchain n'importe quelles données, que cela soit des données de transactions financières d'une crypto-monnaie, ou les caractéristiques de votre chat (cf &lt;a href="https://www.cryptokitties.co/"&gt;CryptoKitties&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Qu'est-ce qu'un arbre de Merkle ?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7dsgtEdY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/bNceDYtB3RmK9ds.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7dsgtEdY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/bNceDYtB3RmK9ds.png" alt='""' width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une structure d'arbre de Merkle consiste à relier tous les éléments entre eux de sorte que si on modifie n'importe lequel de ces éléments, tous les autres sont aussi impactés et les liaisons doivent être recalculées.&lt;/p&gt;

&lt;p&gt;Les données ont chacune leur hash basé sur leur contenu, puis on remonte jusqu'à la racine qui aura un hash dépendant de l'ensemble des données enfants. De ce fait, dès lors qu'une seule donnée est modifié, il faut recalculer les hash parents et le hash racine. Cela permet de garantir l'intégrité des données.&lt;/p&gt;

&lt;h3&gt;
  
  
  Synchronisation P2P
&lt;/h3&gt;

&lt;p&gt;En plus de sa sécurité apportée par la structure en arbre de Merkle, la blockchain fonctionne sur un réseau P2P où les données sont répliquées dans un grand nombre d'ordinateurs à travers le monde, qui se maintiennent synchronisés. Chaque ordinateur, aussi bien que n'importe quel autre dans le réseau, peut répondre à des demandes de clients frontaux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pSN4M8P7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/Vag5GhYiCRn9NW8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pSN4M8P7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/Vag5GhYiCRn9NW8.png" alt='""' width="880" height="1100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart contracts
&lt;/h3&gt;

&lt;p&gt;De plus, des implémentations plus récentes introduisent en plus la possibilité d'intégrer du code dans la blockchain, dans ce qui est appelé des &lt;em&gt;smart contracts&lt;/em&gt; (contrats intelligents). Cela permet donc d'intégrer du code métier, infalsifiable, travaillant sur les données de la blockchain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5S1oWptM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/23/4R1NmvIKTZqbLSn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5S1oWptM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/23/4R1NmvIKTZqbLSn.png" alt="smartcontract" width="557" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une blockchain pionnière dans ce domaine est celle d'&lt;a href="https://ethereum.org/fr/"&gt;Ethereum&lt;/a&gt;, et c'est encore aujourd'hui la blockchain la plus utilisée pour les &lt;em&gt;smart contracts&lt;/em&gt;.&lt;br&gt;
Cependant, d'autres frameworks pour créer des applications utilisant une blockchain, tel que &lt;a href="https://substrate.dev/"&gt;Substrate&lt;/a&gt; ou &lt;a href="https://ark.io/developers"&gt;ARK&lt;/a&gt;, implémentent également des solutions de &lt;em&gt;smart contracts&lt;/em&gt;, permettant d'embarquer du code métier interagissant avec les données de la blockchain et exposant une API pouvant être consommée par un site web ou une application mobile.&lt;/p&gt;
&lt;h2&gt;
  
  
  IPFS
&lt;/h2&gt;

&lt;p&gt;Si la blockchain permet de résoudre la problématique côté serveur, et même si les frameworks JavaScript modernes permettent de faire en sorte que l'interface utilisateur soit rendue côté navigateur et donc de façon décentralisé, un problème demeure. En effet, les fichiers de cette interface devaient toujours être récupérés depuis un hébergement spécifique.&lt;/p&gt;

&lt;p&gt;IPFS apporte une réponse comparable à la blockchain, mais en étant optimisé pour servir des fichiers. Comme la blockchain, il va stocker les fichiers en utilisant une structure d'arbre de Merkle pour les rendre très difficiles à falsifier. Il implémente également un système de réseau P2P, mais à la différence de la blockchain, tous les fichiers du réseaux ne sont pas systématiquement dupliqués.&lt;/p&gt;

&lt;p&gt;IPFS est exécuté sur la machine cliente. Certains navigateurs comme Brave intègrent d'ailleurs directement le support d'IPFS.&lt;/p&gt;

&lt;p&gt;Chaque utilisateur va enregistrer une copie des fichiers qu'il consulte sur le réseau. Ce qui diffère par rapport au cache traditionnel de votre navigateur, c'est que votre ordinateur peut servir de relai pour les fichiers que vous avez consulté. Autrement dit tout ordinateur connecté sur le réseau IPFS peut être serveur des fichiers qu'il dispose dans son dépôt IPFS local. Ainsi, chaque utilisateur est à la fois client et serveur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xv9_xXr9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/RC9ZdlYG1aq4Dhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xv9_xXr9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/RC9ZdlYG1aq4Dhz.png" alt='""' width="880" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;C'est ce mécanisme qui permet à IPFS d'offrir une réelle décentralisation. Si une machine ayant le fichier que vous recherchez tombe en panne, il est fort à parier que d'autres machines auront une copie et pourront vous fournir ce fichier.&lt;/p&gt;
&lt;h2&gt;
  
  
  Créer et héberger un site en 100% décentralisé
&lt;/h2&gt;

&lt;p&gt;En combinant les technologies des frameworks front JavaScript, de la blockchain, et IPFS, il est donc possible de créer et héberger un site web entièrement de façon décentralisé, sans avoir besoin de recourir à un hébergeur centralisé. Plus de crainte que votre site deviennent inaccessible à cause d'une panne, un incendie, ou autre incident.&lt;/p&gt;

&lt;p&gt;Voyons concrètement ce que cela donne avec une application écrite en AngularJS et se connectant à un réseau d'ordinateurs utilisant la blockchain Duniter.&lt;/p&gt;
&lt;h2&gt;
  
  
  Application pratique: Césium
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Pré-requis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Installer IPFS: &lt;a href="https://docs.ipfs.io/install/"&gt;https://docs.ipfs.io/install/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Récupérer le code source de Césium: &lt;a href="https://github.com/duniter/cesium/releases/download/v1.6.12/cesium-v1.6.12-web.zip"&gt;https://github.com/duniter/cesium/releases/download/v1.6.12/cesium-v1.6.12-web.zip&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Ajout du code source de l'application dans IPFS
&lt;/h3&gt;

&lt;p&gt;Assurez vous d'abord d'avoir le démon IPFS démarré : &lt;code&gt;ipfs daemon&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pour héberger un site en JavaScript sur IPFS, il suffit d’exécuter la commande suivante: &lt;code&gt;ipfs add &amp;lt;répertoire_ou_fichier&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ici, nous allons ajouter le répertoire de Césium:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;cesium
&lt;span class="nb"&gt;cd &lt;/span&gt;cesium
unzip cesium-v1.6.12-web.zip
ipfs add &lt;span class="nt"&gt;-r&lt;/span&gt; ./cesium-v1.6.12-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A la fin de l'ajout, vous devriez voir le hash du répertoire Césium sur la dernière ligne, qui ressemblera à celui-ci:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;added QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n cesium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accéder au site
&lt;/h3&gt;

&lt;p&gt;Maintenant que le site est ajouté, vous pouvez y accéder depuis n'importe quel navigateur : &lt;code&gt;http://dweb.link/ipfs/&amp;lt;hash&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemple pour Césium avec le hash ci-dessus : &lt;a href="http://dweb.link/ipfs/QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n"&gt;http://dweb.link/ipfs/QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vous êtes sur un navigateur intégrant IPFS, tel que Brave, vous pouvez aussi accéder au site en tapant: &lt;code&gt;ipfs://&amp;lt;hash&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemple (toujours avec Césium) : &lt;a href="https://dev.toipfs://QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n"&gt;ipfs://QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si votre navigateur dispose de l'extension &lt;a href="https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch"&gt;IPFS Companion&lt;/a&gt;, le site se charge directement depuis votre ordinateur. Sinon, il devra d'abord se propager dans le réseau pour pouvoir être chargé.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elle est moche cette adresse !
&lt;/h3&gt;

&lt;p&gt;Évidemment, une telle adresse n'est pas facile à retenir. Fort heureusement, il est possible d'affecter un nom de domaine, tout comme pour n'importe quel site.&lt;/p&gt;

&lt;p&gt;Pour cela, il faut avoir un service de DNS, et ajouter les entrées suivantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sous_domaine              IN CNAME dweb.link.
_dnslink.mon_sous_domaine IN TXT "dnslink=/ipfs/QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Par la suite, vous pourrez accéder à votre site avec l'adresse &lt;code&gt;https://sous_domaine.domaine.ext&lt;/code&gt;, comme n'importe quel site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le backend
&lt;/h3&gt;

&lt;p&gt;Lorsque vous accédez à cette application, vous verrez qu'elle se connecte automatiquement à un ordinateur du réseau Duniter qui utilise la technologie de la blockchain pour stocker les données (transactions, certifications, ...) de la crypto-monnaie &lt;a href="https://fr.wikipedia.org/wiki/%C4%9E1"&gt;Ğ1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vous pouvez voir la liste des ordinateurs du réseau de la blockchain dans la section &lt;em&gt;Réseau&lt;/em&gt; de l'application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1FZn7bja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/isNHWKOkbz1TgL5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1FZn7bja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.loli.net/2021/09/09/isNHWKOkbz1TgL5.png" alt='""' width="880" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De même, vous pouvez consulter le contenu de la blockchain dans la section &lt;em&gt;Dernier blocs&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  En bref
&lt;/h2&gt;

&lt;p&gt;Si le web décentralisé n'est pas encore une réalité au quotidien, les briques de bases pour sa concrétisation existent déjà. Il est donc d'ores et déjà possible de mettre en place une site web totalement décentralisé avec les technologies de la blockchain, IPFS et les frameworks front JavaScript tel que Angular, React ou Vue.&lt;/p&gt;

&lt;p&gt;Cependant, ces technologies sont encore jeunes et avant que le web décentralisé supplante le web que nous connaissons aujourd'hui, il se passera certainement encore plusieurs années.&lt;/p&gt;

&lt;p&gt;En attendant ce jour, veillez à choisir un hébergeur ou une solution de cloud qui ne perdra pas vos données et votre site en cas d'incendie ;)&lt;/p&gt;

</description>
      <category>web</category>
      <category>blockchain</category>
      <category>ipfs</category>
      <category>decentralized</category>
    </item>
    <item>
      <title>Une blockchain est-elle forcément énergivore ?</title>
      <dc:creator>Bertrand Presles</dc:creator>
      <pubDate>Thu, 01 Apr 2021 10:02:37 +0000</pubDate>
      <link>https://dev.to/younup/une-blockchain-est-elle-forcement-energivore-2b9k</link>
      <guid>https://dev.to/younup/une-blockchain-est-elle-forcement-energivore-2b9k</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzztd1gv4fclvv5npvxk7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzztd1gv4fclvv5npvxk7.png" alt="Blockchain et consommation énergétique"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La consommation énergétique est un reproche souvent entendu lorsque l’on parle de blockchain.&lt;br&gt;
En réalité, le niveau de consommation d’une blockchain est lié à plusieurs facteurs souvent méconnus.&lt;/p&gt;

&lt;p&gt;Nous allons voir comment une Blockchain fonctionne, pourquoi elle peut être énergivore, et quelques solutions permettant de limiter très fortement la consommation énergétique d'une Blockchain.&lt;/p&gt;

&lt;p&gt;Nous nous attarderons en particulier sur l’une d’entre elles, la preuve de travail à difficulté personnalisée, qui est intéressante sur de nombreux aspects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce qu'une blockchain ?
&lt;/h2&gt;

&lt;p&gt;C'est une solution de stockage de données très sécurisée et chronologique. Voyons comment fonctionne une blockchain pour assurer un fort niveau de sécurité et une historisation des données.&lt;/p&gt;

&lt;p&gt;Une partie de la réponse est inscrite dans son nom "Blockchain" ou chaîne de blocs en français. Les données sont donc enregistrées dans des blocs reliés les uns aux autres.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.loli.net%2F2020%2F10%2F23%2F4MdNcCJBItasZTk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.loli.net%2F2020%2F10%2F23%2F4MdNcCJBItasZTk.png" alt="image-20201022173918481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historisation des données&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chaque bloc est enregistré à un intervalle régulier (toutes les 10 minutes pour Bitcoin par exemple) et ils sont reliés entre eux dans l’ordre chronologique à intervalles réguliers, permet d’avoir l’historique des données stockées dans la blockchain.&lt;/p&gt;

&lt;p&gt;Pour éviter que cette chronologie soit altérée, des mécanismes permettant de garantir l’intégrité des données sont mis en place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intégrité des données&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chaque bloc dispose d'un identifiant unique, appelé Hash, qui est calculé à partir non seulement de chacune des données stockées dans le bloc, mais aussi de l'identifiant (Hash) du précédent bloc.&lt;br&gt;
Chaque donnée du bloc est liée à d’autres données dans une structure appelée &lt;a href="https://www.blockchains-expert.com/larbre-de-merkle-colonne-vertebrale-de-blockchain/" rel="noopener noreferrer"&gt;Arbre de Merkel&lt;/a&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.loli.net%2F2020%2F10%2F23%2FQWD19VdqMOXsju2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.loli.net%2F2020%2F10%2F23%2FQWD19VdqMOXsju2.png" alt="Transaction"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ceci permet à la fois de garantir l'intégrité des données, puisque toutes les données étant liées les unes aux autres et les blocs liés aussi les uns aux autres, modifier la moindre donnée dans un bloc oblige à non seulement de recalculer les hashs des données du bloc, le hash du bloc et les hashs des blocs suivants.&lt;/p&gt;

&lt;p&gt;Cette liaison permet aussi de garder un historique puisque, dans chaque bloc nous retrouvons en entête l'identifiant (Hash) du bloc précédent. Nous verrons aussi qu'il y a une régularité entre l'enregistrement de chaque bloc permettant d'avoir une chronologie régulière dans une horloge commune appelée « temps blockchain ».&lt;/p&gt;

&lt;p&gt;Ce mécanisme permet de garantir l'intégrité et la chronologie des données, mais ce n'est pas le seul mécanisme entrant en jeu pour assurer la sécurité des données de cette solution de stockage qu'est la Blockchain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redondance des données&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un autre élément entrant en jeu dans la sécurisation des données dans une blockchain est la redondance de ces données entre les ordinateurs (appelés nœuds) du réseau permettant de s'assurer que si certains d'entre eux ont une défaillance quelconque, d'autres ont une copie identique des données et peuvent donc continuer à assurer le service.&lt;/p&gt;

&lt;p&gt;C'est l'entièreté de la chaîne de bloc qui est stockée dans chacun des nœuds du réseau. De ce fait chaque nœud dispose d'une sauvegarde complète.&lt;/p&gt;

&lt;p&gt;Les nœuds doivent donc rester synchronisés entre eux en permanence. Pour cela, il faut déterminer d'une part quel participant au réseau sera celui qui signe le prochain bloc et d'autre part, un protocole permettant de propager le nouveau bloc.&lt;/p&gt;

&lt;p&gt;Pour déterminer quel nœud signera le prochain bloc, on utilise ce qu'on appelle un algorithme de "Consensus". Il a deux missions :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Permettre de déterminer un nœud pour signer et écrire le prochain bloc.&lt;/li&gt;
&lt;li&gt;S'assurer qu'aucun nœud en particulier ne puisse prendre seul le contrôle du réseau et des données.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;C'est cet algorithme qui peut être plus ou moins énergivore, et nous allons voir les différents algorithmes de "Consensus" existants, leurs avantages et inconvénients non seulement en termes de consommation énergétique, mais aussi par rapport aux missions citées ci-dessus, en particulier concernant la gouvernance du réseau.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les algorithmes de consensus : le nerf de la guerre énergétique
&lt;/h2&gt;

&lt;p&gt;Nous allons voir quelques algorithmes de consensus les plus courants et détaillerons plus précisément un algorithme qui allie à la fois les avantages d’un consensus ne favorisant aucun membre du réseau au départ et une consommation énergétique contrôlée.&lt;/p&gt;

&lt;h3&gt;
  
  
  À l'origine : la preuve de travail
&lt;/h3&gt;

&lt;p&gt;Le premier algorithme de consensus utilisé dans l'histoire des blockchains est celui adopté pour le Bitcoin, à savoir la preuve de travail.&lt;/p&gt;

&lt;p&gt;Son principe est de faire participer l'ensemble du réseau à un exercice cryptographique visant à trouver un Hash respectant un certain schéma.&lt;br&gt;
Sur Bitcoin, le schéma à respecter est un certain nombre de zéro au début du Hash. &lt;/p&gt;

&lt;p&gt;L'algorithme de hashage utilisé par la blockchain Bitcoin est le SHA256. Avec cet algorithme, plus il y a de zéros à trouver au début du Hash, plus cela est difficile et plus cela requiert de la puissance machine pour y arriver dans un temps donné.&lt;br&gt;
C'est pourquoi on appelle cette contrainte : la difficulté.&lt;/p&gt;

&lt;p&gt;Dans le cadre de Bitcoin, le délai pour trouver une solution respectant le nombre de zéros, est de 10 minutes. Pour que cette durée reste régulière, car elle sert aussi à l'horloge du réseau,  la difficulté,  c'est à dire le nombre de zéros à respecter, est réévaluée régulièrement pour tenir compte de l'évolution de la puissance globale du réseau.&lt;/p&gt;

&lt;p&gt;Pour trouver la solution, chaque nœud va hasher le bloc, à partir non seulement des données du bloc, du hash du bloc précédent, mais aussi d'une variable appelée "Nonce", incrémentée de 1 à chaque nouvel essai. C'est cette variable qui permet de jouer sur le résultat du hashage et ainsi essayer de trouver un Hash respectant le schéma.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F2eifYlH.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F2eifYlH.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Les algorithmes de consensus alternatifs les plus courants
&lt;/h3&gt;

&lt;p&gt;La preuve de travail est une première solution, et elle a l'avantage principale de ne favoriser aucun noeud initialement au niveau de l'algorithme, mais elle a l'inconvénient d'être énergivore, en particulier si la puissance du réseau est importante, car il faut que le rythme de validation d'un bloc toutes les 10 minutes soit conservé. &lt;/p&gt;

&lt;p&gt;Concernant le Bitcoin, le réseau est constitué de plus de 11300 noeuds actifs à l'heure où sont écrites ces lignes (&lt;a href="https://bitnodes.io/dashboard/" rel="noopener noreferrer"&gt;https://bitnodes.io/dashboard/&lt;/a&gt;), dont un certain nombre sont des fermes de machines très puissantes et consommatrices. Le fait qu'un mineur récupère 6,25 BTC (soit 88500 € à l'heure où sont écrites ces lignes) par bloc validé n'est pas étranger à cela.&lt;/p&gt;

&lt;p&gt;Afin de résoudre cette problématique, d'autres algorithmes de consensus ont été imaginés, voyons les principaux.&lt;/p&gt;

&lt;h4&gt;
  
  
  Preuve d'enjeu ou preuve de détention (Proof of Stake)
&lt;/h4&gt;

&lt;p&gt;La preuve d'enjeu est le deuxième algorithme de consensus le plus populaire dans les blockchain publiques. A la différence de la preuve de travail, il ne nécessite pas d'effectuer un calcul mathématique pour déterminer le prochain nœud signant le bloc.&lt;/p&gt;

&lt;p&gt;Pour éviter de faire un calcul, il demande aux participants du réseaux de mettre en réserve (sorte de caution) une certaine quantité de tokens (unités de la blockchain).&lt;br&gt;
L'algorithme prend ensuite successivement les X nœuds (X étant paramétrable) qui ont le plus de tokens en réserve pour signer les blocs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6j7bcijvj30tm11zq5m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6j7bcijvj30tm11zq5m.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une variante de cet algorithme est la Delegated Proof-of-Stake, qui se différencie par le fait que les participants doivent recevoir des "votes" sous forme d'une quantité de tokens, de la part d'autres utilisateurs ayant déjà des tokens, pour participer à la validation des blocs. On pourrait presque dire que les noeuds pouvant signer les blocs sont "élus".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6jfvasylj30gf087q39.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6jfvasylj30gf087q39.jpg" alt="Analysis of the main consensus protocols of blockchain - ScienceDirect"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vous avez peut être déjà identifié l'inconvénient principal de cette approche. Les personnes ayant le plus de tokens et donc qui peuvent en mettre davantage en réserve (PoS) et/ou recevant le plus de votes (DPoS), sont favorisés par rapport aux autres. Et évidement, puisqu'il y a très souvent une récompense à la validation d'un bloc, les premiers arrivés sont avantagés par rapport aux autres.&lt;/p&gt;

&lt;p&gt;Par contre, cet algorithme consomme très peu d'énergie, puisqu'il n'a pas besoin de faire calculer les noeuds pour déterminer le prochain noeud validant.&lt;/p&gt;

&lt;h4&gt;
  
  
  Preuve d'autorité (Proof-of-Authority)
&lt;/h4&gt;

&lt;p&gt;La preuve d'autorité est apparue plus tard, et s’appuie non plus sur une quantité de token mise en réserve, mais l'identité. &lt;br&gt;
Pour pouvoir valider des blocs, chaque participant doit être élu par les participants existants et publier son identité.&lt;/p&gt;

&lt;p&gt;Cela se rapproche donc d'un fonctionnement centralisé, où il y a un groupe d’ordinateurs sélectionnés à l’avance qui sont les seuls à pouvoir valider les blocs. Cette approche est donc non adaptée aux blockchains publiques qui se veulent être ouvertes à tous.&lt;/p&gt;

&lt;p&gt;Comme la Proof-of-Stake, les noeuds n'ont pas à faire de calcul pour être sélectionnés, et donc la consommation énergétique reste faible. Mais on voit par contre qu’on perd en grande partie l’approche décentralisée initiale des blockchains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Une approche originale : La preuve de travail à difficulté personnalisée (Personalized Proof-of-Work)
&lt;/h2&gt;

&lt;p&gt;Plus récemment, en 2017, est apparue la preuve de travail à difficulté personnalisée. Elle tente de combiner les avantages de la preuve de travail (pas de présélection des nœuds) tout en réduisant ses inconvénients en terme de consommation énergétique.&lt;/p&gt;

&lt;h3&gt;
  
  
  Une solution d’identification décentralisée : La toile de confiance (Web of Trust)
&lt;/h3&gt;

&lt;p&gt;Tout comme dans la preuve d'autorité, les participants sont identifiés, mais à l'aide de leur clé publique. Ils peuvent donc librement choisir de pas publier leur identité réelle.&lt;br&gt;
Pour éviter d'utiliser un mécanisme d’identification centralisé, un système d’identification décentralisé appelé "Toile de confiance" (Web of Trust), a été conçu et implémenté.&lt;/p&gt;

&lt;p&gt;Celui-ci fonctionne par un mécanisme de parrainage (certification), qui, contrairement à la preuve d'autorité, n'est pas seulement réservé à ceux qui participent au réseau mais est ouvert à tous les utilisateurs qu'ils valident ou pas des blocs (i.e : qu’ils soient mineurs/forgeurs ou non).&lt;/p&gt;

&lt;p&gt;Pour être membre, un utilisateur doit se faire certifier par 5 autres utilisateurs minimum (pour faire simple, car il y a des conditions plus complexes en réalité, pour protéger d’une éventuelle attaque Sybille (prise de contrôle de la toile de confiance)).&lt;/p&gt;

&lt;h3&gt;
  
  
  Les nouveaux tokens ne sont pas créés en récompense du minage, mais par tous les utilisateurs
&lt;/h3&gt;

&lt;p&gt;Les validateurs de blocs (mineurs/forgeurs) ne reçoivent pas automatiquement une récompense, c'est tous les utilisateurs identifiés qui voient leur compte crédité tous les jours d'un montant identique entre tous, appelé Dividende Universel (DU). C'est par ce mécanisme que sont créés les nouveaux tokens de la blockchain.&lt;/p&gt;

&lt;p&gt;Le calcul de ce DU se fait selon une équation établie dans une théorie monétaire appelée la &lt;a href="https://trm.creationmonetaire.info" rel="noopener noreferrer"&gt;Théorie Relative de la Monnaie&lt;/a&gt; de Stéphane Laborde.&lt;/p&gt;

&lt;p&gt;Elle est la suivante lorsque le nombre d'utilisateur est globalement stable (varie peu) :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6jnq26z9j302r0170po.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6jnq26z9j302r0170po.jpg" alt="DU TRM"&gt;&lt;/a&gt;.&lt;br&gt;
avec &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6jqy6s4dj304b02dwef.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ftva1.sinaimg.cn%2Flarge%2F0081Kckwgy1gl6jqy6s4dj304b02dwef.jpg" alt="image-20201129181616892"&gt;&lt;/a&gt; et &lt;code&gt;ev&lt;/code&gt; = Espérance de vie moyenne (~80 ans en Europe).&lt;/p&gt;

&lt;p&gt;Dans le cas d’un nombre d’utilisateurs plus variable, comme c’est bien souvent le cas dans les crypto-monnaies décentralisées, le calcul du DU est plus fin pour lisser les effets des entrants et sortants, et répond à l’équation suivante : &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FKSS0fxm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FKSS0fxm.png" alt="DU Ğ1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le montant du DU est recalculé tous les 6 mois pour tenir compte de l'évolution du nombre d'utilisateurs et de la quantité de tokens en circulation pour faire en sorte que chacun crée une quantité de token convergeant vers la moyenne du total de token en circulation au bout de 40 ans (du fait que le coefficient &lt;code&gt;c&lt;/code&gt; est calculé selon la demi espérance de vie moyenne en Europe).&lt;/p&gt;

&lt;p&gt;Ceci permet de faire en sorte que les participants au réseau ne le fassent pas par intérêt de la récompense. Ce qui évite la course à la puissance entre les participants au réseau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Une consommation énergétique contrôlée
&lt;/h3&gt;

&lt;p&gt;Vous l’aurez compris, cette toile de confiance permet d’identifier, anonymement et de façon décentralisée, les utilisateurs, et donc également les propriétaires de nœuds mettant à disposition des ordinateurs pour valider les blocs.&lt;/p&gt;

&lt;p&gt;Ceci permet alors d’appliquer une difficulté personnalisée à chaque propriétaire de nœuds et permet ainsi d'ajuster la consommation énergétique du calcul de la preuve de travail.&lt;/p&gt;

&lt;p&gt;Par ailleurs une limite haute est mise en place pour exclure du calcul les noeuds ayant une difficulté supérieure à celle-ci.&lt;/p&gt;

&lt;p&gt;Pour faire varier la difficulté deux mécanismes sont mis en place :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Le facteur d'exclusion&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le facteur d'exclusion est appliqué sur le nœud ayant validé le dernier bloc, il fait en sorte d'exclure du calcul, pendant un nombre de blocs, les noeuds des membres ayant récemment validé un bloc.&lt;/p&gt;

&lt;p&gt;L’intérêt est double, il permet non seulement de limiter la consommation énergétique, puisque ces nœuds ne participent plus du tout au jeu mathématique de la preuve de travail, mais aussi d’éviter que des super-calculateurs ou fermes de calcul puissent prendre le contrôle de la blockchain.&lt;/p&gt;

&lt;p&gt;Voici comment il est calculé :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FNgJQkh1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FNgJQkh1.jpg" alt="Facteur d’exclusion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Avec &lt;code&gt;nbNoeudsCalculants&lt;/code&gt;, le nombre de noeuds ayant participé au calcul pour la validation du dernier bloc trouvé par le membre, et &lt;code&gt;nbBlocsValideesParLesAutres&lt;/code&gt; le nombre de blocs signés par le reste du réseau depuis que le membre considéré a trouvé son dernier bloc.&lt;/p&gt;

&lt;p&gt;Si le membre est l’auteur du dernier bloc, alors la variable &lt;code&gt;nbBlocsValideesParLesAutres&lt;/code&gt; sera égale à 0, puisqu’il vient de valider un bloc et donc aucun autre membre n’a validé de bloc depuis. Et de ce fait le facteur d’exclusion résultant sera d’autant plus élevé qu’il y aura de noeuds (&lt;code&gt;0,67*nbNoeudsCalculants&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Les membres du réseaux ayant calculés moins récemment des blocs, auront eu des facteurs d’exclusion plus faible puisque le dénominateur viendra diviser le numérateur d’autant plus qu’il y a de blocs validés par les autres depuis qu’ils ont validés leur derniers blocs.&lt;/p&gt;

&lt;p&gt;Mais le facteur d’exclusion seul n’est pas suffisant car si la difficulté personnalisée se limitait à cela, ce serait toujours le tiers des membres calculant les plus puissants qui écriraient des blocs, les deux tiers restants seraient presque toujours exclus.&lt;/p&gt;

&lt;p&gt;C’est pourquoi, en plus de ce facteur d’exclusion, un autre paramètre intervient : le handicap.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Le handicap&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FBsuha8r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FBsuha8r.jpg" alt="Handicap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le handicap est appliqué sur les nœuds ayant validé notablement plus de blocs notablement que la médiane du réseau (&lt;code&gt;nbMedianBlocsEcritsParNoeudsFenetreCourante&lt;/code&gt;) sur les X derniers blocs (fenêtre courante) : &lt;code&gt;nbBlocsNoeudFenetreCourante&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Il permet donc de fortement défavoriser les nœuds les plus performants, afin de donner leur chance aux appareils les plus économes (ex : Raspberry Pi 3).&lt;/p&gt;

&lt;p&gt;Et comme souvent la performance est liée à une consommation énergétique élevée, l’application de ce handicap permet de réduire l’impact énergétique du réseau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Une approche respectant la décentralisation tout en réduisant la consommation énergétique
&lt;/h3&gt;

&lt;p&gt;Le choix de se baser tout de même sur un mécanisme de preuve de travail permet de ne pas favoriser un sous ensemble de nœuds en particulier au départ, et la difficulté personnalisée permet de ne pas favoriser les appareils les plus performant et au contraire laisser une chance y compris aux appareils peu performants mais beaucoup moins consommateurs en énergie.&lt;/p&gt;

&lt;p&gt;La consommation énergétique est donc mécaniquement bien plus faible par rapport à la preuve de travail classique. Les participants n’ayant aucun intérêt à investir dans des centres de calculs ultra-puissants.&lt;/p&gt;

&lt;h3&gt;
  
  
  Il y’a t’il une application pratique de la preuve de travail à difficulté personnalisée ?
&lt;/h3&gt;

&lt;p&gt;Cette approche est utilisée par la &lt;a href="https://www.monnaie-libre.fr" rel="noopener noreferrer"&gt;crypto-monnaie Ğ1&lt;/a&gt; et le logiciel gérant sa blockchain, et donc implémentant l’algorithme de preuve de travail à difficulté personnalisée, s’appelle &lt;a href="https://www.duniter.org" rel="noopener noreferrer"&gt;Duniter&lt;/a&gt;. Ce dernier est écrit actuellement en TypeScript, mais une oxydation en Rust est en cours (appelée Dunitrust). La crypto-monnaie Ğ1 n’est pas mise en vente sur les plateformes d’échanges de crypto-monnaie, ce qui permet d’éviter la forte volatilité qu’ont de nombreuses autres crypto-monnaie.&lt;/p&gt;

&lt;p&gt;Elle est utilisée par une &lt;a href="https://forum.monnaie-libre.fr" rel="noopener noreferrer"&gt;communauté de plus de 2857 utilisateurs&lt;/a&gt; dans le monde, principalement en France, comme moyen d’échange lors d’événements concrets où les utilisateurs se rencontrent et l’utilisent pour s’échanger des biens et des services entre eux. Quelques commerçants l'acceptent également, comme le restaurant &lt;a href="https://etrillum.fr/" rel="noopener noreferrer"&gt;l'Etrillum&lt;/a&gt; à Nantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bilan
&lt;/h2&gt;

&lt;p&gt;Comme nous avons pu le voir, la blockchain n'est pas forcément énergivore, cela dépend de l'algorithme de consensus choisi. Nous avons vu que le choix de cet algorithme joue non seulement sur la consommation énergétique, mais aussi sur la gouvernance du réseau. Il est donc la clé de voute de la blockchain, et son choix n'est pas anodin.&lt;/p&gt;

&lt;p&gt;En effet, nous avons vu avec la preuve de travail, que si la gouvernance du réseau est parfaitement décentralisée sans favoriser aucun membre du réseau à priori, la difficulté du jeu cryptographique étant identique pour tous, les membres peuvent jouer sur la puissance de leurs machines pour obtenir un avantage par rapport aux autres, au détriment de la consommation énergétique.&lt;/p&gt;

&lt;p&gt;A l'inverse, nous avons vu que les preuves de détention (PoS/DPoS) et d'autorité (PoA), si elles permettent une consommations énergétique très faible, elles ont une gouvernance bien moins décentralisée et favorisant les personnes ayant le plus de tokens (PoS) ou de votes (DPoS) ou étant choisis par les participants existants (PoA).&lt;/p&gt;

&lt;p&gt;Enfin, nous avons vu qu'en utilisant une preuve de travail en faisant varier la difficulté de façon personnalisé (PPoW) pour chaque membre en fonction de sa rapidité de calcul et de son différentiel de blocs validés par rapport aux autres, alors nous arrivons à allier une bonne gouvernance décentralisée avec une consommation énergique davantage maitrisée.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>energie</category>
      <category>consensus</category>
      <category>crypto</category>
    </item>
    <item>
      <title>Déboguer comme un chef en PHP avec XDebug</title>
      <dc:creator>Bertrand Presles</dc:creator>
      <pubDate>Thu, 17 Dec 2020 08:55:12 +0000</pubDate>
      <link>https://dev.to/younup/deboguer-comme-un-chef-en-php-avec-xdebug-2bka</link>
      <guid>https://dev.to/younup/deboguer-comme-un-chef-en-php-avec-xdebug-2bka</guid>
      <description>&lt;p&gt;On retrouve encore trop souvent des développeurs PHP qui déboguent à l’ancienne avec des  &lt;code&gt;var_dump()&lt;/code&gt;, &lt;code&gt;kint()&lt;/code&gt; ou &lt;code&gt;dump()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Souvent, cela vient de la complexité à mettre en place XDebug et de la méconnaissance de son mode de fonctionnement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu’est-ce qu’XDebug ?
&lt;/h2&gt;

&lt;p&gt;XDebug est un outil de débogage pas à pas, qui permet de placer des points d’arrêt (&lt;em&gt;breakpoints&lt;/em&gt;) et de suivre l’exécution en temps réel en consultant les variables ainsi qu’en pouvant évaluer et modifier leurs valeurs.&lt;/p&gt;

&lt;p&gt;Maîtriser un tel outil fait gagner énormément de temps dans l’analyse d’un bogue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi choisir le débogage avec XDebug ?
&lt;/h2&gt;

&lt;p&gt;Le débogage avec XDebug est certes plus complexe à mettre en place initialement car il demande de configurer votre environnement d’exécution (extension PHP XDebug + paramétrage) et votre IDE. Mais cette opération n’est à faire qu’une fois sur votre poste par projet. Ensuite, vous n’avez qu’à lancer la session de débogage sans rien avoir à configurer de plus.&lt;/p&gt;

&lt;p&gt;Par rapport à du débogage à l’ancienne, c’est-à-dire avec des traces de log, vous gagnerez énormément de temps du fait de pouvoir visualiser et manipuler les variables (expression, définition de valeur), aussi bien dans le contexte du code où sont posés les points d’arrêt qu'en remontant la pile d’exécution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment fonctionne XDebug ?
&lt;/h2&gt;

&lt;p&gt;XDebug va se connecter à votre IDE. Il faut donc s’assurer que l’environnement d’exécution de votre application écrite en PHP ait accès à votre IDE.&lt;/p&gt;

&lt;p&gt;Si comme beaucoup vous utilisez Docker, cela veut dire passer par l’interface &lt;code&gt;docker0&lt;/code&gt; de votre conteneur, qui est l'interface qui permet de faire le pont entre votre conteneur et le système d'exploitation principal de votre machine.&lt;/p&gt;

&lt;p&gt;Pour trouver l'IP de l'interface &lt;code&gt;docker0&lt;/code&gt;, taper la commande suivante :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS et Linux : &lt;code&gt;ifconfig&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

  docker0: &lt;span class="nv"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;  mtu 1500
          inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
          inet6 fe80::42:a3ff:febc:7ab4  prefixlen 64  scopeid 0x20&amp;lt;&lt;span class="nb"&gt;link&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          ether 02:42:a3:bc:7a:b4  txqueuelen 0  &lt;span class="o"&gt;(&lt;/span&gt;Ethernet&lt;span class="o"&gt;)&lt;/span&gt;
          RX packets 0  bytes 0 &lt;span class="o"&gt;(&lt;/span&gt;0.0 B&lt;span class="o"&gt;)&lt;/span&gt;
          RX errors 0  dropped 0  overruns 0  frame 0
          TX packets 13430  bytes 1949419 &lt;span class="o"&gt;(&lt;/span&gt;1.9 MB&lt;span class="o"&gt;)&lt;/span&gt;
          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Windows : &lt;code&gt;ipconfig&lt;/code&gt; (chercher l'interface &lt;code&gt;DockerNAT&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgli0zbu1ujxeokqd44rg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgli0zbu1ujxeokqd44rg.png" alt="DockerNAT on windows"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation de XDebug
&lt;/h2&gt;

&lt;p&gt;XDebug est disponible sous la forme d’une extension PHP. Bien souvent pour l’installer, il suffit d’installer le paquet de cette extension sur votre machine de développement ou dans votre conteneur.&lt;/p&gt;

&lt;p&gt;Je vais donner la commande pour une Ubuntu 20.04 LTS, mais je vous invite à vous référer à la documentation de votre image Docker ou de votre distribution pour trouver les instructions d’installation :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

apt &lt;span class="nb"&gt;install &lt;/span&gt;php-xdebug


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Configuration de XDebug
&lt;/h2&gt;

&lt;p&gt;C’est la partie la plus délicate, il est impératif de bien comprendre chacun des paramètres pour pouvoir ensuite identifier les éventuels problèmes de configuration qui pourront expliquer les dysfonctionnements potentiels.&lt;/p&gt;

&lt;p&gt;Les paramètres importants pour déboguer en distant, c’est-à-dire d’un conteneur vers votre IDE sur l’hôte, sont les suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;xdebug.remote_enable&lt;/code&gt; =&amp;gt; A valoriser à 1 pour activer.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xdebug.remote_host&lt;/code&gt; =&amp;gt; Mettre l’IP de l’interface &lt;code&gt;docker0&lt;/code&gt; du conteneur ou &lt;code&gt;host.docker.internal&lt;/code&gt; sous Docker for Mac ou Docker for Windows.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xdebug.remote_port&lt;/code&gt; =&amp;gt; En général &lt;code&gt;9000&lt;/code&gt;, mais pourra être changé dans l’IDE.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xdebug.idekey&lt;/code&gt; (optionnel) =&amp;gt; Un identifiant unique (utile si vous voulez exécuter plusieurs sessions de débogage en même temps sur des applications différentes).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple de configuration :&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

/etc/php/7.4/fpm/conf.d/20-xdebug.ini
&lt;span class="nv"&gt;zend_extension&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xdebug.so

xdebug.remote_enable&lt;span class="o"&gt;=&lt;/span&gt;1
xdebug.remote_host&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"host.docker.internal"&lt;/span&gt;
xdebug.remote_port&lt;span class="o"&gt;=&lt;/span&gt;9000


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Activation dans votre IDE
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Visual Studio Code
&lt;/h3&gt;

&lt;p&gt;Sous VSCode, il vous faudra installer l’extension "PHP Debug" de Félix Fbecker puis créer un &lt;code&gt;launch.json&lt;/code&gt; dans le répertoire &lt;code&gt;.vscode&lt;/code&gt; avec le contenu suivant :&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Listen to XDebug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"launch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;local&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"pathMappings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"/var/www/docroot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceRoot}/docroot"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"xdebugSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"max_children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"max_data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"max_depth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
             &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;La clé &lt;code&gt;pathMappings&lt;/code&gt; est utile si vous utilisez des conteneurs ou que votre application s’exécute sur un serveur distant, il permet d'indiquer la correspondance entre le chemin dans le conteneur, ou sur le serveur, et le chemin sur votre environnement local (hors conteneur).&lt;/p&gt;

&lt;p&gt;Une fois cela fait, vous lancez le profile "&lt;em&gt;Listen to XDebug&lt;/em&gt;" et vous pouvez commencer à déboguer.&lt;/p&gt;

&lt;h3&gt;
  
  
  PHPStorm
&lt;/h3&gt;

&lt;p&gt;Vous devez vous assurer que le port d'écoute pour XDebug dans PHPStorm est configuré en accord avec votre configuration PHP (9000 par défaut) :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flyxsxmf4c9pg7owwzji1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flyxsxmf4c9pg7owwzji1.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Puis ajouter une configuration de lancement :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhxeuz36ms3iuqhnjlxmf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhxeuz36ms3iuqhnjlxmf.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh6cvl1ylzl01781ei479.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fh6cvl1ylzl01781ei479.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fni492813xynwqre87lqn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fni492813xynwqre87lqn.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vous utilisez un conteneur ou que votre application s’exécute sur un serveur, cochez l'option "&lt;em&gt;Use path mappings&lt;/em&gt;" pour définir la correspondance entre le chemin dans le conteneur, ou sur le serveur, avec vos fichiers sur votre machine locale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8qyqh4l0boo9yfvoph29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8qyqh4l0boo9yfvoph29.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ensuite il suffira de lancer le debug en mode écoute :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkpgtufpy7dobqsai4l6w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkpgtufpy7dobqsai4l6w.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si vous avez plusieurs applications qui tournent et que vous voulez déboguer l’une d’entre elles en particulier, vous pouvez utiliser la clé de session (&lt;em&gt;idekey&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Dans ce cas, il faut désactiver l’écoute (avec l'icône en forme de téléphone), et appeler l’URL à déboguer avec le paramètre &lt;code&gt;XDEBUG_SESSION_START&lt;/code&gt; valorisé avec la clé de session configuré dans votre IDE (ex : &lt;code&gt;XDEBUG_SESSION_START=PHPSTORM&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Cela peut être simplifié en utilisant l’extension navigateur  &lt;code&gt;XDebug Helper&lt;/code&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pour Firefox: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/xdebug-helper-for-firefox/" rel="noopener noreferrer"&gt;https://addons.mozilla.org/en-US/firefox/addon/xdebug-helper-for-firefox/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pour Chrome/Chromium/Brave/Opera: &lt;a href="https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc" rel="noopener noreferrer"&gt;https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ligne de commande
&lt;/h3&gt;

&lt;p&gt;Il est également possible de lancer le débogage pour une application PHP en ligne de commande.&lt;/p&gt;

&lt;p&gt;Pour cela, il suffit de définir les paramètres XDebug via la variable d’environnement &lt;code&gt;XDEBUG_CONFIG&lt;/code&gt; :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XDEBUG_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"remote_enable=1 remote_host=&amp;lt;ip_docker0_ou_localhost&amp;gt; remote_port=9000 idekey=&amp;lt;vscode ou PHPSTORM&amp;gt;"&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Si votre IDE est PHPStorm, il faudra en plus définir la variable &lt;code&gt;PHP_IDE_CONFIG&lt;/code&gt; pour spécifier le nom de la configuration serveur ayant le &lt;em&gt;path mapping&lt;/em&gt; correspondant à votre conteneur Docker ou à votre serveur :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PHP_IDE_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"serverName=&amp;lt;nom_config_serveur&amp;gt;"&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Ensuite, lancez votre script PHP CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fonctionnalités de débogage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Les points d’arrêt
&lt;/h3&gt;

&lt;p&gt;L’élément principal dans un débogage pas à pas sont les points d’arrêt. Ils vous permettent d’indiquer à votre IDE à quel endroit vous souhaitez que l’exécution s’arrête pour inspecter le contexte de l’application à ce moment-là.&lt;/p&gt;

&lt;p&gt;Il existe deux types de points d’arrêt :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;les points d'arrêt inconditionnels,&lt;/li&gt;
&lt;li&gt;les points d'arrêt conditionnels.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Comme vous l’avez certainement deviné, les points d’arrêts inconditionnels arrêteront l’exécution de l’application aux endroits où ils sont positionnés, quoiqu’il arrive, alors que les points d’arrêt conditionnels le feront que si les conditions définies sont remplies.&lt;/p&gt;

&lt;p&gt;Ces derniers sont très pratiques pour déboguer des cas précis, en particulier sans avoir à passer ceux qui ne nous intéressent pas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsmhag3u7iv1vl6atx1rf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsmhag3u7iv1vl6atx1rf.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour placer un point d'arrêt, il suffit de cliquer devant une ligne sur la colonne à gauche de l'éditeur.&lt;/p&gt;

&lt;p&gt;Pour définir une condition sur le point d'arrêt, il suffit de cliquer droit sur un point d'arrêt existant (ou clic-droit puis sélectionner &lt;code&gt;Edit breakpoint&lt;/code&gt; sous VSCode).&lt;/p&gt;

&lt;h3&gt;
  
  
  L’inspecteur de variables
&lt;/h3&gt;

&lt;p&gt;L’autre outil à disposition est l’inspecteur de variables. Vous aurez peut-être remarqué, dans la configuration de VSCode, nous avons mis des paramètres de profondeurs d’inspection (&lt;code&gt;max_children&lt;/code&gt;, &lt;code&gt;max_data&lt;/code&gt;, &lt;code&gt;max_depth&lt;/code&gt;), ils permettent de définir la profondeur d'inspection des variables, comme, par exemple, dans des tableaux ou objets, directement depuis cet inspecteur. Nous n’avons pas eu à définir ces paramètres sous PHPStorm parce que dans son cas ils sont déjà assez importants par défaut.&lt;/p&gt;

&lt;p&gt;Voyons à quoi ressemble cet inspecteur sous PHPStorm :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp30um4sftnzrjxg1obrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp30um4sftnzrjxg1obrl.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et sous VSCode :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmobs8ttjpje4ztokatlp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmobs8ttjpje4ztokatlp.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En plus d’inspecter les variables déclarées dans le contexte du point d’arrêt courant, il est possible de sélectionner une ligne de la pile d’exécution pour visualiser les variables des éléments appelants, ce qui est très pratique quand le bogue provient en réalité d’un élément plus en amont dans la pile d’exécution.&lt;/p&gt;

&lt;p&gt;Sous PHPStorm, cet inspecteur de variables permet également de modifier dynamiquement la valeur d’une variable :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwlkf7gw299nyaz3ojng1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fwlkf7gw299nyaz3ojng1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  L’inspecteur d’expressions
&lt;/h3&gt;

&lt;p&gt;Un autre outil très puissant dans le débogage pas à pas est l’inspecteur d’expressions.&lt;/p&gt;

&lt;p&gt;Celui-ci vous permet de définir des expressions complexes, ce qui peut s'avérer très utile, par exemple pour cibler un élément particulier d’un tableau, ou visualiser la taille d’une chaîne de caractère ou d’un tableau, sans modifier le code :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvv2ie6kgm2t0clqokb11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvv2ie6kgm2t0clqokb11.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Avancer dans le code
&lt;/h3&gt;

&lt;p&gt;Si cela s'appelle un débogueur pas à pas, c'est parce qu'il permet, une fois arrêté à un endroit du code, d'ensuite le parcourir ligne par ligne ou jusqu'au prochain point d'arrêt.&lt;/p&gt;

&lt;p&gt;Dans les captures d'écran ci-dessus, vous aurez peut-être remarqué les barres d'outils :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Barres d'outils des IDEs&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHPStorm&lt;/td&gt;
&lt;td&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fujj6yecpcfpuqkhe3ogg.png"&gt; &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0r9xunb497frosmr6xsq.png"&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VSCode&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3kprw1umsr3454ooepfh.png"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Elle servent à parcourir le code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Commandes de progression dans le code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4lediouyqgexnf3tlcnv.png"&gt;&lt;/td&gt;
&lt;td&gt;Avancer jusqu’au prochain point d'arrêt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjdemlffadanrv7ysppsx.png"&gt;&lt;/td&gt;
&lt;td&gt;Passer à la ligne suivante sans entrer dans la fonction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6o3yvi76xyrdxvaxf925.png"&gt;&lt;/td&gt;
&lt;td&gt;Entrer dans la fonction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fktwe1jff8lxirtwaxfds.png"&gt;&lt;/td&gt;
&lt;td&gt;Sortir de la fonction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo44inpcmnptmdt2u00cl.png"&gt;&lt;/td&gt;
&lt;td&gt;Reprendre l’exécution au début&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuhdmeeoxxumow314ecgv.png"&gt;&lt;/td&gt;
&lt;td&gt;Interrompre la session de débogage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Les autres capacités de XDebug
&lt;/h2&gt;

&lt;p&gt;En plus de proposer une fonctionnalité débogage pas à pas, XDebug est également capable de faire du profilage, afin de mesurer précisément les performances de votre code.&lt;/p&gt;

&lt;p&gt;Le profilage mérite un article à lui seul, nous approfondirons ce sujet dans un autre billet.&lt;/p&gt;

</description>
      <category>debug</category>
      <category>php</category>
      <category>xdebug</category>
    </item>
    <item>
      <title>Notre première conférence DevFest</title>
      <dc:creator>Bertrand Presles</dc:creator>
      <pubDate>Tue, 02 Jun 2020 11:06:27 +0000</pubDate>
      <link>https://dev.to/younup/notre-premiere-conference-devfest-cch</link>
      <guid>https://dev.to/younup/notre-premiere-conference-devfest-cch</guid>
      <description>&lt;p&gt;Lors de l'édition 2019 du DevFest, nous avons eu l'occasion pour la première fois de faire une présentation à un événement de cette envergure.&lt;/p&gt;

&lt;p&gt;Nous prenons la plume pour vous partager notre expérience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avant tout, qui sommes-nous ?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bertrand PRESLES :&lt;/strong&gt; Architecte et expert technique web et mobile chez Younup, sur les technologies PHP, Javascript, Ionic, Angular. Avant cette expérience de talk au DevFest, j'avais fait quelques talks en interne dans les entreprises dans lesquelles j'ai travaillé, ainsi que lors de MeetUps publiques à Nantes. Je suis également adhérent de l'association Blockchain et Société depuis 2019.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adrien LASSELLE :&lt;/strong&gt; Développeur fullstack et passionné par mon métier, je suis également adhérent organisateur du meetup Nantais Blockchain &amp;amp; Société depuis 2018. Je suis intéressé par les cas d'usage autours de la techno Blockchain et Bertrand m'a fait découvrir Duniter et la monnaie libre début 2019.&lt;/p&gt;

&lt;h3&gt;
  
  
  De l'idée au CFP (Call For Papers)
&lt;/h3&gt;

&lt;p&gt;Nous nous intéressons depuis plusieurs années aux technologies et applications autour de la Blockchain, et étant tous les deux membres de l'association Blockchain et Société de Nantes, nous participions déjà régulièrement à des MeetUps autour de la Blockchain, ce qui nous a permis de découvrir de nombreuses initiatives et projets autour de cette solution technologique.&lt;/p&gt;

&lt;p&gt;Comme vous le savez probablement, dans le monde des blockchains, une problématique revient régulièrement : la consommation énergétique. Il existe plusieurs solutions pour résoudre cette problématique, et nous avons été particulièrement séduits par l'approche qu'a adoptée la blockchain Duniter.&lt;/p&gt;

&lt;p&gt;En approfondissant l'étude de cette blockchain, nous avions décidé de faire une présentation de celle-ci et de la crypto-monnaie associée lors d'un MeetUp de Blockchain et Société à Nantes, dans un format assez court et synthétique. Suite à cette première expérience nous avons eu de bons retours de la part de l'auditoire.&lt;/p&gt;

&lt;p&gt;La date des CFPs du DevFest 2019 approchant, nous avons pris la décision de proposer une conférence plus technique et détaillée présentant l'approche de cette solution au DevFest.&lt;/p&gt;

&lt;p&gt;Nous avons donc soumis notre candidature. Pour nous aider, nous avons consulté des personnes qui ont déjà eu l'expérience du DevFest, notamment pour faire relire notre soumission (titre, description, références), car il est important d'avoir un titre accrocheur et une description claire et concise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dans l'attente de la sélection
&lt;/h3&gt;

&lt;p&gt;Entre la soumission du sujet sur la plateforme de CFP du DevFest et la validation, il se passe environ 3 mois au minimum.&lt;/p&gt;

&lt;p&gt;Pendant ce temps, nous avions déjà commencé à travailler sur le talk, tablant sur le fait que même si nous n'étions pas sélectionnés, nous pourrions le proposer dans d'autres événements.&lt;/p&gt;

&lt;p&gt;3 mois après, nous avons reçu un mail nous informant que nous étions mis sur liste d'attente, si jamais d'autres conférenciers se désistaient. Sur le moment un peu déçu, mais nous gardions espoir... et nous avions eu raison d'y croire car quelques jours après nous apprenions que nous étions mis au programme du DevFest 2019 ! Les choses sérieuses commençaient !&lt;/p&gt;

&lt;h3&gt;
  
  
  À l'approche du DevFest...
&lt;/h3&gt;

&lt;p&gt;Durant cette période nous avons travaillé sur le contenu et la forme de notre présentation, et nous avons fait deux répétitions ensemble.&lt;/p&gt;

&lt;p&gt;Plus le DevFest s'approchait, plus le stress se faisait ressentir, même si ce dernier a été atténué lorsque nous avons appris que notre conférence se déroulerait le premier jour en début d'après midi.&lt;/p&gt;

&lt;p&gt;Peu avant le DevFest, nous avons fait une répétition de notre conférence avec d'autres personnes, ce qui nous a permis d'avoir un regard extérieur sur notre présentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  La veille du DevFest
&lt;/h3&gt;

&lt;p&gt;La veille, nous avons été invités à participer à une soirée entre speakers, sous le signe du rock, thème du DevFest 2019, où nous avons pu accéder à une exposition sur le rock au Château des Ducs de Bretagne de Nantes, suivie d'un apéro dînatoire.&lt;/p&gt;

&lt;p&gt;Cette soirée très enrichissante et sympathique nous a permis de discuter et échanger avec les autres speakers et les organisateurs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le jour J
&lt;/h3&gt;

&lt;p&gt;En attendant notre conférence, nous avons profité des autres conférences du DevFest, et un peu avant l'heure, nous nous sommes isolés dans l'espace privatif dédié aux speakers.&lt;/p&gt;

&lt;p&gt;En effet, les speakers du DevFest bénéficient d'un espace à part, au calme, leur permettant de répéter et faire les derniers ajustements. Étant donné l'affluence dans les couloirs du DevFest, ce petit havre de paix est particulièrement bienvenu.&lt;/p&gt;

&lt;h3&gt;
  
  
  L'heure H
&lt;/h3&gt;

&lt;p&gt;Un petit quart d'heure avant le talk, nous nous rendons dans la salle qui nous a été attribuée. Plus habitués aux petites salles des MeetUp locaux, nous sommes impressionnés par la taille de la salle, qui comportait plus de 300 places.&lt;/p&gt;

&lt;p&gt;En arrivant sur l'estrade, nous sommes bien accueillis. En effet pour chaque présentation, une personne est affectée pour accueillir les speakers et introduire le talk (le "MC"). Celui-ci nous met à l'aise, nous installe nos micros cravates et fait un dernier point avec nous sur nos profils et l'introduction de la présentation.&lt;/p&gt;

&lt;p&gt;Nous voyons petit à petit la salle se remplir, et le sentiment de stress monte proportionnellement. Puis vient l'introduction de la conférence, on ne peut donc plus reculer, il va falloir se jeter dans le grand bain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le talk
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EpCuY7JL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6flnxugn7kv748eauiuo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EpCuY7JL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6flnxugn7kv748eauiuo.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une fois lancés dans le talk, le stress redescend, et pris par la passion du sujet que nous présentons, l'effet de stress, que les 300 personnes qui sont devant nous faisait, est en grande partie retombé.&lt;/p&gt;

&lt;p&gt;Évidemment, ce serait vous mentir de dire que tout s'est déroulé sans la moindre hésitation, le moindre bafouillage ou la moindre erreur, nous en avons eu mais, finalement, pas tellement plus que devant 20 à 30 personnes lors d'un MeetUp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les questions
&lt;/h3&gt;

&lt;p&gt;Vient ensuite le temps des questions, et là le stress remonte d'un cran, d'innombrables interrogations traversent nos esprits : A t'on été suffisamment clair ? Avons-nous dit des bêtises ? Avons-nous respecté la promesse de départ ? Qu'en ont pensé les personnes du public ?&lt;/p&gt;

&lt;p&gt;Mais les regards rassurants de nos collègues et les applaudissements du public nous rassurent, ce qui fait un peu retomber le stress.&lt;/p&gt;

&lt;p&gt;Cette période de questions a été pleine d'enseignements, et nous a permis, par la suite, de compléter notre présentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bilan et conseils
&lt;/h3&gt;

&lt;p&gt;On pourrait croire que, dans un événement de la taille du DevFest, c'est le nombre de spectateurs qui est le plus impressionnant. Ca l'est en effet les premières minutes avant de démarrer, mais cela retombe très rapidement, et ce n'est finalement pas tellement plus stressant que lors d'un MeetUp.&lt;/p&gt;

&lt;p&gt;Si vous êtes intéressés pour participer à un événement de cette taille, mais que vous n'avez pas fait de présentation dans des événements de cette taille, n'hésitez surtout pas, lancez-vous ! Le plus important est que vous fassiez une présentation qui vous plaît, que vous y preniez du plaisir !&lt;/p&gt;

&lt;p&gt;Évidemment, mieux vaut tout de même vous préparer avant en faisant des talks en interne dans votre entreprise et dans des MeetUps. Aussi, n'hésitez surtout pas à présenter votre talk à des personnes autour de vous, pour récolter leurs retours. Enfin, si c'est votre premier talk dans un événement de cette taille, nous vous recommandons de le faire au moins à deux plutôt que tout seul.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
