<?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: Vincent</title>
    <description>The latest articles on DEV Community by Vincent (@vincent-delmotte).</description>
    <link>https://dev.to/vincent-delmotte</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%2F999567%2Fd461c640-54a9-42e8-86a9-8fb9fbf15e4b.jpg</url>
      <title>DEV Community: Vincent</title>
      <link>https://dev.to/vincent-delmotte</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vincent-delmotte"/>
    <language>en</language>
    <item>
      <title>Votre ordinateur vous empêche de respirer</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Fri, 27 Sep 2024 14:45:29 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/votre-ordinateur-vous-empeche-de-respirer-e7n</link>
      <guid>https://dev.to/vincent-delmotte/votre-ordinateur-vous-empeche-de-respirer-e7n</guid>
      <description>&lt;p&gt;Vous êtes apnéiste mais vous ne le savez peut-être pas !&lt;/p&gt;

&lt;p&gt;Dans son livre “Respirer : Le pouvoir extraordinaire de la respiration”, James Nestor explique que la plupart des personnes consultant des mails souffrent d’un blocage de la respiration.&lt;/p&gt;

&lt;p&gt;En 2007, Linda Stone observe ce phénomène qu’elle qualifiera “d’apnée de l’écran”. &lt;/p&gt;

&lt;p&gt;Il semblerait que cette apnée de l’écran soit due à l’interprétation des messages comme source de danger par notre cerveau. Pour faire simple, c’est le caractère imprévisible et inconnu de toutes les notifications provenant de mail, sms, ou autres messages qui provoque un stress et donc un arrêt temporaire de la respiration.&lt;/p&gt;

&lt;p&gt;Bloquer sa respiration une ou deux fois au cours de la journée n’est pas un drame. Les problèmes surviennent quand cela devient chronique et que vous accumulez de longues minutes par jour à ne pas respirer correctement.&lt;/p&gt;

&lt;p&gt;Tout comme l’apnée du sommeil, l’apnée de l’écran est un blocage inconscient de la respiration. Ce blocage peut provoquer de nombreux problèmes comme une forte sensation de fatigue. &lt;/p&gt;

&lt;p&gt;Si vous vous sentez complètement épuisé à l’issue de votre journée, c’est probablement que sans le savoir, vous êtes un adhérent de la Fédération Française d’Apnée.&lt;/p&gt;

&lt;p&gt;Mais pas de panique, pour ne plus être sujet à l’apnée de l’écran, il suffit juste d’en être conscient et de reprendre le contrôle sur sa respiration, merci Vincent ! &lt;/p&gt;

&lt;p&gt;Si vous voulez en savoir plus sur le mécanisme de la respiration et comment ne plus être sujet à l’apnée de l’écran, je vous conseille vivement de lire ce livre. Il propose une revue du savoir autour de la respiration qu’il soit scientifique, empirique ou spirituel.&lt;/p&gt;

&lt;p&gt;Laissez-moi vous donner un conseil, la prochaine fois que vous ouvrez vos mails, n’oubliez pas de respirer ! &lt;/p&gt;

&lt;p&gt;Alors, aviez-vous conscience que vous pratiquiez l’apnée de l’écran ?&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>development</category>
    </item>
    <item>
      <title>Double Slash : le podcast tech</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Wed, 25 Sep 2024 07:02:01 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/double-slash-le-podcast-tech-3dfb</link>
      <guid>https://dev.to/vincent-delmotte/double-slash-le-podcast-tech-3dfb</guid>
      <description>&lt;p&gt;Si vous cherchez une chaîne youtube / podcast vous permettant de faire de la veille sur les technologies web, j’ai ce qu’il vous faut !&lt;/p&gt;

&lt;p&gt;En tant que développeur, faire de la veille c’est vital. Vous ne voulez pas être comme ce tonton qui sort des expression d’un autre temps et qui ne comprend pas les “d’jeuns”. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://double-slash.dev/" rel="noopener noreferrer"&gt;Double Slash&lt;/a&gt;, c’est une chaine youtube / podcast animé par Patrick Faramaz et Alex Duval qui propose deux formats :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Une revue mensuel des nouveautés et des évolutions de l’écosystème web.&lt;/li&gt;
&lt;li&gt;Des workshops abordant des sujets précis en profondeur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le podcast compte près de 100 épisodes, si vous voulez tous les rattraper, il va falloir s’y mettre vite !&lt;/p&gt;

&lt;p&gt;J’affectionne particulièrement ce podcast pour plusieurs raisons :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Le format veille d’une heure par mois est une mine condensées d’informations.&lt;/li&gt;
&lt;li&gt;Je suis exposé à des langages / outils que je ne connais pas ce qui augmente ma culture web.&lt;/li&gt;
&lt;li&gt;Le format workshop permet d’appréhender des notions avancées avec une simplicité déconcertante.&lt;/li&gt;
&lt;li&gt;Les animateurs donnent des tips / retours d’expérience sur les technos qu’ils utilisent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tous les mois, je passe 2h de course à pied avec Patrick et Alex dans les oreilles. Je me marre, j’apprends et tout ça sans le moindre effort ! (Ou presque, ça dépend si c’est un fractionné ou un footing).&lt;/p&gt;

&lt;p&gt;Ce podcast est l’un de mes supports de veille. Et vous, comment effectuez-vous votre veille ?&lt;/p&gt;

&lt;p&gt;Dites-moi si vous connaissez déjà Double Slash et si vous avez des suggestion de contenu. &lt;/p&gt;

&lt;p&gt;Bonne veille à tous !&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>php</category>
    </item>
    <item>
      <title>Des sentiers au clavier : comment la course à pied m’a permis d’être un meilleur développeur ?</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Fri, 20 Sep 2024 12:14:52 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/des-sentiers-au-clavier-comment-la-course-a-pied-ma-permis-detre-un-meilleur-developpeur--o21</link>
      <guid>https://dev.to/vincent-delmotte/des-sentiers-au-clavier-comment-la-course-a-pied-ma-permis-detre-un-meilleur-developpeur--o21</guid>
      <description>&lt;p&gt;Je suis actuellement en préparation pour le marathon de Nice. Lors de ma dernière séance de course à pied, je me suis fait la réflexion suivante : "en fait, courir ça fait de moi un meilleur développeur".&lt;/p&gt;

&lt;p&gt;Ça paraît fou non ? On n'a pas besoin de ses jambes pour coder !&lt;/p&gt;

&lt;p&gt;Laissez-moi vous expliquer ce que le sport m'apporte dans mon quotidien de développeur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Améliorer son hygiène de vie
&lt;/h2&gt;

&lt;p&gt;Dans l'imaginaire collectif, un développeur c'est un geek à lunettes passant son temps devant un écran et mangeant des pizzas avec un coca à la main.&lt;/p&gt;

&lt;p&gt;En effet, il est facile en tant que développeur de passer toute sa journée assis devant son écran. On est absorbé par son problème et on oublie la notion du temps. Les conséquences sont qu'on ne prend pas de pause, on ne bouge pas de son siège, on s'hydrate à peine et on ne s'alimente pas comme il faut.&lt;/p&gt;

&lt;p&gt;En tant que sportif, l'hygiène de vie est très importante, car c'est l'un des principaux piliers de la performance.&lt;/p&gt;

&lt;p&gt;Voici les trois règles de base d'une bonne hygiène de vie :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dormir suffisamment&lt;/li&gt;
&lt;li&gt;Manger sainement&lt;/li&gt;
&lt;li&gt;S'hydrater&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quand on y pense, si ces choses sont bonnes pour le corps et la performance sportive, c'est aussi bon pour le cerveau. Donner un carburant de qualité et fournir le repos nécessaire à notre corps nous permet une utilisation optimale de notre cerveau !&lt;/p&gt;

&lt;p&gt;Pratiquer la course à pied contribue à structurer ma vie autour de ces trois règles. Elles me permettent de me sentir en pleine possession de mes fonctions cérébrales. J'ai une meilleure concentration, plus d'inspiration et une meilleure capacité de raisonnement pour résoudre les problèmes qui se dressent sur mon chemin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cultiver la confiance en soi
&lt;/h2&gt;

&lt;p&gt;Enfiler ses baskets et courir, peu importe le temps, l'heure ou la motivation et faire ce qui doit être fait, procure une sensation unique de fierté. Ces petits accomplissements quotidiens contribuent à alimenter la confiance que j'ai en moi-même.&lt;/p&gt;

&lt;p&gt;Je suis convaincu que la confiance en soi est un facteur important de la réussite. C'est plus compliqué de réussir lorsqu'on est convaincu qu'on n'est pas capable ou digne d'entreprendre une action.&lt;/p&gt;

&lt;p&gt;Quand je vois d'où je suis parti et où j'en suis aujourd'hui, je me dis que rien n'est impossible. Le sport m'a apporté ce sentiment précieux que j'utilise dans tous les autres domaines de ma vie, particulièrement dans mon activité de développeur.&lt;/p&gt;

&lt;p&gt;Le développement d'une application est jalonné d'une succession de challenges. Avoir confiance en sa capacité à résoudre les problèmes est une condition nécessaire pour délivrer un service de qualité.&lt;/p&gt;

&lt;p&gt;La confiance en soi permet d'aborder les défis avec beaucoup de sérénité et d'optimisme, ce qui aide à ne pas rester paralysé devant l'obstacle.&lt;/p&gt;

&lt;h1&gt;
  
  
  Améliorer la gestion des émotions
&lt;/h1&gt;

&lt;p&gt;En tant que développeur, il existe de nombreuses sources d'émotions négatives. Tous les développeurs peuvent se rappeler d'un jour de frustration intense dû à un bug coriace. Il est facile de s'acharner et de finir mentalement épuisé par toutes ces émotions.&lt;/p&gt;

&lt;p&gt;Personnellement j'ai trois façons d'évacuer les émotions négatives qui parasitent ma réflexion :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Courir et faire le grand vide dans sa tête&lt;/li&gt;
&lt;li&gt;Prendre une douche, c'est connu, les meilleures idées viennent sous la douche&lt;/li&gt;
&lt;li&gt;Dormir car la nuit porte conseil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme vous l'imaginez peut-être, ma méthode favorite, c'est la course à pied. Courir permet de me libérer de toutes les émotions négatives telles que la frustration et le stress.&lt;/p&gt;

&lt;p&gt;Lorsque je reviens devant mon clavier, je suis détendu, mes idées sont de nouveau en ordre et je peux attaquer le problème sous un nouvel angle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ça offre du temps
&lt;/h2&gt;

&lt;p&gt;Je cours actuellement 5 heures par semaine. Pour beaucoup de personnes, courir c'est chronophage et ennuyant. Permettez-moi de vous donner la formule magique. Je mets à profit ces quelques heures de course à pied pour écouter des podcasts.&lt;/p&gt;

&lt;p&gt;Ce temps passé à écouter des podcasts me permet de me former sur des sujets tels que le développement, le marketing, l'entrepreneuriat, la nutrition et le sport.&lt;/p&gt;

&lt;p&gt;Ainsi, toutes les semaines, j'ai l'équivalent d'une demi-journée (5 heures) dédiée à ma formation de façon automatique et tout ça sans le moindre effort pour devoir libérer du temps. C'est devenu un rituel et je vois une véritable différence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Améliorer son organisation
&lt;/h2&gt;

&lt;p&gt;Effectuer 6 séances de sport dans une semaine ne s'improvise pas. Cela demande un minimum d'organisation pour placer les séances et les temps de récupération au bon moment.&lt;/p&gt;

&lt;p&gt;En tant que développeur, c'est pareil. L'organisation permet de structurer ses journées de travail afin de délivrer un maximum de valeur.&lt;/p&gt;

&lt;p&gt;Personnellement, je concentre mes tâches demandant le plus de concentration le matin car c'est le moment où je suis le plus apte à résoudre ces problèmes. Je connais également les heures sur lesquelles je peux travailler et être productif et les heures sur lesquelles j'organise des réunions ou je m'occupe de tâches qui demandent moins de concentration.&lt;/p&gt;

&lt;p&gt;L'organisation c'est faire les bonnes choses au bon moment, car l'objectif n'est pas de travailler longtemps mais plutôt d'être efficace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Être Persévérant
&lt;/h2&gt;

&lt;p&gt;Je me souviens du jour où j'ai commencé la course à pied. Je me souviens de cette séance de 20 minutes, de mes poumons en feu, de mes muscles complètement tétanisés. J'ai fini cette première séance dans le rouge complet. Je me souviens m'être dit "mais pourquoi les gens s'infligent cette souffrance".&lt;/p&gt;

&lt;p&gt;En ne lâchant rien et en ayant une pratique progressive et régulière, je suis capable aujourd'hui de courir un marathon, de faire des séances de 2h sans me fatiguer, sans cracher mes poumons.&lt;/p&gt;

&lt;p&gt;Tout ça a été possible grâce à la persévérance dont j'ai fait preuve. Ne pas abandonner et développer des routines est l'une des clés de toutes les grandes réussites.&lt;/p&gt;

&lt;p&gt;En développement, combien de side projects sont tombés dans les oubliettes par manque de persévérance ? Avoir la capacité de pousser ses idées jusqu'au bout est une capacité essentielle pour la réussite d'un projet.&lt;/p&gt;

&lt;p&gt;Cette persévérance me permet de ne jamais abandonner, et de trouver des solutions pour atteindre mes objectifs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Le sport a transformé ma vie en m'apportant une stabilité et une confiance en moi qui me sont très précieuses.&lt;/p&gt;

&lt;p&gt;Le sport me permet d'effectuer un transfert de compétences dans les différents domaines de ma vie. Ainsi, tous ces apprentissages me permettent d'être plus efficace et d'être un peu meilleur chaque jour.&lt;/p&gt;

&lt;p&gt;Merci pour votre lecture !&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>sport</category>
      <category>lifestyle</category>
    </item>
    <item>
      <title>Le Mob Programming : Une Approche Collaborative pour Booster votre Équipe de Développement 🚀</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Mon, 16 Sep 2024 12:02:30 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/le-mob-programming-une-approche-collaborative-pour-booster-votre-equipe-de-developpement-bk0</link>
      <guid>https://dev.to/vincent-delmotte/le-mob-programming-une-approche-collaborative-pour-booster-votre-equipe-de-developpement-bk0</guid>
      <description>&lt;p&gt;J’ai toujours aimé travailler en équipe. J’y prends beaucoup de plaisir et j’aime le lot de challenge que cela implique. &lt;/p&gt;

&lt;p&gt;Il y a trois ans, j’entendais pour la première fois le mot “mob programming”. Ce gros mot intimidant qui semble provenir tout droit d’un film d’extra-terrestres. &lt;/p&gt;

&lt;p&gt;En réalité, cette pratique n’a rien d’extra-terrestre. C’est tout le contraire même, le mob programming est centré sur les humains. &lt;/p&gt;

&lt;p&gt;Piqué par la curiosité, je me suis lancé dans la compréhension et dans l’expérimentation de cette pratique qui ne fait pas l’unanimité parmi les développeurs. &lt;/p&gt;

&lt;p&gt;Je vous propose dans cet article ma vision du mob programming. Je vous donnerai quelques conseils et les pièges à éviter pour pouvoir obtenir les bénéfices de cette pratique !&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu’est-ce que le mob programming ?
&lt;/h2&gt;

&lt;p&gt;Commençons par une définition simple. Le mob programming, c’est un groupe de personnes travaillant dans la &lt;strong&gt;même pièce&lt;/strong&gt;, sur &lt;strong&gt;un même ordinateur&lt;/strong&gt;, sur &lt;strong&gt;un même sujet&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment organiser une session de mob programming ?
&lt;/h2&gt;

&lt;p&gt;Organiser une session de mob programming, ce n’est vraiment pas difficile, voici ce qu’il vous faut :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deux personnes volontaires ou plus,&lt;/li&gt;
&lt;li&gt;une chaise confortable par personne&lt;/li&gt;
&lt;li&gt;un seul clavier&lt;/li&gt;
&lt;li&gt;au moins un écran&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà le tour est joué, vous avez votre configuration minimale pour mener à bien votre première session de mob, mais laissez-moi vous donner quelques conseils supplémentaires pour rendre l’expérience encore plus agréable. &lt;/p&gt;

&lt;p&gt;Conseil n°1&lt;/p&gt;

&lt;p&gt;Trouvez un écran assez grand pour que tout le monde puisse voir correctement le code. Il est désagréable de devoir plisser les yeux ou se tordre la nuque pour apercevoir le code.&lt;/p&gt;

&lt;p&gt;Conseil n°2&lt;/p&gt;

&lt;p&gt;Ajouter un tableau blanc et des post-it pour faciliter les échanges et les moments de réflexion collectifs.&lt;/p&gt;

&lt;p&gt;Conseil n°3 &lt;/p&gt;

&lt;p&gt;Trouvez une salle calme dans laquelle les membres peuvent s’exprimer au volume sonore souhaité sans déranger leurs collègues. Il n’y a rien de pire que de surenchérir sur le volume sonore dans un open space et finir la journée avec une migraine.&lt;/p&gt;

&lt;p&gt;Conseil n°4&lt;/p&gt;

&lt;p&gt;Trouvez un endroit où chacun peut se déplacer librement et se sentir à l’aise. &lt;/p&gt;

&lt;p&gt;Le but vous l’aurez compris, c’est de créer un environnement calme, propice à la collaboration, dans lequel chacun se sent bien et peux s’exprimer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les rôles
&lt;/h2&gt;

&lt;p&gt;Il y a deux rôles principaux lors d’une session de mob programming, le conducteur et les les navigateurs.&lt;/p&gt;

&lt;p&gt;Le &lt;strong&gt;conducteur,&lt;/strong&gt; c’est la personne qui a le clavier. Il va écrire l’ensemble des idées de ses collègues sur l’ordinateur. Dans la philosophie mob, le conducteur ne donne pas ses idées, il pose plutôt des questions pour comprendre ce que les autres lui demandent d’écrire.&lt;/p&gt;

&lt;p&gt;Les &lt;strong&gt;navigateurs&lt;/strong&gt; quant à eux donnent les idées et les instructions au conducteur. Les navigateurs brainstorm entre eux pour trouver des idées et des solutions aux problèmes qu’ils essaient de résoudre. Parfois, on retrouve parmi les navigateurs une personne responsable de trancher afin d’éviter les débat à rallonge. Son rôle est de recentrer l’équipe sur la cible, c’est le rabat-joie du groupe !&lt;/p&gt;

&lt;h2&gt;
  
  
  Les règles
&lt;/h2&gt;

&lt;p&gt;Les règles du mob sont assez simples. Les rôles changent toutes les 5 minutes ce qui permet à chacun de s’exprimer ou de pianoter sur le clavier. &lt;/p&gt;

&lt;p&gt;De mon expérience, je préfère me dire que chaque équipe est différente et que les règles sont faites pour être adaptées. &lt;/p&gt;

&lt;p&gt;N’hésitez pas à considérer le chronomètre comme un indicateur afin d’éviter de passer toute la session dans la même configuration. &lt;/p&gt;

&lt;p&gt;Personnellement, j’aime donner la parole au conducteur dans certaines situations.&lt;/p&gt;

&lt;p&gt;Ne perdez pas de vue que le mob, comme toute méthodologie ou pratique ne vaut rien si elle n’est pas adaptée à votre organisation. &lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi faire du Mob programming ?
&lt;/h2&gt;

&lt;p&gt;La pratique du mob programming apporte de nombreux avantages. Voici les raisons, qui selon moi, font du mob programming une bonne pratique.&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - Améliorer le partage de connaissance
&lt;/h3&gt;

&lt;p&gt;Pour commencer, le mob favorise le partage de connaissance au sein d’une équipe. &lt;/p&gt;

&lt;p&gt;Voici les deux niveaux de connaissance : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les connaissances métier : le jargon du produit sur lequel vous travaillez, les habitudes des clients qui utilisent le produit …&lt;/li&gt;
&lt;li&gt;Les connaissances techniques : tout le monde n’a pas les mêmes compétences, les mêmes expériences ou encore les mêmes sensibilités vis à vis du code. Il est donc très enrichissant de confronter différentes visions et pratiques au sein d’une équipe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J’ai eu la chance dans ma carrière d’avoir un mentor pendant mon alternance. J’ai bénéficié du temps et de l’expérience d’une personne plus expérimentée que moi qui m’a fait des retours et m’a aiguillé afin d’éviter les pièges sur le chemin. Ce processus m’a permis de monter très rapidement en compétences. &lt;/p&gt;

&lt;p&gt;Le mob programming permet de bénéficier des plus expérimentés et de prodiguer des conseils aux plus novices.  &lt;/p&gt;

&lt;h3&gt;
  
  
  2 - Éviter les sorties de route
&lt;/h3&gt;

&lt;p&gt;Lorsqu’on développe tout seul dans son coin et que tout devient flou, il est facile de tomber dans une spirale infernale. Parfois, une vision extérieure évite de longues heures de frustration à tourner en rond. &lt;/p&gt;

&lt;p&gt;Faut-il choisir la solution a ou la solution b ? Faut-il passer à autre chose et revenir sur ça plus tard ? Faut-il faire un test unitaire ou un test d’intégration ? Est-ce que ces questions sont pertinentes pour résoudre mon problème ? Tant de questions qui seront plus faciles à résoudre si on a le point de vue de plusieurs personnes. &lt;/p&gt;

&lt;p&gt;L’essence de cette pratique repose sur l’intelligence collective. C’est la diversité des points de vue qui permet d’obtenir de la justesse dans ce que l’on fait.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 - Solidifier les liens, apporter du sens et accroitre le bonheur
&lt;/h3&gt;

&lt;p&gt;En tant que développeur, on connait tous le soulagement de partager la résolution d’un bug pénible avec un collègue. Vous galérez, mais vous galérez ensemble ! Puis tout à coup, vous changez une ligne de code et le code compile ! Eurêka, le problème est résolu, place à la sécrétion de dopamine dans votre cerveau. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La joie partagée est une double joie ; la peine partagée est une demi-peine - Jacques Deval&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cette citation retranscrit très bien les bénéfices prodigués par le mob programming.&lt;/p&gt;

&lt;p&gt;Partager les moments difficiles permet de diminuer la charge mentale, qui en tant que développeur est déjà bien élevée.&lt;/p&gt;

&lt;p&gt;On dit souvent que c’est dans l’échec et l’adversité que l’on apprend. Et bien ici, c’est l’occasion d’en apprendre d’avantage sur vous même mais également sur les différents membres de l’équipe, de créer une cohésion et d’avancer ensemble. &lt;/p&gt;

&lt;p&gt;Ce troisième point est pour moi la raison d’être du mob programming, c’est de placer les humains au centre du travail de développeur. &lt;/p&gt;

&lt;p&gt;Quoi de mieux que de créer du lien avec ses collègues, se sentir utile, soutenu et reconnu par le groupe. Ne serait-ce pas là la clé du bonheur au travail ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Les challenges
&lt;/h2&gt;

&lt;p&gt;On ne va pas se mentir, à ce moment de l’article vous vous dites certainement que c’est trop beau pour être vrai. En effet, si le mob programming est très bénéfique lorsqu’il est pratiqué dans dans une bonne configuration, il peut présenter son lot de challenge.&lt;/p&gt;

&lt;p&gt;Voici les obstacles sur lesquels vous pouvez vous heurter en pratiquant le mob programming.&lt;/p&gt;

&lt;h3&gt;
  
  
  L’ego du développeur
&lt;/h3&gt;

&lt;p&gt;L’ennemi public numéro 1 quand il s’agit de mob programming, c’est l’ego du développeur. &lt;/p&gt;

&lt;p&gt;Qu’est-ce que c’est l’ego du développeur ? &lt;/p&gt;

&lt;p&gt;Je l’explique pour nos amis qui ne seraient pas développeur et qui lisent cet article. L’ego du développeur c’est le fait de ne pas accepter les remarques et critiques sur le code que vous avez produit en tant que développeur. Je ne saurai pas l’expliquer mais tous les développeurs l’on subi au moins une fois dans leur carrière. On dirait que le code est une sorte de prolongement du développeur. &lt;/p&gt;

&lt;p&gt;L’égo du développeur se soigne en exposant progressivement la personne à des &lt;strong&gt;retours&lt;/strong&gt; &lt;strong&gt;constructifs&lt;/strong&gt; de son code. Il est important de faire cela dans un climat de &lt;strong&gt;bienveillance&lt;/strong&gt; en mettant la personne en &lt;strong&gt;confiance&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Il faudra expliquer à la personne que ces retours n’ont qu’un seul objectif : assurer la bonne réalisation du projet.&lt;/p&gt;

&lt;p&gt;Être en phase avec le fait de faire des erreurs et accepter la critique permet  en tant que développeur de se libérer d’un grand fardeau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accorder les violons
&lt;/h3&gt;

&lt;p&gt;Prenons un orchestre. Chaque instrument a ses propres caractéristiques et produit un son qui lui est propre. Chaque instrument peut produire une jolie mélodie de façon isolée. Prenez tous ces instruments et faites les jouer sans chef d’orchestre. Il est très probable que le son produit soit chaotique. &lt;/p&gt;

&lt;p&gt;Maintenant, prenez tous ces instruments, accordez les et faites les jouer en rythme, au bon niveau sonore pour que chacun d’entre eux viennent apporter la touche qu’il faut à cette magnifique mélodie collective. Vous entendez ce son doux pour vos oreilles ?&lt;/p&gt;

&lt;p&gt;Et bien figurez-vous qu’un développeur c’est un peu comme un instrument et l’équipe de développement un peu comme l’orchestre. Chacun a des compétences, chacun peut produire un résultat de façon isolés mais si vous arrivez à combiner toutes ces compétences et vous faites en sorte que chacun puisse collaborer pour accomplir un but commun, alors le résultat va être grandiose ! &lt;/p&gt;

&lt;p&gt;Trouver votre chef d’orchestre, cette personne qui parvient à guider l’équipe afin de tirer ce qui a de meilleur en chacun et ainsi à réaliser de grandes choses !&lt;/p&gt;

&lt;h3&gt;
  
  
  Oser
&lt;/h3&gt;

&lt;p&gt;Selon les caractères, les différentes personnes du groupe peuvent avoir des peurs différentes. &lt;/p&gt;

&lt;p&gt;Certains n’arriveront pas à s’exprimer devant le reste du groupe par peur de manquer de pertinence. D’autres personnes auront peur d’échouer en public. &lt;/p&gt;

&lt;p&gt;Il ne faut pas oublier que l’échec n’est pas très bien vu dans notre société ou toute la lumière est mise sur les success stories. Pour résoudre ce problème, je n’ai qu’une solution : la &lt;strong&gt;bienveillance&lt;/strong&gt; et le &lt;strong&gt;temps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Laissez moi vous vous rappeler quelque chose d’important. Ce qui fait la force et la beauté du mob programming c’est la diversité des points de vue et des expériences. Chacun est différent et a quelque chose à apporter. &lt;/p&gt;

&lt;p&gt;Osez vous exprimer devant un groupe, osez échouer car la pire chose qui puisse vous arriver c’est d’oser réussir. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Pour conclure, je dirais que le mob programming ça n’est pas magique et que ce n’est pas fait pour tout le monde. &lt;/p&gt;

&lt;p&gt;Certaines personnes ont besoin d’être seule pour trouver la concentration nécessaire à l’accomplissement de leurs tâches. &lt;/p&gt;

&lt;p&gt;Si vous sentez que la façon dont vous travaillez vous convient, continuez ainsi ! On ne change pas une équipe qui gagne. &lt;/p&gt;

&lt;p&gt;Par contre, si vous sentez que vous n’êtes pas pleinement épanouis et que vous cherchez du sens dans ce que vous faites, que vous aimez travailler en équipe alors foncez !&lt;/p&gt;

&lt;p&gt;Attention toutefois à ne pas vous prendre les pieds dans les racines qui jonchent le chemin.&lt;/p&gt;

&lt;p&gt;Empathie, patience et bienveillance, voilà les maîtres mots du mob programming. Je vous souhaite de vous épanouir dans cette pratique.&lt;/p&gt;

&lt;p&gt;J’espère que l’article vous aura plu. Je serais heureux d’avoir votre avis sur le sujet, alors n’hésitez pas !&lt;/p&gt;

</description>
      <category>teamwork</category>
      <category>mobprogramming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Jarvis, génère moi un schéma de base de données</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Thu, 22 Aug 2024 12:51:08 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/jarvis-genere-moi-un-schema-de-base-de-donnees-1bjd</link>
      <guid>https://dev.to/vincent-delmotte/jarvis-genere-moi-un-schema-de-base-de-donnees-1bjd</guid>
      <description>&lt;p&gt;Petit disclaimer avant de commencer ce post. L’IA est un outil très puissant d’assistance mais pour le moment nous ne pouvons pas lui déléguer l’entière responsabilité du travail. Alors je vous incite fortement à vérifier tout le contenu généré par une IA. Bonne lecture !&lt;/p&gt;

&lt;p&gt;Je viens de découvrir un outil très intéressant qui peut vous assister dans la création de vos schémas de base de données Postgres. Cet outil c’est &lt;strong&gt;postgres.new&lt;/strong&gt; ! &lt;/p&gt;

&lt;p&gt;Voici le lien vers le repository du projet &lt;a href="https://github.com/supabase-community/postgres-newet" rel="noopener noreferrer"&gt;https://github.com/supabase-community/postgres-newet&lt;/a&gt; le lien vers l’interface &lt;a href="https://postgres.new/" rel="noopener noreferrer"&gt;https://postgres.new/&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  postgres.new c’est quoi ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;postgres.new&lt;/strong&gt; est un outil &lt;strong&gt;gratuit&lt;/strong&gt; de création de base de données PostgreSQL par &lt;strong&gt;IA&lt;/strong&gt; développé par &lt;strong&gt;Supabase&lt;/strong&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%2Fuploads%2Farticles%2Fq8mixvlotnybxybxti59.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%2Fq8mixvlotnybxybxti59.png" alt="Supabase logo" width="800" height="193"&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%2Fuploads%2Farticles%2F8bwzumusiuzdu99jgowc.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%2F8bwzumusiuzdu99jgowc.png" alt="PostgreSQL logo" width="610" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’interface ressemble à tous les assistant d’IA avec la liste des contextes de génération à gauche, au milieu le contenu qui est généré et à droite la barre de prompt permettant de faire des requêtes.&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%2Fuploads%2Farticles%2Fw6av8p4qnqmnu1bgag1c.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%2Fw6av8p4qnqmnu1bgag1c.png" alt="Interface de postgres.new" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment ça marche sous le capot ?
&lt;/h2&gt;

&lt;p&gt;PostgresNew peut fonctionner uniquement dans le navigateur car il est construit par-dessus PGLite &lt;a href="https://pglite.dev/" rel="noopener noreferrer"&gt;https://pglite.dev/&lt;/a&gt; (développé par &lt;strong&gt;ElectricSQL&lt;/strong&gt;) qui est une version Web Assembly de Postgres offrant une compatibilité navigateur web.&lt;/p&gt;

&lt;p&gt;Ainsi, il est possible de créer une base de données Postgres, faire des requêtes et stocker la base de données, tout cela au sein du navigateur. Par défaut, la base est stocker via l’indexedDB du navigateur permettant de persister les données au rafraichissement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quelles sont les fonctionnalités ?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Importer des données
&lt;/h3&gt;

&lt;p&gt;Il est possible de drag and drop un fichier CSV dans la console de prompt. L’agent va reconnaitre le fichier, l’importer et créer une table en analysant le contenu du fichier. &lt;/p&gt;

&lt;p&gt;Voici un exemple de fichier CSV représentant le taux de natalité en fonction de l’âge des femmes sur la période 2005 / 2022.&lt;/p&gt;

&lt;p&gt;Voici un extrait du fichier CSV :&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%2Fuploads%2Farticles%2Fxb6e2dkj4t88uwel1nn7.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%2Fxb6e2dkj4t88uwel1nn7.png" alt="extrait du fichier csv" width="402" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et voici la table que postgres.new a généré : &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%2Fuploads%2Farticles%2F0v3uingm5uu3zoua1rfm.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%2F0v3uingm5uu3zoua1rfm.png" alt="Table births_by_mothers_age" width="688" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le script de migration qui permet de créer la table est accessible dans l’onglet &lt;code&gt;Migrations&lt;/code&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%2Fuploads%2Farticles%2F6x7vo7rveh8tkw41kqht.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%2F6x7vo7rveh8tkw41kqht.png" alt="script de migration" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Demander des informations sur le jeu de données
&lt;/h3&gt;

&lt;p&gt;Il est possible de faire des requêtes en s’adressant directement à l’agent. Par exemple, je demande la catégorie d’âge qui a le plus d’enfant, l’agent est capable de répondre que c’est la tranche des 30/34ans qui est la plus propice aux naissances.&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%2Fuploads%2Farticles%2Fdgtuf0qb71ws2aa9x2u0.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%2Fdgtuf0qb71ws2aa9x2u0.png" alt="requête de données" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Représenter des données
&lt;/h3&gt;

&lt;p&gt;Il est possible de demander une représentation graphique des données. Ici, je demande de me représenter les 4 groupes d’âge qui ont le plus d’enfant. L’agent me représente dans un diagramme à barre les données que je lui demande. C’est assez bluffant ! &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%2Fuploads%2Farticles%2Fx537wtzwxgf98ou6tb3t.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%2Fx537wtzwxgf98ou6tb3t.png" alt="diagramme barre qui représente les données" width="800" height="879"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On peut lui demander d’afficher les mêmes données dans un diagramme circulaire.&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%2Fuploads%2Farticles%2Fm1jut8hcwdrxgsb208tj.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%2Fm1jut8hcwdrxgsb208tj.png" alt="diagramme circulaire qui représente les données" width="800" height="891"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Créer un schéma from scratch
&lt;/h3&gt;

&lt;p&gt;Il est possible de décrire un besoin ou une fonctionnalité et l’agent se charge de créer un schéma capable de répondre à la demande. &lt;/p&gt;

&lt;p&gt;Par exemple si je lui demande de réaliser un schéma qui clone une application telle que Twitter, l’agent me créer le schéma suivant : &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%2Fuploads%2Farticles%2Fxwn51nellm9fsdwt0344.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%2Fxwn51nellm9fsdwt0344.png" alt="Schéma de base de données MVP Twitter" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On a également une description de toutes les tables.&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%2Fuploads%2Farticles%2Fwzj2c2jc6fw5hzqeiqdm.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%2Fwzj2c2jc6fw5hzqeiqdm.png" alt="Description des tables générées" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ici, on a bien un schéma minimal permettant de reproduire le comportement du MVP de Twitter (ou X).&lt;/p&gt;

&lt;p&gt;Voici à quoi ressemble le script de migration :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Migrations will appear here as you chat with AI&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="k"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;password_hash&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="n"&gt;bio&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="k"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;followers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;follower_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;followee_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;follower_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;followee_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;likes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;tweet_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tweet_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;retweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;tweet_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tweet_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;-- Migrations will appear here as you chat with AI&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="k"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;unique&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;password_hash&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="n"&gt;bio&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="k"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;followers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;follower_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;followee_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;follower_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;followee_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;likes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;tweet_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tweet_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;retweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;tweet_id&lt;/span&gt; &lt;span class="nb"&gt;bigint&lt;/span&gt; &lt;span class="k"&gt;references&lt;/span&gt; &lt;span class="n"&gt;tweets&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="k"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="k"&gt;zone&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tweet_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modifier le schéma généré
&lt;/h3&gt;

&lt;p&gt;Il est possible de modifier le schéma généré en demandant directement à l’agent via la console de prompt, soit en passant par l’interface qui permet quelque manipulation.&lt;/p&gt;

&lt;p&gt;Admettons que je veuille que la &lt;strong&gt;bio&lt;/strong&gt; de la table &lt;strong&gt;users&lt;/strong&gt; ne soit jamais nul, alors je peux cliquer sur la colonne et sélectionner “rendre non nul”.&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%2Fuploads%2Farticles%2Fbys7allrpo3m7zq3nvs8.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%2Fbys7allrpo3m7zq3nvs8.png" alt="Menu d'action sur une colonne" width="800" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’agent nous informe que la demande à bien été prise en compte.&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%2Fuploads%2Farticles%2Fwdrd7qvb8zixlnazdl47.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%2Fwdrd7qvb8zixlnazdl47.png" alt="Prise en compte de la demande par l'agent" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les nouvelles lignes permettant la migration sont ajoutées dans le script de migration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;alter&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;alter&lt;/span&gt; &lt;span class="k"&gt;column&lt;/span&gt; &lt;span class="n"&gt;bio&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ce post s’appuie sur la vidéo de démonstration de postgres.new. Je vous conseille d’aller la regarder ! &lt;a href="https://www.youtube.com/watch?v=ooWaPVvljlU" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ooWaPVvljlU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On commence à banaliser la capacité des IA mais aurait-on cru que tous ces progrès arriveraient si vite ? Personnellement ça me bluff! Toutefois comme je l’ai dit en introduction, il est primordial de vérifier un minimum ce que l’IA fait.&lt;/p&gt;

&lt;p&gt;Pour résumé, PostgresNew c’est un assistant de &lt;strong&gt;création&lt;/strong&gt; et de &lt;strong&gt;manipulation&lt;/strong&gt; de &lt;strong&gt;base de données Postgres&lt;/strong&gt;. Il permet de gagner pas mal de temps pour la construction ou l’analyse de données. &lt;/p&gt;

&lt;p&gt;De mon côté, je vais continuer de jouer avec et j’ai hâte de voir le futur de ce projet !&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Comment j'automatise l'utilisation Conventional Commits ?</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Wed, 21 Aug 2024 14:44:09 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/comment-jautomatise-lutilisation-conventional-commits--29ea</link>
      <guid>https://dev.to/vincent-delmotte/comment-jautomatise-lutilisation-conventional-commits--29ea</guid>
      <description>&lt;p&gt;Suite à mon dernier post sur le conventional commits, je vous explique comment j’automatise l’utilisation de conventional commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commitlint
&lt;/h2&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%2Fuploads%2Farticles%2Fiu7frjuycmy3zp5rim11.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%2Fiu7frjuycmy3zp5rim11.png" alt="Logo de commitlint" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour commencer nous avons l’outil &lt;strong&gt;Commitlint&lt;/strong&gt; qui permet de faire du &lt;strong&gt;linting&lt;/strong&gt; sur les &lt;strong&gt;message de commit&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Le principe est de remonter toutes les erreurs de format afin d’aider le développeur à rédiger un message de commit respectant le conventional commit.&lt;/p&gt;

&lt;p&gt;Pour rendre le lint automatique, je couple &lt;strong&gt;Commitlint&lt;/strong&gt; à &lt;strong&gt;husky&lt;/strong&gt; afin de lancer la commande de lint à chaque fois qu’un développeur effectue un commit.&lt;/p&gt;

&lt;p&gt;Pour celle et ceux qui ne seront pas familier avec husky voici un article qui présente l’outil : &lt;a href="https://medium.com/@saravanan109587/husky-the-secret-weapon-for-developers-who-want-to-write-better-code-3289b06ee4d0#:~:text=Husky%20is%20a%20tool%20that,your%20code%20and%20prevent%20errors" rel="noopener noreferrer"&gt;https://medium.com/@saravanan109587/husky-the-secret-weapon-for-developers-who-want-to-write-better-code-3289b06ee4d0#:~:text=Husky is a tool that,your code and prevent errors&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Voici le lien vers la documentation de commitlint : &lt;a href="https://commitlint.js.org/" rel="noopener noreferrer"&gt;https://commitlint.js.org/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Commitlint CLI (Command Line Interface)
&lt;/h2&gt;

&lt;p&gt;Il est possible d’utiliser un &lt;strong&gt;CLI&lt;/strong&gt; avec &lt;strong&gt;commitlint&lt;/strong&gt; en installant le package NPM suivant : &lt;a href="https://www.npmjs.com/package/@commitlint/cli" rel="noopener noreferrer"&gt;@commitlint/cli&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;La CLI permet de donner un template aux développeurs afin qu’ils ne doivent pas se référer à la documentation à chaque fois que ces derniers rédigent un message de commit.&lt;/p&gt;

&lt;p&gt;Pour obtenir la CLI il suffit d’exécuter la commande suivante une fois le package installé&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run cz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici à quoi ressemble la CLI :&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%2Fuploads%2Farticles%2Fm32cq8k78qeid0292gc4.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%2Fm32cq8k78qeid0292gc4.png" alt="Première étape de la CLI" width="800" height="130"&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%2Fuploads%2Farticles%2Fr1bpxunzjnv0gmhpsk5c.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%2Fr1bpxunzjnv0gmhpsk5c.png" alt="Les autres étapes de la CLI" width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personnellement, je passe par un script npm me permettant de lancer la CLI de la façon suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Outil pour le pair/mob programing
&lt;/h2&gt;

&lt;p&gt;Étant un fervent partisan du pair/mob progaming, j’utilise le wrapper &lt;a href="https://www.npmjs.com/package/cz-conventional-changelog-coauthors" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/cz-conventional-changelog-coauthors&lt;/a&gt; qui me permet d’avoir la possibilité d’ajouter des co-auteur à mes commits.&lt;/p&gt;

&lt;p&gt;Pour cela, il suffit d’ajouter un fichier de configuration .czrc à la racine de votre projet puis renseigner l’ensemble des nom/prénom et adresse mail des différents membres de l’équipe. &lt;/p&gt;

&lt;p&gt;Ainsi à chaque fois que vous faites un commit, vous pouvez facilement ajouter tous les membres ayant participé au développement en les sélectionnant dans la CLI de commit.&lt;/p&gt;

&lt;p&gt;Voici les lignes qui sont ajoutées dans la CLI &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%2Fuploads%2Farticles%2F8xkewqy8sm7r3hwt62x2.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%2F8xkewqy8sm7r3hwt62x2.png" alt="étape de co-auteur de la CLI" width="800" height="56"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici un exemple de mon fichier de configuration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// .czrc
{
    "path": "cz-conventional-changelog-coauthors",
    "defaultCoAuthors": [
        {
            "name": "Elon Musk",
            "email": "elon.musk@spacex.com"
        },
        {
            "name": "Jeff Bezos",
            "email": "jeff.bezos@amazon.com"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Voilà les différents outils que j’utilise pour respecter le conventional commits sans le moindre effort. N’hésitez pas à me partager vos outils permettant de respecter le conventional commits si vous en utilisez d’autres que moi !&lt;/p&gt;

</description>
      <category>dx</category>
    </item>
    <item>
      <title>Retrouvez tous vos commits avec le Conventional Commits</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Tue, 20 Aug 2024 16:01:48 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/retrouvez-tous-vos-commits-avec-le-conventional-commits-39g1</link>
      <guid>https://dev.to/vincent-delmotte/retrouvez-tous-vos-commits-avec-le-conventional-commits-39g1</guid>
      <description>&lt;p&gt;En tant que développeur, on a tous un jour rédigé un commit de la sorte :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La plupart du temps, pas de soucis, ces commits tombent dans les tréfonds de l’historique GIT et personne ne les reverra jamais. Jusqu’au jour ou la prod est en feu et qu’il faut retrouver le code qui provoque cette pagaille. Aie, c’est pas pratique de retrouver du code quand tous les commits sont mal nommé.&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%2Fuploads%2Farticles%2F6es4kenmxtrxicvddh25.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%2F6es4kenmxtrxicvddh25.png" alt="un homme devant un pc en feu" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aujourd’hui, je vais vous donner une solution au problème de nommage des commits que j’utilise quotidiennement et qui me facilite la vie !&lt;/p&gt;

&lt;h2&gt;
  
  
  Conventional commits c’est quoi ?
&lt;/h2&gt;

&lt;p&gt;Conventional commits comme son nom l’indique est une convention qui permet de structurer la rédaction des commits GIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment ça marche ?
&lt;/h2&gt;

&lt;p&gt;Voici à quoi ressemble un commit suivant cette convention&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;(&lt;/span&gt;scope&lt;span class="o"&gt;)&lt;/span&gt;: &amp;lt;description&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Les types
&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;type&lt;/strong&gt; permet de spécifier globalement les modifications qui ont été apportées. Voici la liste des types possibles :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;feat : ajout d’une fonctionnalité&lt;/li&gt;
&lt;li&gt;fix : fixe d’un bug&lt;/li&gt;
&lt;li&gt;docs : changement de la documentation&lt;/li&gt;
&lt;li&gt;style : changement qui n’affecte pas le sens du code comme l’ajout d’une tabulation ou d’un point-virgule&lt;/li&gt;
&lt;li&gt;refactor : un changement qui n’ajoute pas de fonctionnalité et qui ne fixe pas de bug&lt;/li&gt;
&lt;li&gt;perf : amélioration des performances&lt;/li&gt;
&lt;li&gt;test : ajout d’un test ou correction d’un test existant&lt;/li&gt;
&lt;li&gt;build : changement qui affecte le système de build ou les dépendances&lt;/li&gt;
&lt;li&gt;ci : changement qui affecte la fichier de configuration ou les scripts de CI&lt;/li&gt;
&lt;li&gt;chore : autres changements que src et les tests&lt;/li&gt;
&lt;li&gt;revert : enlève un commit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Le scope
&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;scope&lt;/strong&gt; est une &lt;strong&gt;partie optionnel&lt;/strong&gt; du message de commit. Il permet de spécifier l’endroit du code qui a été modifié. Cela peut être le nom de la fonctionnalité ou le nom du dossier dans lequel les fichiers sont modifiés. &lt;/p&gt;

&lt;p&gt;En général, c’est grâce au scope que l’on peut facilement retrouver une modification de code qui nous intéresse.&lt;/p&gt;

&lt;p&gt;On peut ajouter un point d’exclamation juste après le scope pour indiquer que les changements apportés par le commit introduisent un breaking change.&lt;/p&gt;

&lt;h3&gt;
  
  
  La description
&lt;/h3&gt;

&lt;p&gt;La &lt;strong&gt;description&lt;/strong&gt; a pour but de donner des informations complémentaires du scope. En lisant la description, le développeur doit saisir le sens global du changement apporté par le commit. &lt;/p&gt;

&lt;h2&gt;
  
  
  Exemples
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;feat: allow provided config object to extend other configs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;feat&lt;span class="o"&gt;(&lt;/span&gt;api&lt;span class="o"&gt;)!&lt;/span&gt;: send an email to the customer when a product is shipped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici la documentation officielle de conventional commits&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;https://www.conventionalcommits.org/en/v1.0.0/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dx</category>
    </item>
    <item>
      <title>Les composants d’un Navigateur Web</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Tue, 13 Aug 2024 17:39:21 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/les-composants-dun-navigateur-web-opg</link>
      <guid>https://dev.to/vincent-delmotte/les-composants-dun-navigateur-web-opg</guid>
      <description>&lt;h2&gt;
  
  
  Qu’est ce qu’un navigateur web ?
&lt;/h2&gt;

&lt;p&gt;Un navigateur web c’est un logiciel qui permet aux utilisateurs d'accéder et de visualiser le contenu du World Wide Web. Sa fonction principale est de localiser et de récupérer des pages web, des images, des vidéos, des documents et d'autres fichiers à partir de serveurs et de les afficher.&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%2Fuploads%2Farticles%2F245a6eisz0gblj5r1hb6.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%2F245a6eisz0gblj5r1hb6.png" alt="Ordinateur devant la terre"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Les composants d’un navigateur web
&lt;/h2&gt;

&lt;p&gt;Un navigateur web est constitué de plusieurs composants essentiels à son bon fonctionnement. Voici un schéma des différents composants d’un navigateur web.&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%2Fuploads%2Farticles%2Fvs9qwthelo70tuw721m2.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%2Fvs9qwthelo70tuw721m2.png" alt="Schéma des composants d'un navigateur web"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Interface utilisateur (User interface)
&lt;/h3&gt;

&lt;p&gt;L’interface utilisateur permet à l’utilisateur d’effectuer les tâches qu’il souhaite. C’est au travers de cette interface que l’utilisateur accède à l’ensemble des fonctionnalités du navigateur web tels que la barre d’adresse, les boutons de navigation d’historique, les différents menus de paramétrage et bien d’autres.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moteur du navigateur (Browser Engine)
&lt;/h3&gt;

&lt;p&gt;Le moteur de navigateur est le coeur de tous les navigateurs. C’est l’intermédiaire entre l’interface utilisateur et le moteur de rendu. Il récupère l’ensemble des événements utilisateurs et s’assure de les transmettre au moteur de rendu. &lt;/p&gt;

&lt;p&gt;C’est un élément très important à optimiser car il influera grandement sur la vitesse de chargement des pages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moteur de rendu (Rendering Engine)
&lt;/h3&gt;

&lt;p&gt;La première mission du moteur de rendu est de créer le &lt;strong&gt;DOM (Document Object Model)&lt;/strong&gt; en parsant les fichiers &lt;strong&gt;HTML&lt;/strong&gt;. Ce DOM représente la structure de la page web.&lt;/p&gt;

&lt;p&gt;La deuxième mission du moteur de rendu est de créer l’arbre de rendu (rendering tree) en associant le &lt;strong&gt;style&lt;/strong&gt; (issue des fichiers CSS) à chaque élément du &lt;strong&gt;DOM.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le moteur de rendu est également en charge de l’&lt;strong&gt;exécution du JavaScript&lt;/strong&gt; interprété au préalable par l’interpréteur JavaScript.&lt;/p&gt;

&lt;p&gt;Chaque navigateur à son propre moteur de rendu :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Chrome / Opera v.15+: &lt;strong&gt;Blink&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Internet Explorer: &lt;strong&gt;Trident&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mozilla Firefox: &lt;strong&gt;Gecko&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Chrome iOS / Safari: &lt;strong&gt;WebKit&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Réseau (Networking)
&lt;/h3&gt;

&lt;p&gt;La brique réseau est en charge des &lt;strong&gt;appels réseaux&lt;/strong&gt; utilisant les protocoles HTTP / FTP. En effet, pour constituer une page web, il faut récupérer l’ensemble des ressources nécessaires à l’affichage et l’utilisation de cette dernière comme les fichiers HTML, CSS, les scripts JS, les images, les vidéos et autres ressources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interpréter Javascript (JS interpreter)
&lt;/h3&gt;

&lt;p&gt;L’interpréteur de JavaScript est responsable de parser et interpréter les fichiers JavaScript d’une page. Le tout est ensuite transmis au moteur de rendu qui affichera le contenu.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI backend
&lt;/h3&gt;

&lt;p&gt;Ce composant utilise les méthodes d'interface utilisateur du système d'exploitation sous-jacent. Il est principalement utilisé pour dessiner des widgets de base comme des fenêtres et combo box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistence de donnée (Data Persistance)
&lt;/h3&gt;

&lt;p&gt;Un navigateur à besoin de persister des données pour certaines fonctionnalités. On peut citer la pile d’historique qui sauvegarde les URL des pages visitées. On peut également vouloir retenir des informations entre différentes navigations sur une page web avec l’utilisation du local storage ou des cookies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Naïvement, on pourrait se dire qu’un navigateur ne fait qu’afficher des pages webs, mais en réalité, c’est bien plus complexe. Un navigateur web est composé de multiples éléments dont chacun d’entre eux assure une mission nécessaire dans l’unique but d’afficher des pages web. &lt;/p&gt;

&lt;p&gt;Le navigateur récupère des fichiers, les parse, les assemble, affiche les pages, stock des données tout cela dans le but de fournir une expérience d’internet la plus fluide possible.&lt;/p&gt;

&lt;p&gt;Si internet est aujourd’hui autant utilisé, c’est en partie grâce aux navigateurs web qui ont rendu internet aussi accessible.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
    </item>
    <item>
      <title>HTTP : connaissez-vous vraiment vos fondamentaux ?</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Mon, 12 Aug 2024 16:10:36 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/quest-ce-que-cest-http--h0h</link>
      <guid>https://dev.to/vincent-delmotte/quest-ce-que-cest-http--h0h</guid>
      <description>&lt;h2&gt;
  
  
  Un peu d’histoire
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTP (HyperText Transfer Protocol)&lt;/strong&gt; est un protocole de communication client-serveur développé pour le &lt;strong&gt;World Wide Web&lt;/strong&gt; par &lt;strong&gt;Tim Berners Lee&lt;/strong&gt; et son équipe entre 1989 et 1991. &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%2Fuploads%2Farticles%2Fjgjcm281s9od2cq9n8k1.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%2Fjgjcm281s9od2cq9n8k1.png" alt="Tim Berners Lee devant son ordinateur" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTPS&lt;/strong&gt;, une version sécurisée de HTTP est implémentée par Netscape communications 4 ans plus tard en 1994.&lt;/p&gt;

&lt;p&gt;Ce protocole permet des échanges de fichier via le réseaux internet grâce aux protocoles réseaux &lt;strong&gt;TCP (Transmission Control Protocol)&lt;/strong&gt; et &lt;strong&gt;IP (Internet Protocol)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dans sa version initiale, HTTP ne permettait que le transport de fichier HTML. Par la suite, l’ajout de l’en-tête “Content-Type” permet de transporter d’autres types de fichier. Vous pouvez retrouver cette liste ici : &lt;a href="https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types" rel="noopener noreferrer"&gt;https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Initialement, HTTPS s’appuyait sur le protocole de sécurité &lt;strong&gt;SSL&lt;/strong&gt; &lt;strong&gt;(Secure Sockets Layer)&lt;/strong&gt; qui assure la confidentialité, l'authentification et l'intégrité des communications sur Internet. &lt;/p&gt;

&lt;p&gt;Le principe est simple, on encrypte les données afin d’éviter toutes interceptions malveillantes lors du transfert et on décrypte grâce à un certificat SSL. SSL deviendra par la suite &lt;strong&gt;TSL&lt;/strong&gt; &lt;strong&gt;(Transport Layer Security)&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;À ces débuts, HTTPS était principalement utilisé pour les sites E-Commerce, mais très vite, l’émergence d’acteur mal intentionné récoltant de nombreuses données personnelles sur Internet à accéléré le passage de la majorité des sites sur Internet à utiliser le protocol HTTPS.&lt;/p&gt;

&lt;p&gt;Le modèle qui sera majoritairement utilisé pour l’utilisation de HTTP est le modèle &lt;strong&gt;REST (Representational state transfer)&lt;/strong&gt;. Aujourd’hui la plupart des sites web exposant des données repose sur des API REST. REST c’est une façon d’utiliser HTTP, qui a permis de poser un standard sur la conception des applications web ainsi que l’exploitation des données.&lt;/p&gt;

&lt;p&gt;Si vous voulez en savoir plus sur REST, voici le papier de thèse de &lt;strong&gt;Roy Fielding&lt;/strong&gt; qui pose les fondements du standard : &lt;a href="https://ics.uci.edu/%7Efielding/pubs/dissertation/fielding_dissertation.pdf" rel="noopener noreferrer"&gt;https://ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf&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%2Fuploads%2Farticles%2Fpr14hxzmmn7s4yay12q9.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%2Fpr14hxzmmn7s4yay12q9.png" alt="Roy Fielding" width="200" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment ça marche ?
&lt;/h2&gt;

&lt;p&gt;HTTP est un protocole client serveur. Chaque requête est initiée par le client (aussi appelé agent d’utilisation) qui est la quasi totalité des cas le navigateur web.&lt;/p&gt;

&lt;p&gt;Pour afficher une page web, le navigateur va effectuer une succession de requêtes HTTP. Dans un premier temps, le navigateur récupère le document HTML de la page, s’en suit la récupération des scripts et du style (CSS). &lt;/p&gt;

&lt;p&gt;Au cours de la durée de vie de cette page, les scripts peuvent effectuer des requêtes HTTP pour récupérer du contenu supplémentaire.&lt;/p&gt;

&lt;p&gt;Les liens hypertextes sont une partie des pages web. Ils permettent de naviguer entre les différentes pages présentes sur Internet. Lorsqu’un utilisateur clique sur un lien hypertexte, le navigateur envoie une requête HTTP pour récupérer cette dernière et recommence les étapes décrites ci-dessus. &lt;/p&gt;

&lt;h3&gt;
  
  
  Communication client / serveur via HTTP
&lt;/h3&gt;

&lt;p&gt;Voici les étapes de connexion d’un client vers un serveur :&lt;/p&gt;

&lt;p&gt;1) Le client ouvre un canal de communication TCP vers le serveur.&lt;/p&gt;

&lt;p&gt;2) Il envoie un message HTTP. (Avant HTTP/2 les messages étaient lisibles par des humains, à partir de HTTP/2 les messages sont encodé en binaires les rendant illisible par un humain mais permettant de faciliter leur traitement).&lt;/p&gt;

&lt;p&gt;3) Le client reçoit une réponse HTTP du serveur et la lit.&lt;/p&gt;

&lt;p&gt;4) Le client peut soit fermer la connexion, soit réutilisé la connexion pour les requêtes suivantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Messages HTTP
&lt;/h3&gt;

&lt;p&gt;Il existe deux types de messages HTTP : les requêtes et les réponses&lt;/p&gt;

&lt;h4&gt;
  
  
  Requête
&lt;/h4&gt;

&lt;p&gt;Voici un exemple de message de requête HTTP sur l’API Pokémon&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%2Fuploads%2Farticles%2F71drh6p430fhiw1wuqd1.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%2F71drh6p430fhiw1wuqd1.png" alt="Schéma d'une requête HTTP" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici les éléments que l’on retrouve dans une requête HTTP :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un &lt;strong&gt;verbe HTTP&lt;/strong&gt; permettant d’indiquer l’action souhaité sur la ressource. Ici on a GET qui permet de récupérer une ressource du serveur.&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;URL&lt;/strong&gt; vers la ressource, ici /api/v2/pokemon/pikachu.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;version&lt;/strong&gt; du protocole HTTP, ici 1.1.&lt;/li&gt;
&lt;li&gt;(optionnel) Les &lt;strong&gt;en-têtes&lt;/strong&gt; (ou header en anglais) permettant de donner plus d’information au serveur, ici on a host.&lt;/li&gt;
&lt;li&gt;(optionnel) Un &lt;strong&gt;corps&lt;/strong&gt; (ou body en anglais) permettant de fournir des données au serveur, ici il n’y en a pas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Réponse
&lt;/h4&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%2Fuploads%2Farticles%2Fiiz8qrz6mqbjer5ivwbb.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%2Fiiz8qrz6mqbjer5ivwbb.png" alt="Schéma d'une réponse HTTP" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voici les éléments que l’on retrouve dans une réponse HTTP :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La &lt;strong&gt;version&lt;/strong&gt; du protocole HTTP, ici 1.1.&lt;/li&gt;
&lt;li&gt;Un code de statut (échec / succès), ici code 200.&lt;/li&gt;
&lt;li&gt;Un message de statut qui est une description rapide, informelle, du code de statut&lt;/li&gt;
&lt;li&gt;(optionnel) Les &lt;strong&gt;en-têtes&lt;/strong&gt;, ici on a date, cache-control et content-type.&lt;/li&gt;
&lt;li&gt;(optionnel) Un &lt;strong&gt;corps&lt;/strong&gt; contenant la ressource récupérée, ici il n’y en a pas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verbes
&lt;/h3&gt;

&lt;p&gt;HTTP définit un ensemble de verbes permettant d’indiquer l’action à réaliser.&lt;/p&gt;

&lt;p&gt;Voici la liste des verbes HTTP : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;li&gt;PUT&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;li&gt;PATCH&lt;/li&gt;
&lt;li&gt;HEAD&lt;/li&gt;
&lt;li&gt;CONNECT&lt;/li&gt;
&lt;li&gt;OPTION&lt;/li&gt;
&lt;li&gt;TRACE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici un lien qui explique chacun des verbes HTTP : &lt;a href="https://developer.mozilla.org/fr/docs/Web/HTTP/Methods" rel="noopener noreferrer"&gt;https://developer.mozilla.org/fr/docs/Web/HTTP/Methods&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code de réponse
&lt;/h3&gt;

&lt;p&gt;HTTP définit un ensemble de code de réponse permettant d’obtenir une information sur le succès ou l’échec de la requête.&lt;/p&gt;

&lt;p&gt;Il existe 5 types de réponse répartie sur 5 plages de nombres différentes : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 à 199 : réponses informatives&lt;/li&gt;
&lt;li&gt;200 à 299 : réponses de succès&lt;/li&gt;
&lt;li&gt;300 à 399 : réponses de redirection&lt;/li&gt;
&lt;li&gt;400 à 499 : erreurs du client&lt;/li&gt;
&lt;li&gt;500 à 599 : erreurs du serveur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici les codes que l’on rencontre le plus couramment :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Informations&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 Continue&lt;/li&gt;
&lt;li&gt;101 Switching Protocols&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Succès&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200 OK&lt;/li&gt;
&lt;li&gt;201 Created&lt;/li&gt;
&lt;li&gt;204 No Content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Redirection&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;301 Moved Permanently&lt;/li&gt;
&lt;li&gt;302 Found&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Erreurs du client&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;400 Bad Request&lt;/li&gt;
&lt;li&gt;401 Unauthorized&lt;/li&gt;
&lt;li&gt;403 Forbidden&lt;/li&gt;
&lt;li&gt;404 Not Found&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Erreurs du serveur&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 Internal Server Error&lt;/li&gt;
&lt;li&gt;502 Bad Gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici un lien qui explique chacun des codes de retour HTTP : &lt;a href="https://developer.mozilla.org/fr/docs/Web/HTTP/Status" rel="noopener noreferrer"&gt;https://developer.mozilla.org/fr/docs/Web/HTTP/Status&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fun fact
&lt;/h4&gt;

&lt;p&gt;Pour la petite histoire, il existe une easter egg parmi tous ces codes de réponses. Le code 418 indique “I’m not a teapot” ou en français “je ne suis pas une théière”. Malgré le fait qu’à l’origine cet ajout était une blague, il est parfois utilisé dans des applications en guise d’humour.&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%2Fuploads%2Farticles%2Frbtgehxjdx8uv2o9d0yy.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%2Frbtgehxjdx8uv2o9d0yy.png" alt="I'm not a tea pot google" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Les différentes API construites sur HTTP
&lt;/h3&gt;

&lt;p&gt;Voici une liste non-exhaustive des différentes API construites sur HTTP :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST&lt;/li&gt;
&lt;li&gt;SOAP&lt;/li&gt;
&lt;li&gt;GraphQL&lt;/li&gt;
&lt;li&gt;WebSocket&lt;/li&gt;
&lt;li&gt;Server-Sent Events (SSE)&lt;/li&gt;
&lt;li&gt;WebRTC&lt;/li&gt;
&lt;li&gt;OAuth / OpenID Connect&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;HTTP est un protocole de communication s’appuyant sur le protocole réseau TCP/IP. C’est un protocole essentiel au fonctionnement du web. &lt;/p&gt;

&lt;p&gt;Il a évolué depuis ses débuts en 1989 et a su assumer sa place dans l’écosystème internet. Aujourd’hui, on dénombre 3 versions majeures de HTTP et il continue d’y avoir de la recherche pour améliorer le protocole.&lt;/p&gt;

&lt;p&gt;HTTP est la base de beaucoup d’API web ce qui en fait une &lt;strong&gt;notion essentiel&lt;/strong&gt; &lt;strong&gt;à comprendre&lt;/strong&gt; afin d’appréhender avec sérénité la construction d’application web.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>network</category>
    </item>
    <item>
      <title>Design System et les librairies de composants</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Fri, 09 Aug 2024 15:48:40 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/design-system-et-les-librairies-de-composants-2797</link>
      <guid>https://dev.to/vincent-delmotte/design-system-et-les-librairies-de-composants-2797</guid>
      <description>&lt;p&gt;Aujourd’hui j’ai pris appris que derrière la plupart des &lt;strong&gt;libraires de composant&lt;/strong&gt; il y a un &lt;strong&gt;Design System&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dans le web, un &lt;strong&gt;Design System&lt;/strong&gt; est un ensemble de &lt;strong&gt;règles de conception&lt;/strong&gt; permettant de créer des interfaces &lt;strong&gt;homogènes&lt;/strong&gt; et &lt;strong&gt;accessibles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;C’est l’émergence des différents support de diffusion et les enjeux d’accessibilités qui ont favorisé l’apparition des Design System. &lt;/p&gt;

&lt;p&gt;Voici quelques-uns des Design System les plus utilisés :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://atlassian.design/" rel="noopener noreferrer"&gt;Atlassian Design System&lt;/a&gt; par Atlassian&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://m3.material.io/" rel="noopener noreferrer"&gt;Material Design&lt;/a&gt; par Google&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.apple.com/design/" rel="noopener noreferrer"&gt;Apple Human Interface Guidelines&lt;/a&gt; par Apple &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ant.design/" rel="noopener noreferrer"&gt;Ant Design&lt;/a&gt; par Alibaba Group&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La liste est bien plus longue que ça, je vous laisserais le soin d’aller chercher le Design System qui correspond le plus à votre besoin.&lt;/p&gt;

&lt;h1&gt;
  
  
  Material Design (Google)
&lt;/h1&gt;

&lt;p&gt;Prenons l’exemple d’un des Design System les plus utilisé &lt;strong&gt;Material Design&lt;/strong&gt;. Material Design a été introduit par Google en 2014. Utiliser Material donnera à votre application un aspect similaire aux différents outils de Google (Gmail / Google Drive / Youtube …).&lt;/p&gt;

&lt;p&gt;La raison d’être de Material Design est d’abstraire la complexité des interfaces en fournissant des &lt;strong&gt;solutions à des problèmes d’UX complexes&lt;/strong&gt;. La promesse de Material, c’est une interface &lt;strong&gt;simple&lt;/strong&gt;, &lt;strong&gt;accessible&lt;/strong&gt; qui offre la meilleure expérience utilisateur possible. Ainsi lorsqu’on utilise Material, on se concentre plus sur sa palette de couleur et sur les jeux d’ombre pour mettre en évidence des éléments d’interface.&lt;/p&gt;

&lt;p&gt;Le terme &lt;strong&gt;Material&lt;/strong&gt; vient du fait que ce Design sSystem s’inspire de la &lt;strong&gt;matière du monde réel&lt;/strong&gt;. La philosophie est la suivante : les utilisateurs sont familiers avec les éléments du monde réel tels que la &lt;strong&gt;lumière&lt;/strong&gt;, les &lt;strong&gt;ombres&lt;/strong&gt; et le &lt;strong&gt;mouvement&lt;/strong&gt;. Ainsi on peut offrir un environnement dans lequel les utilisateurs peuvent facilement s’y retrouver.&lt;/p&gt;

&lt;p&gt;Material Design met un point d’honneur sur l’&lt;strong&gt;accessibilité&lt;/strong&gt;. Ces interfaces doivent être accessibles sur &lt;strong&gt;tout type d’appareil&lt;/strong&gt; (smartphone, tablette, ordinateur …)  et par des utilisateurs ayant &lt;strong&gt;tout type de handicape&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Implémentation de Material Design
&lt;/h1&gt;

&lt;p&gt;La plupart des gros Design System possèdent des &lt;strong&gt;libraries de composants&lt;/strong&gt; et des &lt;strong&gt;maquettes&lt;/strong&gt; de ces derniers (tel que des collections Figma) permettant aux &lt;strong&gt;développeurs e&lt;/strong&gt;t aux &lt;strong&gt;designer&lt;/strong&gt; d’utiliser le Design System directement dans leurs applications sans devoir tout implémenter. &lt;/p&gt;

&lt;p&gt;Cela rend le Design System très &lt;strong&gt;abordable&lt;/strong&gt; car on ne doit pas maitriser l’ensemble des règles pour commencer à l’utiliser.&lt;/p&gt;

&lt;p&gt;Voici un ensemble de librairies qui implémente Material Design pour les différentes technologies Front-End les plus utilisées en 2024 :&lt;/p&gt;

&lt;h2&gt;
  
  
  React
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mui.com/material-ui/" rel="noopener noreferrer"&gt;https://mui.com/material-ui/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.creative-tim.com/vuematerial/" rel="noopener noreferrer"&gt;https://www.creative-tim.com/vuematerial/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.vuetifyjs.com/en/" rel="noopener noreferrer"&gt;https://v2.vuetifyjs.com/en/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://material.angular.io/" rel="noopener noreferrer"&gt;https://material.angular.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;À noter qu'en général, il existe plusieurs librairies qui fournissent les composants respectant les règles d’un Design System. &lt;/p&gt;

&lt;p&gt;Toutes les libraires ne sont pas équivalentes, elles viennent avec plus ou moins de composants. En fonction de votre besoin et de vos objectifs, ce critère peut être pris en compte pour décider la techno que vous choisirez pour implémenter votre application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Personnellement, je développe principalement des interfaces en React. Je suis familier à l’utilisation des librairies suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MUI&lt;/strong&gt; &lt;a href="https://mui.com/material-ui/all-components/" rel="noopener noreferrer"&gt;https://mui.com/material-ui/all-components/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ant Design&lt;/strong&gt;  &lt;a href="https://ant.design/components/overview/" rel="noopener noreferrer"&gt;https://ant.design/components/overview/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je trouve ces collections de composants sont complètes. Ces derniers me permettent d’avoir des interfaces homogènes, accessibles et surtout me font &lt;strong&gt;gagner un temps précieux&lt;/strong&gt; car il ne faut pas &lt;strong&gt;développer&lt;/strong&gt; et &lt;strong&gt;tester&lt;/strong&gt; chacun des composants d’une application.&lt;/p&gt;

&lt;p&gt;Depuis peu, j’utilise &lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;Shadcn UI&lt;/a&gt; qui propose une collection de composants en Tailwind CSS. Je vous conseille fortement d’essayer cette librairie prometteuse.&lt;/p&gt;

</description>
      <category>design</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Qu'est ce qu'un CDN ?</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Fri, 09 Aug 2024 07:49:31 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/quest-ce-quun-cdn--41md</link>
      <guid>https://dev.to/vincent-delmotte/quest-ce-quun-cdn--41md</guid>
      <description>&lt;p&gt;Aujourd’hui, j’ai découvert ce qu’est un &lt;strong&gt;CDN Content Delivery Network&lt;/strong&gt; ou réseau de diffusion de contenu en français. C’est un groupe de serveur qui permet d’accélérer l’accès au contenu web en rapprochant les sources de données des utilisateurs. &lt;/p&gt;

&lt;p&gt;Le principe est simple, un serveur principal envoie des copies des données à des serveurs distants plus proche de l’utilisateur final (cf schéma ci-dessous).&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%2Fuploads%2Farticles%2F1se46ipzxllwq9iuugp3.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%2F1se46ipzxllwq9iuugp3.png" alt="Image description" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les CDN ont beaucoup de valeur pour les contenus lourds tels que le streaming vidéo et les images. &lt;/p&gt;

&lt;p&gt;Un CDN est composé de 3 types de serveurs :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le &lt;strong&gt;serveur original&lt;/strong&gt; qui contient les données. Il fait office de vérité sur le contenu.&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;serveurs de relais&lt;/strong&gt; qui sont mis à jour de façon asynchrone et qui distribue le contenu.&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;serveurs DNS&lt;/strong&gt; qui permettent qui ont la connaissance de tous les serveurs et qui permettent de rediriger vers le serveur disponible le plus proche de l’utilisateur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je retiens 3 grands avantages des CDN (il en existe d’autres) :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;réduire la latence&lt;/strong&gt; en approchant la source de données des utilisateurs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;équilibrer la charge du réseau&lt;/strong&gt; en mettant à disposition plusieurs points d’accès&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;assurer un service plus stable&lt;/strong&gt; car on peut toujours rediriger sur un autre serveur en cas de pannes / maintenances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On peut citer &lt;a href="https://unpkg.com/" rel="noopener noreferrer"&gt;UNPKG&lt;/a&gt; qui est un CDN permettant de récupérer n’importe quel contenu de &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;NPM&lt;/a&gt; dans une page HTML.&lt;/p&gt;

</description>
      <category>network</category>
      <category>web</category>
    </item>
    <item>
      <title>Nullish Coalescing Operator vs Logical Or Operator</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Fri, 12 Jul 2024 12:26:55 +0000</pubDate>
      <link>https://dev.to/vincent-delmotte/le-saviez-vous-vs--3c03</link>
      <guid>https://dev.to/vincent-delmotte/le-saviez-vous-vs--3c03</guid>
      <description>&lt;p&gt;Le saviez-vous ? &lt;/p&gt;

&lt;p&gt;Quelle est la différence entre &lt;strong&gt;??&lt;/strong&gt; et &lt;strong&gt;||&lt;/strong&gt; ? &lt;/p&gt;

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

&lt;h2&gt;
  
  
  Nullish Coalescing Operator - ??
&lt;/h2&gt;

&lt;p&gt;De son doux nom français &lt;strong&gt;“Opérateur de coalescence des nuls”&lt;/strong&gt;,  &lt;strong&gt;a ?? b&lt;/strong&gt; permet de renvoyer le terme &lt;strong&gt;a&lt;/strong&gt; si ce dernier n’est pas ni &lt;strong&gt;null&lt;/strong&gt; ni &lt;strong&gt;undefined&lt;/strong&gt;. Dans le cas inverse l’opérateur renvoie le terme &lt;strong&gt;b.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voici un exemple qui permet de redéfinir cet opérateur en JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nullishCoalescingOperator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nullishCoalescingOperator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h2&gt;
  
  
  Logical Or Operator - ||
&lt;/h2&gt;

&lt;p&gt;L’&lt;strong&gt;opérateur OU logique&lt;/strong&gt; est similaire à l’opérateur de coalescence des nuls à l’exception que ce dernier test si le terme &lt;strong&gt;a&lt;/strong&gt; est &lt;strong&gt;falsy&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Pour rappel voici une liste non exhaustive des valeurs falsy en JavaScript :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;null&lt;/li&gt;
&lt;li&gt;undefined&lt;/li&gt;
&lt;li&gt;false&lt;/li&gt;
&lt;li&gt;NaN&lt;/li&gt;
&lt;li&gt;0&lt;/li&gt;
&lt;li&gt;“”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici un exemple qui permet de redéfinir cet opérateur en JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;orOperator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h2&gt;
  
  
  Mémo
&lt;/h2&gt;

&lt;p&gt;Pour finir, voici un tableau qui résume le retour des fonctions &lt;strong&gt;??&lt;/strong&gt; et &lt;strong&gt;||&lt;/strong&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%2Fuploads%2Farticles%2Fi1n0rqobxweae03l6021.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%2Fi1n0rqobxweae03l6021.png" alt="tableau récap fonctions" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>french</category>
    </item>
  </channel>
</rss>
