<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Le blog de Buddyweb]]></title><description><![CDATA[Agence digitale pour les innovateurs]]></description><link>https://blog.buddyweb.fr/</link><image><url>https://blog.buddyweb.fr/favicon.png</url><title>Le blog de Buddyweb</title><link>https://blog.buddyweb.fr/</link></image><generator>Ghost 2.22</generator><lastBuildDate>Sat, 28 Mar 2026 05:23:38 GMT</lastBuildDate><atom:link href="https://blog.buddyweb.fr/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Développez vos dashboards rapidement avec CASE]]></title><description><![CDATA[Découvrez CASE, un framework qui vous fera gagner du temps lors du développement de vos apps métier.]]></description><link>https://blog.buddyweb.fr/developpez-vos-dashboards-rapidement-avec-case/</link><guid isPermaLink="false">642c1c38bae1e27905e98903</guid><category><![CDATA[framework]]></category><category><![CDATA[AngularJS]]></category><category><![CDATA[nestjs]]></category><category><![CDATA[node]]></category><category><![CDATA[crud apps]]></category><category><![CDATA[dashboard]]></category><category><![CDATA[full stack]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Tue, 04 Apr 2023 13:23:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/2023/04/Branding---2.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/2023/04/Branding---2.png" alt="Développez vos dashboards rapidement avec CASE"><p>Créer des applications métier, ça fatigue, surtout quand on doit passer des heures à régler des problèmes de validation de formulaires ou de mauvais typages...</p><p>Mais tout ça c'est du passé ! Nous avons crée le framework CASE spécialement pour développer des applications dites "data-intensive", c'est à dire ou le CRUD (Create Read Update Delete) et la gestion des resources est primoridale.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://blog.buddyweb.fr/content/images/2023/04/Branding---3-2.png" class="kg-image" alt="Développez vos dashboards rapidement avec CASE"></figure><!--kg-card-end: image--><h3 id="-comment-a-fonctionne"> ‌Comment ça fonctionne ?</h3><p>CASE est framework full stack basé sur 2 autres frameworks: Angular (Framework TS client) et NestJS (framework TS seveur basé sous NodeJS). Une CLI vient compléter ce monorepo pour pouvoir créer des resources en une commande.</p><h3 id="une-commande">Une commande ?</h3><p>Oui, en une commande on génère tout ce qui concerne une ressource, de la base de données, au colonnes et au type d'input dans sa page "create-ed‌it". Par example la commande ci-dessous va générer le concept de produit mais aussi toutes ses propriétés.</p><!--kg-card-begin: code--><pre><code>cs generate resource product --props=name,price:currency,photo:image</code></pre><!--kg-card-end: code--><p>Pour essayer CASE, suivez notre <a href="https://docs.case.app/#/getting-started/quick-start-guide">quickstart guide </a>et donnez-nous votre avis ! On cherche des BETA testeurs, faites nous signe sur <a href="https://discord.com/invite/FepAked3W7">Discord</a> si cela vous intéresse.</p><p></p><p>‌</p>]]></content:encoded></item><item><title><![CDATA[Pourquoi mettre en place un design system ?]]></title><description><![CDATA[Face à la digitalisation de notre société, l'arrivée du Design System est un changement majeur dans le monde du Design. Pourquoi devez-vous l'intégrer dans votre équipe ?]]></description><link>https://blog.buddyweb.fr/pourquoi-mettre-en-place-un-design-system/</link><guid isPermaLink="false">5d7ba1d6bae1e27905e980d1</guid><category><![CDATA[Design]]></category><category><![CDATA[design system]]></category><category><![CDATA[UX Design]]></category><category><![CDATA[UI]]></category><category><![CDATA[Web Design]]></category><category><![CDATA[Gestion de projets]]></category><category><![CDATA[Project Management]]></category><category><![CDATA[Interface]]></category><category><![CDATA[Team Building]]></category><category><![CDATA[agence développement application web]]></category><category><![CDATA[agence développement web]]></category><category><![CDATA[Agence application mobile]]></category><category><![CDATA[agence developpement web paris]]></category><category><![CDATA[Agence site mobile paris]]></category><category><![CDATA[développement application web paris]]></category><category><![CDATA[développement application web]]></category><category><![CDATA[web design agency paris]]></category><category><![CDATA[web design agency]]></category><dc:creator><![CDATA[Sébastien Conejo]]></dc:creator><pubDate>Thu, 19 Sep 2019 14:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/2019/09/desing-system.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/2019/09/desing-system.jpg" alt="Pourquoi mettre en place un design system ?"><p>En 2014, Google sort le Material Design, prémisse du <strong>design system</strong>.</p><p>En 2016, je participais à une conférence de Brad Frost dans laquelle il introduisait son <a href="http://atomicdesign.bradfrost.com/">Atomic Design</a>.  A ce moment là, j’étais convaincu qu’à l’avenir, toutes les marques et entreprises auraient un design system, même basique. Et pourtant, nous voilà 3 ans plus tard, et il m’arrive encore de discuter avec des équipes projet qui ne voient pas l’intérêt de cet outil et ni en quoi il diffère d’une charte graphique, d’un styleguide ou d’une librairie de composants.   </p><p>J’ai eu envie d'écrire cet article car j’aimerai mettre en avant l'importance de <strong>l'implémentation du design system</strong> au sein d'une entreprise.</p><h2 id="c-est-quoi-un-design-system">C'est quoi un design system ?</h2><p>Un design system est un ensemble de <strong>composants</strong> réutilisables, guidés par <strong>des normes</strong> claires, qui peuvent être assemblés pour créer plusieurs applications. </p><!--kg-card-begin: html--><ul>
    <li><strong>Les normes :</strong> Elles définissent la structure des fichiers, les conventions de nommage, l’utilisation des composants ou encore les interactions. Elles peuvent s'appliquer à tous les métiers.</li>
        
    <li><strong>Les composants :</strong> Les composants sont des parties réutilisables dans votre système et servent de blocs de construction à l'interface de votre application. Un composant peut être inclu dans un autre composant.</li>
</ul><!--kg-card-end: html--><p>Voici quelques design systems que j'apprécie :</p><!--kg-card-begin: html--><ul>
    <li><a target="_blank" href="https://brand.uber.com/">Uber</a></li>
        
    <li><a target="_blank" href="https://polaris.shopify.com/">Polaris</a> de Shopify</li>
    <li><a target="_blank" href="https://atlassian.design/">Atlassian<a></a></a></li>
    <li><a target="_blank" href="https://www.carbondesignsystem.com/">Carbon Desing System</a> de IBM</li>
    <li><a target="_blank" href="https://www.audi.com/ci/en/intro/brand-appearance.html">Audi</a></li>
    <li><a target="_blank" href="https://designsystem.digital.gov/">U.S Web Design System</a> : Ce n'est pas le plus complet, mais je trouve intéressant de voir qu'un gouvernement ait mis en place un design system pour améliorer l'UX de son public.</li>
</ul><!--kg-card-end: html--><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/Capture-d-e-cran-2019-09-20-a--15.47.08-2.png" alt="Pourquoi mettre en place un design system ?"><br>
<em>Design System de SAP</em></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/Capture-d-e-cran-2019-09-20-a--15.51.15.png" alt="Pourquoi mettre en place un design system ?"><br>
<em>Dans son Design System, Uber donne des principes à respecter pour les casting photo. Les sujets ne doivent pas ressembler à des mannequins; Ils doivent transmettre une forte personnalité et refléter la diversité dans leur région.</em></p>
<!--kg-card-end: markdown--><h2 id="finalement-quelle-est-la-diff-rence-entre-un-design-system-un-styleguide-ou-une-librairie-de-composants">Finalement, quelle est la différence entre un design system, un styleguide ou une librairie de composants ?</h2><p>Un design system est bien plus qu’un ensemble de composants que vous utilisez pour créer vos applications métiers.  Pour faire simple, le design system comprends tous les aspects du styleguide, du language visuel et des libraires. Il comprend un guide pour que tous les métiers puissent utiliser des éléments valides. </p><p>Voici un petit exemple pour imager mon propos  : </p><p>Nous plaçons une boite contenant 100 briques Lego® devant 1 personne et lui demandons de créer une voiture uniquement avec ces Lego®. </p><p>Nous réitérons l'expérience avec une autre personne. </p><p>Puis nous comparons les 2 voitures. Il est sûr à 100% que ces 2 personnes auront créé une voiture différente.</p><p>Pourtant elles avaient toutes les deux les mêmes composants à disposition (100 briques Lego®).</p><p>Maintenant, nous faisons le même test en ajoutant une documentation.  Celle-ci va préciser que les pneus doivent être bleus et les phares jaunes. Les feux arrières peuvent être rouges pour indiquer que la voiture freine. </p><p>Si la documentation est claire et si les 2 personnes la comprennent, alors nous sommes sûrs que la voiture aura des pneus bleus et des phares avant jaunes. Nous saurons même si la voiture est en train de freiner ou non.  La boite de briques Lego, accompagnée de nos instructions et du guide d’utilisation forment un <strong>Design System</strong>.  </p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2019/12/eric-niklas-7aFEesqvLs8-unsplash.jpg" alt="Pourquoi mettre en place un design system ?"></p>
<!--kg-card-end: markdown--><p>Ce dernier est perfectible puisque nos deux protagonistes pourraient gagner du temps avec plus d’informations (la taille d’un pneu, le type de brique nécessaire pour un phare, la couleur de la voiture...).</p><h2 id="les-valeurs-ajout-es-du-design-system">Les valeurs ajoutées du design system</h2><p>En 8 ans d'expérience en tant que chef de projets, j'ai côtoyé à la fois des équipes qui n'étaient pas du tout familières avec l'outil, et d’autres qui l'avaient complètement intégré. Le design system leur ont permis de fournir des produits cohérents, pragmatiques et de qualité.</p><h3 id="un-design-scalable">Un design scalable</h3><p>En integrant un design system, on pourra proposer un accès à une source de directives et bonnes pratiques validées. </p><p>Qu'une équipe grandisse ou soit remaniée, tout le monde est sur la même longueur d’onde. Les différents styles graphiques restent cohérents, le travail en équipe est alors agréable et intelligent.</p><h3 id="un-design-homog-ne-coh-rent">Un Design homogène / cohérent</h3><p>Le design system permet d’avoir une interface prévisible et plus facile à comprendre. C’est un plus pour les utilisateurs et également pour les développeurs. Ces derniers peuvent ainsi se concentrer sur la production d’une fonctionnalité et sa performance sans se soucier du style.</p><h3 id="une-conception-graphique-rapide">Une conception graphique rapide</h3><p>Lorsqu'une équipe travaille avec un design system, le lancement d’un nouveau produit devient assez rapide. Le designer pourra prototyper plusieurs variantes de composants et les retours de son équipe seront plus concrets. Il pourra réaliser des tests, analyser des comportements utilisateurs et de ce fait, proposer une interface plus qualitative.</p><h3 id="des-volutions-faciles-mettre-en-place">Des évolutions faciles à mettre en place</h3><p>Si le style d’une interface doit évoluer, le <strong>design system</strong> permet de réduire considérablement l’effort des développeurs et intégrateurs. Les itérations sont rapides et aucun conflit CSS ou Javascript n'est causé. L’équipe peut passer plus de temps sur l’expérimentation d’un produit plutôt que sur sa conception.</p><h2 id="les-id-es-re-ues-du-design-system">Les idées reçues du design system</h2><p>Malgré tous ses avantages, le design system ne fait pas toujours l'unanimité dans une équipe. Certains membres pourraient craindre d'avoir trop de restrictions, trop peu de travail, ou une perte de créativité.</p><p>L'ajout d'une nouvelle fonctionnalité peut affecter plusieurs composants. Prendre en considération tous les éléments qui en sont impactés est très intéressant et relève de beaucoup de créativité. </p><p>En effet lors de la conception graphique, notre équipe sera amenée à créer des composants qui devront parfaitement s'adapter au design system. Les designers auront à prendre en compte l'existant et à faire en sorte que le résultat soit homogène et fonctionnels dans plusieurs situations.</p><p>Imaginez que votre nouvelle application nécessite une <em>multi-search</em> qui n'existe pas encore dans votre design system. Le designer va commencer par faire des recherches sur l'usage de ce composant (qui sont les utilisateurs ? Comment et pourquoi ils utilisent la <em>multi-search</em> ?). Il proposera un design cohérent avec d'autres composants. Il testera le bon fonctionnement du composant dans diverses situations. Et il le documentera pour que les développeurs puissent l'intégrer facilement.</p><h2 id="en-conclusion-pourquoi-mettre-en-place-un-design-system">En conclusion, pourquoi mettre en place un design system ?</h2><p>Les méthodologies de développement ou d’ingénierie ont évoluées rapidement. Le design system est un moyen d'élever les méthodes de conception graphique à la même hauteur que celles du <a href="https://buddyweb.fr/solutions/site-web">développement web</a>. Il apporte des avantages considérables. En voici 4 qui justifient pourquoi mettre en place un design system :</p><ul><li>Il permet de créer une cohésion au sein d’une équipe.</li><li>Il améliore nettement l’expérience utilisateur de vos outils.</li><li>Il renforce l’image de l’entreprise. A titre d’exemple, un visuel bichrome est immédiatement associé à Spotify. Cela est dû au respect du design system sur toutes les application de la marque.</li><li>Le coût de mise en place de nouvelles features est nettement plus faible avec un design system.</li></ul>]]></content:encoded></item><item><title><![CDATA[Modèle Gratuit de Politique de Confidentialité RGPD pour Site Web]]></title><description><![CDATA[Un modèle de page : "Politique de Confidentialité" en français à l'heure du RGPD]]></description><link>https://blog.buddyweb.fr/modele-gratuit-de-politique-de-confidentialite-rgpd-pour-site-web/</link><guid isPermaLink="false">5d726581206a0a4a2038bd17</guid><category><![CDATA[RGPD]]></category><category><![CDATA[Site web]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Mon, 09 Sep 2019 15:54:41 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/2019/09/europe.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/2019/09/europe.jpg" alt="Modèle Gratuit de Politique de Confidentialité RGPD pour Site Web"><p>Et si on profitait de la rentrée pour partir sur de bonnes bases en se mettant <strong>en conformité avec le RGPD</strong> ?</p><p>Et oui, car une page "politique de confidentialité", ce n'est pas seulement pour les GAFA mais pour tout le monde... Grand ou petit, public ou privé, en Europe le <strong>RGPD</strong> vous oblige à afficher certaines informations si  :</p><ul><li>Votre site web collecte des données de façon directe (formulaire de contact, email, etc.)</li><li>Votre site web collecte des données de façon indirecte (cookies, analytics, ads, trackers, etc.)</li></ul><p>Il y a donc de grandes chances que vous soyez concerné. De toutes façons si vous consultez cet article, c'est que vous étiez déjà sur la sellette !</p><h2 id="-disclaimer-">~ Disclaimer ~</h2><p>Avis aux personnes pressées: pas de copier-coller vite fait sur le modèle pour être conforme au RGPD. Au delà d'écrire des informations sur une page, le RGPD impose de nombreuses restrictions par rapport aux données personnelles, notamment leur confidentialité et leur sécurité. Il impose aussi des actions comme la notification en cas de violation des données et la création d'un registre (oui un registre).</p><p>Si ce dernier paragraphe vous dépasse totalement, passez donc un petit coup de fil à la direction juridique pour qu'ils s'en occupent ! Et si vous n'avez pas de direction juridique, ou même pire, si vous faites partie de la direction juridique, poursuivons donc cette merveilleuse aventure.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/unicorn-1.png" alt="Modèle Gratuit de Politique de Confidentialité RGPD pour Site Web"></p>
<!--kg-card-end: markdown--><h2 id="notre-exemple-site-web-avec-un-formulaire-et-analytics">Notre exemple: site web avec un formulaire et Analytics</h2><p>Chaque site web doit avoir une <strong>politique de confidentialité</strong> spécifique en fonction des <strong>données collectées</strong> et de <strong>la façon dont elles sont utilisées</strong>. </p><p>Nous allons donc prendre comme exemple un site web simple avec <a href="https://analytics.google.com/analytics/web/#/">Google Analytics</a> installé, ainsi qu'un formulaire de contact classique avec les champs suivants : nom, email, téléphone, entreprise, objet, message. </p><p>Attention, si vous affichez du contenu embarqué (vidéo YouTube, fil Twitter...) ou bien que vous utilisiez des plugins ou tags (LinkedIn, Facebook...) il faudra consulter leurs conditions par rapport à <strong>leur</strong> collecte de données.</p><p>Dans tous les cas, je vous suggère fortement de passer du temps sur <a href="https://www.cnil.fr/fr/rgpd-par-ou-commencer">le site de la CNIL</a>. Les infos sont plutôt bien présentées et, avouons-le, il n'est pas si dégueulasse pour un site juridique.</p><h2 id="les-obligations-l-gales-du-rgpd-pour-les-sites-web">Les obligations légales du RGPD pour les sites web</h2><p>Pour être en accord avec la loi dite "Informatique et Libertés", notre petit site doit donc respecter <a href="https://www.cnil.fr/fr/rgpd-par-ou-commencer">tout un tas de règles</a> et d'afficher certaines informations.</p><p>Tout d'abord, les cookies Google Analytics ne seront installés qu'après confirmation de l'utilisateur (la fameuse "<a href="https://blog.buddyweb.fr/mettre-les-cookies-de-google-analytics-en-conformite-avec-le-rgpd/">cookie popup</a>"). Ensuite, pour le formulaire de contact, nous nous assurerons que l'utilisateur accepte l'utilisation de ses données en cochant une case. </p><p>Officiellement, il n'est pas obligatoire de rédiger une page "politique de confidentialité", mais les informations sur les données personnelles doivent être présentées (je cite...) "de façon concise, compréhensible et aisément accessible, en des termes clairs et simples".</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/photo-1488509082528-cefbba5ad692.jpeg" alt="Modèle Gratuit de Politique de Confidentialité RGPD pour Site Web"></p>
<!--kg-card-end: markdown--><h2 id="le-contenu-de-la-politique-de-confidentialit-">Le contenu de la politique de confidentialité</h2><p>On y arrive ! Dans notre exemple, la politique de confidentialité doit répondre aux questions suivantes : </p><ul><li>Quelles sont les <a href="https://www.cnil.fr/fr/definition/donnee-personnelle">données personnelles</a> collectées et comment ?</li><li>Pourquoi sont-elles collectées ?</li><li>Qui est le <a href="https://www.cnil.fr/fr/definition/responsable-de-traitement">responsable du traitement de ces données</a> ?</li><li>Quelle est la <a href="https://www.digitemis.com/2018/12/19/rgpd-quelle-base-juridique-pour-vos-traitements-de-donnees-a-caractere-personnel/">base juridique </a>de la collecte ?</li><li>Qui pourra consulter ses données ? Seront-elles transmises à des tiers ?</li><li><a href="https://www.cnil.fr/fr/cnil-direct/question/dois-je-fixer-une-duree-de-conservation-des-donnees-dans-mon-fichier">Combien de temps seront conservées</a> les données ?</li><li>Quels sont les <a href="https://www.cnil.fr/fr/site-web-cookies-et-autres-traceurs">cookies</a> utilisés dans le site web ?</li><li>Quels sont les <a href="https://www.cnil.fr/fr/respecter-les-droits-des-personnes">droits de l'utilisateur</a> vis-à-vis des données ?</li><li>Quel est le contact du <a href="https://www.cnil.fr/fr/le-delegue-la-protection-des-donnees-dpo">DPO</a> ?</li></ul><p>Pour en savoir plus sur chaque question, cliquez sur le lien pour aller sur le site de la CNIL à la section correspondante.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/cnil-logo.svg" alt="Modèle Gratuit de Politique de Confidentialité RGPD pour Site Web"></p>
<!--kg-card-end: markdown--><h2 id="le-mod-le-gratuit-de-politique-de-confidentialit-">Le modèle gratuit de politique de confidentialité</h2><p>Voici donc le modèle de la page "politique de confidentialité" pour notre exemple. Attention, comme expliqué plus haut, ces mentions légales sont à adapter à votre site web.</p><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><h3 id="introduction">Introduction</h3><p>Dans le cadre de son activité, la société [Société], dont le siège social est situé au [Adresse du siège social], est amenée à collecter et à traiter des informations dont certaines sont qualifiées de "données personnelles". [Société] attache une grande importance au respect de la vie privée, et n’utilise que des donnes de manière responsable et confidentielle et dans une finalité précise.</p><h3 id="donn-es-personnelles">Données personnelles</h3><p>Sur le site web [Adresse du site], il y a 2 types de données susceptibles d’être recueillies :</p><ul><li><strong>Les données transmises directement</strong><br>Ces données sont celles que vous nous transmettez directement, via un formulaire de contact ou bien par contact direct par email. Sont obligatoires dans le formulaire de contact le champs « prénom et nom », « entreprise ou organisation » et « email ».</li><li><strong>Les données collectées automatiquement</strong><br>Lors de vos visites, une fois votre consentement donné, nous pouvons recueillir des informations de type « web analytics » relatives à votre navigation, la durée de votre consultation, votre adresse IP, votre type et version de navigateur. La technologie utilisée est le cookie.</li></ul><h3 id="utilisation-des-donn-es">Utilisation des données</h3><p>Les données que vous nous transmettez directement sont utilisées dans le but de vous re-contacter et/ou dans le cadre de la demande que vous nous faites. Les données « web analytics » sont collectées de forme anonyme (en enregistrant des adresses IP anonymes) par Google Analytics, et nous permettent de mesurer l'audience de notre site web, les consultations et les éventuelles erreurs afin d’améliorer constamment l’expérience des utilisateurs. Ces données sont utilisées par [Société], responsable du traitement des données, et ne seront jamais cédées à un tiers ni utilisées à d’autres fins que celles détaillées ci-dessus.</p><h3 id="base-l-gale">Base légale</h3><p>Les données personnelles ne sont collectées qu’après consentement obligatoire de l’utilisateur. Ce consentement est valablement recueilli (boutons et cases à cocher), libre, clair et sans équivoque.</p><h3 id="dur-e-de-conservation">Durée de conservation</h3><p>Les données seront sauvegardées durant une durée maximale de 3 ans.</p><h3 id="cookies">Cookies</h3><p>Voici la liste des cookies utilisées et leur objectif :</p><ul><li>Cookies Google Analytics (<a href="https://developers.google.com/analytics/devguides/collection/analyticsjs/cookie-usage">liste exhaustive</a>) : Web analytics</li><li>[Nom du cookie] : Permet de garder en mémoire le fait que vous acceptez les cookies afin de ne plus vous importuner lors de votre prochaine visite.</li></ul><h3 id="vos-droits-concernant-les-donn-es-personnelles">Vos droits concernant les données personnelles</h3><p>Vous avez le droit de consultation, demande de modification ou d’effacement sur l’ensemble de vos données personnelles. Vous pouvez également retirer votre consentement au traitement de vos données.</p><h3 id="contact-d-l-gu-la-protection-des-donn-es">Contact délégué à la protection des données</h3><p><a href="mailto:bruno@buddyweb.fr">[</a>Nom du contact] - [Idéalement au moins 2 façons de le contacter]</p><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/party.png" alt="Modèle Gratuit de Politique de Confidentialité RGPD pour Site Web"></p>
<!--kg-card-end: markdown--><p>Bravo, vous êtes arrivés jusque là ! A vous de jouer pour une super page de "politique de confidentialité" !</p>]]></content:encoded></item><item><title><![CDATA[Mettre les Cookies de Google Analytics en Conformité avec le RGPD]]></title><description><![CDATA[Tutoriel pour utiliser Google Analytics on conformité avec le RGPD en utilisant Google Tag Manager et un peu de JS.
]]></description><link>https://blog.buddyweb.fr/mettre-les-cookies-de-google-analytics-en-conformite-avec-le-rgpd/</link><guid isPermaLink="false">5d653bc628bf700db0aecbc4</guid><category><![CDATA[RGPD]]></category><category><![CDATA[Analytics]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Fri, 03 May 2019 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/2019/08/1_ZKCh64R-xu7CNm17qpSa2Q.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/2019/08/1_ZKCh64R-xu7CNm17qpSa2Q.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"><p>Le <strong>RGPD (ou GDPR) </strong>réglemente l’utilisation des données personnelles dans l’ère du digital. Si vous avez<strong> un site web avec Google Analytics</strong>, vous êtes concernés. En effet, Analytics envoie <strong>des cookies</strong> et conserve <strong>des données considérées comme personnelles</strong> (les adresses IP).</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1_ZKCh64R-xu7CNm17qpSa2Q-1.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"><br>
Le visiteur n'a pas la possibilité de refuser les cookies sur cet exemple.</p>
<!--kg-card-end: markdown--><p>Nous allons donc réaliser 2 actions pour mettre Google Analytics en conformité avec le RGPD :</p><ul><li>Rendre les adresses IP anonymes (rapide)</li><li>N’installer des cookies que chez les visiteurs qui les acceptent (long)</li></ul><p>On voit souvent des <strong>bandeaux cookie </strong>qui indiquent simplement que le site web utilise des cookies, comme sur l’image ci-dessus. <strong>Ceci n’est pas suffisant</strong> car on installe instantanément des cookies sur le navigateur du visiteur alors qu’il n’a pas encore lu le bandeau.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-xrO_ajrtJfNsiZMTA6jehw.jpeg" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><p>Avouons-le: le RGPD est long à comprendre et à mettre en place<em>.</em> C’est un grand pas avant pour la privacité et les utilisateurs, mais il oblige les petites et moyennes organisations a prendre des mesures souvent chères et pénibles pour leur taille. Je vous conseille vivement de <a href="https://www.economie.gouv.fr/entreprises/reglement-general-sur-protection-des-donnees-rgpd">comprendre le sens général du RGPD</a> et <a href="https://www.cnil.fr/fr/site-web-cookies-et-autres-traceurs">son application sur les cookies</a> avant d’aller plus loin.</p><h2 id="le-d-roulement">Le déroulement</h2><p>Nous allons mettre en place le processus suivant :</p><blockquote>On demande au visiteur s’il accepte les cookies, puis on lui envoie s’il accepte. S’il avait déjà accepté auparavant, on ne lui demande plus.</blockquote><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/rgpd-schema.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><p>Nota Bene : L’utilisateur ne peut pas refuser “une fois pour toutes” de recevoir des cookies pour les sessions suivantes. En effet, dans ce cas il faudrait lui envoyer un cookie pour garder en mémoire le fait qu’il refuse les cookies.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/illegal-meme.jpg" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><p>Voici donc les ingrédients de la recette :</p><ul><li><a href="https://marketingplatform.google.com/about/analytics/">Google Analytics</a> (bien sûr)</li><li><a href="https://www.google.com/intl/fr_fr/tagmanager/">Google Tag Manager</a></li><li>Du Javascript (sous n’importe quelle forme)</li></ul><p><em>Si vous ne pouvez pas effectuer ces opérations, </em><a href="https://buddyweb.fr"><em>l’agence Buddyweb</em></a><em> réalise des mises en conformités RGPD.</em></p><h2 id="1-configuration-de-google-tag-manager">1 . Configuration de Google Tag Manager</h2><p><a href="https://tagmanager.google.com/">Google Tag Manager</a> (ou GTM) est un outil qui permet de gérer les balises tierces sur votre site web. Aujourd’hui, il y a une balise pour tout : <em>Facebook, Twitter, LinkedIn, Google Analytics, Adwords, Hotjar…</em> Au début ça va, on ajoute le script dans le code source, mais cela peut s’entasser au bout d’un moment. De plus, chaque configuration impose de modifier ce code et peut entrainer un nouveau déploiement.</p><p>GTM dispose d’une interface de type CMS qui permet de configurer chaque balise, ses paramètres et quand et comment elle se déclenche. Lançons-nous dans l’aventure !</p><h3 id="a-cr-er-la-variable-accept_cookies">A) Créer la variable accept_cookies</h3><p>Une fois votre compte créé (copiez les 2 snippets de code GTM pour plus tard), commençons par créer directement une variable <strong>accept_cookies</strong> (en snake_case comme il est convention pour les cookies) à partir de l’onglet “variables”. Ceci permettra à GTM de lire le cookie <strong>accept_cookies</strong> sur le navigateur de l’utilisateur.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/accept-cookies-gtm.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><h3 id="b-cr-er-le-d-clencheur-accept-cookies-button-click-">B) Créer le déclencheur “Accept Cookies Button Click”</h3><p>Etant donné que nous allons lancer (ou re-lancer) Analytics à l’acceptation des cookies, nous allons créer <strong>un déclencheur customisé</strong>. Il sera relié au bouton “J’accepte les cookies” sur notre site web et exécutera le code des balises au clic sur ce bouton. On peut créer un déclencheur directement dans l’onglet “Déclencheurs”. Pour la propriété “Click ID”, choisissez “accept-cookies”, ce sera l’ID de notre bouton HTML.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/trigger-accept-cookies-google-tag-manager.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/trigger-accept-cookies-google-tag-manager.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><h3 id="c-cr-er-la-balise-qui-active-d-sactive-le-tracking-google-analytics">C) Créer la balise qui active/désactive le tracking Google Analytics</h3><p>Nous allons créer un script qui va aller voir si le cookie <strong>accept_cookies</strong> est présent chez l’utilisateur et faire un <a href="https://developers.google.com/analytics/devguides/collection/analyticsjs/user-opt-out">User Opt-Out</a> si ce n’est pas le cas.</p><!--kg-card-begin: html--><script src="https://gist.github.com/brunobuddy/b87cbb6174d9dae967b9b0d320a12eb9.js"></script><!--kg-card-end: html--><p>Cette balise sera reliée à 2 déclencheurs :</p><p><strong>All pages :</strong> Se déclenche à l’arrivée sur une page</p><p><strong>Accept Cookies Button Click : </strong>Prendre en compte l’acceptation de cookies au click sur le bouton “j’accepte les cookies”</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-H2fCFoRHUc6uj9C5G-UzXg--1-.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><ul></ul><h3 id="d-cr-er-la-balise-google-analytics-et-configurer-son-d-clenchement">D) Créer la balise Google Analytics et configurer son déclenchement</h3><p>La 2ème balise que nous allons créer est celle de <strong>Google Analytics</strong>. Pour cela sélectionnez “Google Analytics — Universal Analytics” comme <em>Type de balise</em> et ajoutez votre ID de suivi (<em>UA-XXXXXXXX-XX</em>) après avoir coché la case <em>Autoriser le remplacement des paramètres dans cette balise</em>.</p><p>Reliez-la aux 2 mêmes déclencheurs et réglez le séquençage de la balise pour qu’elle se déclenche <strong>APRES</strong> l’autre balise (très important). En effet, nous voulons que GA se lance après que la balise précédente ait activé le tracking lors du click sur le bouton “accepter les cookies”.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/trigger-google-analytics.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"></p>
<!--kg-card-end: markdown--><p>Profitez-en pour définir le champ <strong>anonymizeIp</strong> <strong>à true </strong>comme sur l’image ci-dessous.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/anonymize-ip.png" alt="Mettre les Cookies de Google Analytics en Conformité avec le RGPD"><br>
AnonymizeIp doit être à “true” pour être RGPD-compliant car de ce fait, les informations stockées ne sont pas reliées à un IP identifiable</p>
<!--kg-card-end: markdown--><h2 id="2-configuration-du-front-end-site-web-">2 . Configuration du front-end (site web)</h2><p>Une fois notre gestion de balises réalisée, place au travail sur le site web. Nous devons le connecter avec GTM et demander aux utilisateurs s’ils acceptent les cookies avec un<strong> bandeau cookie RGPD</strong>.</p><h3 id="a-ajouter-le-script-gtm">A) Ajouter le script GTM</h3><p>Il y a 2 scripts en réalité : un dans le &lt;head&gt; et l’autre dans le &lt;body&gt;. On peut les retrouver dans <em>Admin &gt; Installer Google Tag Manager</em>. Les 2 scripts doivent être accessibles depuis toutes les pages.</p><h3 id="b-cr-er-un-bandeau-cookie-ou-cookie-modal-">B) Créer un bandeau cookie (ou cookie modal)</h3><p>A partir d’ici, la méthode diffère en fonction du framework ou de la technologie utilisée. Ceci-dit, la logique reste la même :</p><ul><li>A l’arrivée sur le site : vérifier si l’utilisateur a le cookie <strong>accept_cookies</strong>. Si ce n’est pas le cas, on affiche notre bandeau RGPD.</li><li>Dans notre bandeau, un bouton “accept-cookies” déclenche une fonction qui ajoutera le cookie accept_cookies et qui fermera le bandeau.</li></ul><p>Pour ma part j’utilise <strong>Angular</strong> et <a href="https://www.npmjs.com/package/ngx-cookie-service">ngx-cookie-service</a>, mais vous pouvez faire de même avec <strong>React, Vue, jQuery </strong>ou d’autres. Voici la template de la modal ainsi que le composant :</p><!--kg-card-begin: html--><script src="https://gist.github.com/brunobuddy/d3d3f3be426e14e05891141318a01340.js"></script><!--kg-card-end: html--><!--kg-card-begin: html--><script src="https://gist.github.com/brunobuddy/b9ec863f196478a733af1c5fc28accd5.js"></script><!--kg-card-end: html--><h2 id="3-tester-avec-la-pr-visualisation-de-tag-manager">3 . Tester avec la prévisualisation de Tag Manager</h2><p>Google Tag Manager offre la possibilité de prévisualiser les modifications avant de les publier. Pour cela je vous conseille d’utiliser Google Chrome et d’ouvrir un nouvel onglet dans la même fenêtre avec votre site web. Vous pourrez ensuite tester le fonctionnement et valider le comportement suivant:</p><h3 id="a-la-1-re-arriv-e-sur-le-site-">A la 1ère arrivée sur le site :</h3><ul><li>Aucun cookie ne s’enregistre sur le navigateur</li><li>La cookie modal s’affiche</li></ul><h3 id="au-click-sur-accepter-les-cookies-">Au click sur “accepter les cookies”</h3><ul><li>Le cookie “accept_cookies” et les cookies de Google Analytics s’enregistrent sur el navigateur</li><li>La cookie modal disparaît</li></ul><h3 id="lors-d-une-suivante-visite-apr-s-acceptation-recharger-la-page-">Lors d’une suivante visite après acceptation (recharger la page)</h3><ul><li>Les cookies sont toujours là</li><li>La cookie modal n’apparait pas</li></ul><h3 id="lors-d-une-suivante-visite-sans-acceptation-des-cookies">Lors d’une suivante visite SANS acceptation des cookies</h3><ul><li>Pareil qu’à la 1ère arrivée sur le site</li></ul><p><em>Attention ! Pensez à effacer vos cookies avant de commencer et d’actualiser les cookies à chaque changement (bouton “refresh” en haut de la liste du devTools).</em></p><p>Si les tests sont concluants, vous n’avez qu’à <strong>publier vos modifications sur GTM </strong>et sur votre front-end pour passer en production. Si l’appel de <em>gtm.js</em> renvoie une erreur 404, c’est que les modifications n’ont pas été correctement publiées.</p><h2 id="conclusion-une-utilisation-de-cookies-google-analytics-conformes-au-rgpd">Conclusion : Une utilisation de cookies Google Analytics conformes au RGPD</h2><p>Grâce à cette méthode nous avons réussi à <strong>envoyer des cookies uniquement aux visiteurs qui les ont acceptés</strong>. La différence avec un bandeau strictement informatif “<em>ce site utilise des cookies</em>” est importante car le visiteur a le choix de les accepter ou non.</p><p>De plus, l’IP du visiteur ne sera pas conservé en tant que tel, mais transformé pour devenir anonyme. En effet, l’adresse IP “en clair” permet l’identification d‘une personne et relève donc des données personnelles. Le RGPD vous obligerait donc à prendre en compte tout un tas de trucs supplémentaires.</p><p>Et voilà pour la plupart ! Par contre si vous envoyez à Google Analytics des données personnelles (identifiants, valeurs de formulaires, etc.), il vous faudra bien évidemment vous mettre en accord avec le RGPD sur ce point là aussi.</p><p>Bon courage !

</p>]]></content:encoded></item><item><title><![CDATA[Tutoriel : Créer une application basique avec Angular]]></title><description><![CDATA[Dans ce tutoriel nous allons créer une application concrète de A à Z avec Angular. 
]]></description><link>https://blog.buddyweb.fr/tutoriel-creer-une-application-basique-avec-angular/</link><guid isPermaLink="false">5d653bc628bf700db0aecbc3</guid><category><![CDATA[Tutorial]]></category><category><![CDATA[SCSS]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Wed, 20 Feb 2019 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/Tutoriel---Cr-er-une-application-basique-avec-Angular/1-pmwgwmR8JMUFeRV6100IMQ.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/downloaded_images/Tutoriel---Cr-er-une-application-basique-avec-Angular/1-pmwgwmR8JMUFeRV6100IMQ.png" alt="Tutoriel : Créer une application basique avec Angular"><p>Dans ce tutoriel nous allons créer une application concrète de A à Z avec Angular. La<a href="https://angular.io/docs"> documentation officielle</a> est bien faite, mais on a souvent besoin de voir des examples concrets pour avancer.</p><p>Nous allons donc <strong>partir de zéro</strong> pour créer une <a href="https://buddyweb.fr/solutions/application-metier">application</a> pragmatique qui va afficher des résultats de matchs de foot (c’est un exemple, la même méthode peut nous aider à récupérer n’importe quelle donnée). Nous irons chercher ces résultats sur une API externe et les afficherons dans notre app. Voici donc les différentes étapes:</p><ol><li>Installer Angular</li><li>Configuration SCSS</li><li>Installation kit UI</li><li>Création des composants</li><li>Routing</li><li>Création des services</li><li>Interfaces</li><li>Appels HTTP</li><li>Affichage des variables dans les templates</li></ol><p><em>Info: </em><a href="https://github.com/brunobuddy/angular-basic-app"><em>Le code source de l’application est disponible ici</em></a><em>. Cet article est le résumé des 2 vidéos suivantes :</em></p><!--kg-card-begin: html--><iframe src="https://www.youtube.com/embed/cNAchoTqzDg?start=1&feature=oembed&start=1" width="640" height="480" frameborder="0" scrolling="no"></iframe><!--kg-card-end: html--><!--kg-card-begin: html--><iframe src="https://www.youtube.com/embed/zdqrR17f30U?start=275&feature=oembed&start=275" width="700" height="393" frameborder="0" scrolling="no"></iframe><!--kg-card-end: html--><h2 id="installer-angular">Installer Angular</h2><p>Pour créer un nouveau projet Angular, vous avez besoin de la <a href="https://cli.angular.io/">CLI d’Angular</a> et de <a href="https://nodejs.org/en/">NodeJS</a>.<strong> CLI</strong> signifie Command Line Interface, c’est un outil qui vous permettra de taper des commandes commençant par <em>“ng”</em> sur votre terminal.</p><p>Une fois ces dépendances téléchargées, tapez dans votre terminal :</p><!--kg-card-begin: code--><pre><code>ng new angular-tutorial</code></pre><!--kg-card-end: code--><p>Ce qui va créer un nouveau dossier à votre emplacement actuel et installer un projet Angular dedans. Cela va prendre quelque temps à s’installer, puis vous pouvez vérifier en servant l’app :</p><!--kg-card-begin: code--><pre><code>cd angular-tutorial
ng serve</code></pre><!--kg-card-end: code--><p>Et en allant sur https://localhost:4200 avec votre navigateur. Vous devriez maintenant voir un gros logo Angular. Tout va bien pour l’instant.</p><h2 id="configuration-scss-sur-angular">Configuration SCSS sur Angular</h2><p>Par défaut les fiches de style sont en <em>.css</em> sur Angular. Si on veut passer à <a href="https://sass-lang.com/">SASS</a> par défaut (je vous le recommande), il faut modifier les paramètres du fichier <a href="https://github.com/brunobuddy/angular-basic-app/blob/master/angular.json"><em>angular.json</em></a><em> :</em></p><!--kg-card-begin: code--><pre><code>"schematics": {        
  "@schematics/angular:component": {          
    "styleext": "scss"        
  }
}</code></pre><!--kg-card-end: code--><p>A partir de maintenant, lorsque vous allez créer un composant, sa fiche de style sera par défaut en SCSS. Il me semble que la même configuration permet de faire la même chose pour du <a href="http://lesscss.org/">LESS</a>.</p><h2 id="installer-un-kit-ui-framework-css-sur-angular">Installer un kit UI (framework CSS) sur Angular</h2><p>Dans notre example nous allons utiliser un kit UI très puissant et très simple qui s’appelle <a href="https://bulma.io">Bulma</a>. Installons le avec une commande NPM. Dans le terminal à la racine du projet faites :</p><!--kg-card-begin: code--><pre><code>npm i bulma --save</code></pre><!--kg-card-end: code--><p>Angular prône <a href="https://medium.com/@simonb90/comprendre-la-viewencapsulation-dans-un-component-angular-83decae8f092">une philosophie d’encapsulation de ses composants</a>, y compris pour le style. Ce principe permet d’éviter que vos déclarations “débordent” des composants, par exemple vous pouvez appeler un élément “title” sur chacun de vos composants et lui donner des propriétés différentes sans qu’elles se superposent. Chaque composant contient sont “title” et ses définitions qui se limitent à lui-même. Chacun chez soi, tout le monde est content.</p><p>Ceci est très bien et très utile, surtout sur les grosses apps, mais nous voulons faire une seule exception à la règle pour que notre kit impacte tous les composants avec un style par défaut. Chaque composant pourra ensuite ajouter ou surcharger ces propriétés avec des déclarations spécifiques et limitées à lui-même.</p><p>Nous allons donc retirer l’encapsulation du <a href="https://github.com/brunobuddy/angular-basic-app/blob/master/src/app/app.component.ts">composant principal</a> et de faire un lien vers une nouvelle feuille de style qui importe notre kit :</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-pmwgwmR8JMUFeRV6100IMQ.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
Utilisation de la propriété “encapsulation” du décorateur @Composant</p>
<!--kg-card-end: markdown--><p>Dans cet example, on a crée un fichier main.scss dans /assets/styles. Ce fichier ne comprend qu’une ligne qui importe notre kit Bulma :</p><!--kg-card-begin: code--><pre><code>@import '../../../node_modules/bulma/bulma';</code></pre><!--kg-card-end: code--><p>Et voilà, en retournant sur notre page d’accueil on doit déjà voir que le style à légèrement changé (typo plus ronde et couleur plus grisées). On avance !</p><h2 id="cr-ation-de-composants">Création de composants</h2><p>Créons un composant pour le header afin de diviser nos templates :</p><!--kg-card-begin: code--><pre><code>ng g c partials/header</code></pre><!--kg-card-end: code--><p>La commande “generate component” (abrégée “g c”) va créer un composant header que nous allons pouvoir appeler dans app.component.html avec la balise app-header.</p><!--kg-card-begin: code--><pre><code>&lt;app-header&gt;&lt;/app-header&gt;</code></pre><!--kg-card-end: code--><p>Il est possible d’en faire de même pour le footer ou d’autres éléments de l’app. Il vaut mieux beaucoup de petits fichiers qu’un seul gros fichier.</p><h2 id="routes-et-urls-dans-angular">Routes et URLs dans Angular</h2><p>Maintenant nous allons créer 2 vues différentes : MatchList et MatchDetail pour afficher respectivement la liste des matches et le détail d’un match</p><!--kg-card-begin: code--><pre><code>ng g c resources/matches/match-detail
ng g c resources/matches/match-list</code></pre><!--kg-card-end: code--><p>Et nous allons créer un nouveau fichier <a href="https://github.com/brunobuddy/angular-basic-app/blob/master/src/app/app.routes.ts">app.routes</a> dans /app avec le contenu suivant :</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-AAh-93-ZCnSY99FmOI0Qpw.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
app.routes.ts</p>
<!--kg-card-end: markdown--><p></p><p>Puis l’importer dans app.module.ts avec appRoutes en paramètre de forRoot :</p><!--kg-card-begin: code--><pre><code>imports: [BrowserModule, RouterModule.forRoot(appRoutes)]</code></pre><!--kg-card-end: code--><p>Pour finir, il nous faut ajouter une balise dans le HTML (app.component.html) qui va nous indiquer ce qui va changer en changeant de route :</p><!--kg-card-begin: code--><pre><code>&lt;app-header&gt;&lt;/app-header&gt; 
&lt;router-outlet&gt;&lt;/router-outlet&gt; 
&lt;p&gt;FOOTER&lt;/p&gt;</code></pre><!--kg-card-end: code--><p>Dans cet example, le header et le &lt;p&gt; footer vont rester là tandis que le contenu de &lt;router-outlet&gt; sera remplacé par le contenu de nos composants si la route change.</p><h2 id="cr-er-des-services-http-dans-angular">Créer des services HTTP dans Angular</h2><p>Pour cette étape nous allons utiliser <a href="https://bridge.buddyweb.fr/">un outil gratuit nommé Bridge</a>, qui va nous permettre de créer des APIs en JSON depuis un tableau CSV.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-o4wWMNlujX9xz99b437P-A.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
Outil Postman</p>
<!--kg-card-end: markdown--><p>L’API est ouverte est accessible à l’URL :<br>- <a href="https://bridge.buddyweb.fr/api/tutorials/matches">https://bridge.buddyweb.fr/api/tutorials/matches</a> pour la liste des matchs<br>- <a href="https://bridge.buddyweb.fr/api/tutorials/matches">https://bridge.buddyweb.fr/api/tutorials/matches</a>/1 pour le détail</p><p>Nous allons donc créer un service qui va récupérer ces données là.</p><!--kg-card-begin: code--><pre><code>ng g s common/services/match</code></pre><!--kg-card-end: code--><p>Et nous voilà avec un MatchService.</p><h2 id="interfaces">Interfaces</h2><p>Les interfaces sont <a href="https://www.typescriptlang.org/docs/handbook/interfaces.html">une fonctionnalité de TypeScript</a> qui va nous permettre de définir précisément ce qu’on va recevoir, en l’occurrence un “match”. Qu’est ce qu’un match ? Pour notre application nous allons définir ce concept en créant une interface Match dans un fichier <a href="https://github.com/brunobuddy/angular-basic-app/blob/master/src/app/common/interfaces/match.ts">match.ts</a> :</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-R2s9OKLovTg8OzsXD9rlHQ.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
L'interface Match détaille les défférentes propriétés d'un Match.</p>
<!--kg-card-end: markdown--><h2 id="appels-http-depuis-les-services-angular">Appels HTTP depuis les services Angular</h2><p>Maintenant que nous savons quel type de données nous allons recevoir et l’URL à laquelle nous allons les recevoir, il ne manque plus qu’à passer l’appel. Commençons par doter notre service de 2 fonctions, une pour récupérer la liste de matchs (sans paramètres), et l’autre qui va récupérer un seul match en fonction de son ID.</p><p>Tout d’abord nous avons besoin d’ajouter le HttpClientModule dans app.module.ts, nous avions déjà touché cette ligne pour ajouter les routes :</p><!--kg-card-begin: code--><pre><code>imports: [BrowserModule, RouterModule.forRoot(appRoutes), HttpClientModule],</code></pre><!--kg-card-end: code--><p>Voici le service avec nos 2 fonctions :</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-CWOsaH7Nv_-9ndlGZvLybw-2.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
La fonction list() retourne un Observable qui se résout en array de Match tandis que la fonction show(id) renvoie un Observable qui se résout par un Match unique.</p>
<!--kg-card-end: markdown--><p>Les outils sont prêts, il ne reste plus qu’à s’en servir. Utilisons la fonction <em>ngOnInit()</em> pour lancer notre requête HTTP instantanément en arrivant sur la MatchList :</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-_yJFHsrYCy1IyzYWAO5szQ.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
NgOnInit() nous permet de charger la liste des Matchs et de la stocker dans la propriété matches de MatchListComponent.</p>
<!--kg-card-end: markdown--><p><a href="https://github.com/brunobuddy/angular-basic-app/blob/master/src/app/resources/matches/match-detail/match-detail.component.ts">Même combat pour la MatchDetail</a>, avec cette fois-ci une différence: le paramètre “id” sera récupéré directement depuis l’URL grâce à ActivatedRoute.</p><p>Pour tester les 2 réponses, il suffit de se rendre sur l’url <a href="http://localhost:4200">http://localhost:4200</a> et sur <a href="http://localhost:4200/matches/1">http://localhost:4200/matches/1</a> par exemple. Ensuite regarder si l’appel HTML a bien été réalisé dans la console/DevTools de votre navigateur.</p><h2 id="afficher-les-variables-dans-les-templates">Afficher les variables dans les templates</h2><p>Et le plus facile pour la fin ! Une fois les matches disponibles, il suffit de les appeler en utilisant la double accolade, ainsi que <a href="https://angular.io/guide/displaying-data">les directives Angular nécessaires comme *ngFor ou *ngIf</a></p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-ryirO2tJnSuUG42R6--a1g.png" alt="Tutoriel : Créer une application basique avec Angular"><br>
match-list-component.html</p>
<!--kg-card-end: markdown--><p>Je vous laisse faire de même (ou mieux que moi) pour le <a href="https://github.com/brunobuddy/angular-basic-app/blob/master/src/app/resources/matches/match-detail/match-detail.component.html">match-detail-comonent.html</a></p><h2 id="conclusion">Conclusion</h2><p>Nous avons parcouru beaucoup de chemin depuis l’installation de Angular ! Ces fonctionnalités sont basiques et utilisées dans la plupart des projets Angular.

</p>]]></content:encoded></item><item><title><![CDATA[A Human Developer is Better Than a Wizard]]></title><description><![CDATA[
Like many of you, I grew up watching hackers in movies. I was really thrilled to see those hacking scenes in the late-90’s and 2000s…
]]></description><link>https://blog.buddyweb.fr/a-human-developer-is-better-than-a-wizard/</link><guid isPermaLink="false">5d653bc628bf700db0aecbc5</guid><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Tue, 19 Feb 2019 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/A-Human-Developer-is-Better-Than-a-Wizard/1-rkhUk69PoyQ7nDJJAHcTvg.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/downloaded_images/A-Human-Developer-is-Better-Than-a-Wizard/1-rkhUk69PoyQ7nDJJAHcTvg.png" alt="A Human Developer is Better Than a Wizard"><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-rkhUk69PoyQ7nDJJAHcTvg.png" alt="A Human Developer is Better Than a Wizard"></p>
<!--kg-card-end: markdown--><p>Like many of you, I grew up watching hackers in movies. I was really thrilled to see those hacking scenes in the late-90’s and 2000s movies. The hackers were some kind of modern-era super heroes. This image shaped the way people perceived the job of developers. It actually made people believe that that those movie-hackers had the requirements to be good developers.</p><p>Nowadays, to build a website or a platform, we have plenty of diverse profiles, skills and sensitivities collaborating together. But before the digital labour got divided, there was a single person doing everything such as server monitoring, UX design and even comment moderation.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-OtodkA6X85Qe1x8yAJurbg.gif" alt="A Human Developer is Better Than a Wizard"></p>
<!--kg-card-end: markdown--><p>That “<a href="https://en.wikipedia.org/wiki/Webmaster">webmaster</a>” had indeed <strong>a lot of responsabilities</strong> back then. Even more than you think, as most people didn’t get anything about computers at that time. They needed someone to do what seemed magic for them: They needed a wizard, and in response to that, developers acted like wizards.</p><h2 id="you-don-t-need-to-be-a-wizard-anymore">You don’t need to be a wizard anymore</h2><p>Many things changed <a href="https://www.warnerbros.com/archive/spacejam/movie/jam.htm">since that era</a>, one thing in particular : <strong>developers are not alone anymore</strong>. They came out of the cave to sit on nice office chairs. They became a valuable and acknowledge part of a workforce, and their non-technical pairs can now understand most of their concepts because they are daily IT users too. <strong>Magic became craft</strong>, and it’s a good thing.</p><p>The most important change is that a large part of the developers work in team. Working in a team <strong>means a lot of things</strong>. First of all, you cannot be an a**hole anymore. You owe respect to all of your teammates and you must develop a new set of skills : Discipline, communication, empathy and pedagogy. None of those are tech-related skills.</p><p>In my 10-year developer experience, I met and worked with many of those so-called wizards or geniuses. Speaking loudly technical terms, making you feel bad if you don’t know this or that technology. In my junior years, I was really impressed by them. I often felt ashamed, because, as a developer, I thought I should have understood them but I didn’t get a word of their jargon.</p><p>But you know what ? That’s bullshit. Our job is to make complex things easy, not the opposite. I say that for junior developers like I was at that time, and for anyone impressed by their speeches.</p><h2 id="let-s-make-it-easy-instead-">Let’s make it easy instead !</h2><p>Ok, let’s face it : Our job is not that difficult. <strong>Very few developers</strong> are working on really hard-to-grab concepts. Most of us, including myself, are basically <strong>sending, receiving and manipulating data</strong>. I am not saying this in a bad way, the point is that those concepts are mainly understandable. Don’t you think we should be able to talk about them simply with non-tech savvy people ?</p><p>There was a time where computing was not for everybody. The tools were rudimentary (if they even existed), there was a lot of calculation involved and you needed a lot of will to make anything work as you wanted. But right now ? Day-to-day there is not that much to invent or to hack. We need people who think clearly.</p><p>In order to remove that sticky wizard-hacker prejudice, we need to change the perception of our job. It starts with changing ourselves : <strong>to communicate inclusively and understand that we are now part of a production chain</strong>.</p><p>Code katas for example (coding exercices) or coding contests are overrated in my opinion. Of course it’s a good way to learn code and have fun, but companies should not overlook that point : A developer that understand the business value and respects the job frame is way more profitable than a developer that can find all prime numbers in one (illegible) line of code.</p><h2 id="or-let-s-be-a-part-time-wizard">Or… let’s be a part-time wizard</h2><p>If you are a developer and reading this post, you are wandering since when developing became that boring, I can tell you : Since it pays good.</p><p>Coding as a job is not an adventure in the wild, it’s full of methodology, meetings, explaining yourself, testing and many more boring stuff. But it is still super fun to do. And in addition to that, you still can be a wizard in your free time and have a lot of experimental side-projects in obscure languages !</p><p>That’s it ! What do you think about the evolution of the job of a developer ? What are the qualities that you think a developer should have or not have ? I would be glad to see your opinion (for devs AND non-devs) in the comments :)

</p>]]></content:encoded></item><item><title><![CDATA[CSS overscroll-behavior : Contrôlez le scroll de vos interfaces.]]></title><description><![CDATA[
Overscroll-behavior est une propriété CSS qui permet de contrôler le comportement par défaut du navigateur lorsqu’on dépasse une zone de…
]]></description><link>https://blog.buddyweb.fr/css-overscroll-behavior---contr-lez-le-scroll-de-vos-interfaces-/</link><guid isPermaLink="false">5d6534be28bf700db0aecba4</guid><category><![CDATA[SCSS]]></category><category><![CDATA[overscroll-behavior]]></category><dc:creator><![CDATA[Sébastien Conejo]]></dc:creator><pubDate>Tue, 30 Oct 2018 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/CSS-overscroll-behavior---Contr-lez-le-scroll-de-vos-interfaces-/1-o9SEJ7ugH_X0JA-QO4bDiA.jpeg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/downloaded_images/CSS-overscroll-behavior---Contr-lez-le-scroll-de-vos-interfaces-/1-o9SEJ7ugH_X0JA-QO4bDiA.jpeg" alt="CSS overscroll-behavior : Contrôlez le scroll de vos interfaces."><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-o9SEJ7ugH_X0JA-QO4bDiA.jpeg" alt="CSS overscroll-behavior : Contrôlez le scroll de vos interfaces."></p>
<!--kg-card-end: markdown--><p>Overscroll-behavior est une propriété CSS qui permet de contrôler le comportement par défaut du navigateur lorsqu’on dépasse une zone de scroll.</p><h2 id="contexte">Contexte</h2><h3 id="le-scroll-chaining"><em>Le Scroll-chaining</em></h3><p>L’interaction de certains éléments lorsqu’on scroll sur une application web ou mobile peut paraitre intuitive. Et pourtant, il faut parfois surcharger le comportement proposé par le navigateur pour obtenir le résultat attendu.</p><p>Prenons l’exemple d’une modale qui s’ouvre par dessus un article. Il faut scroller dans cette modale pour pouvoir lire tout son contenu.</p><p>Par défaut, si on scroll en dépassant la limite de défilement de ce contenu, alors la page sous-jacente défilera sous la modale.</p><p>On appelle ça le <strong>scroll-Chaining.</strong></p><p>Dans notre cas, ce comportement est gênant car, après la fermeture de la modale, on ne se retrouve plus au même endroit sur notre article.</p><h3 id="le-pull-to-refresh">Le pull-to refresh</h3><p>Un autre exemple est celui du pull-to-refresh. Certains navigateurs mobile proposent de rafraichir du contenu en défilant jusqu’en haut ou en bas d’une page.</p><p>Dans certains cas, cet effet n’est pas souhaité. Il est alors nécessaire de le désactiver pour avoir un comportement intuitif.</p><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><h2 id="introduction-de-overscroll-behavior-"><strong>Introduction de overscroll-behavior.</strong></h2><p>overscroll-behavior permet de contrôler le comportement de ce qui se produit lorsque vous faites défiler un conteneur.</p><p>Il peut être utiliser pour annuler le scroll-chaining ou le pull-to-refresh. Cette propriété n’a aucun impact négatif sur la performance.</p><h3 id="les-valeurs-de-la-propri-t-">Les valeurs de la propriété</h3><p><strong>auto</strong> Le dépassement de la zone de défilement se déroule normalement. C’est la valeur initiale.</p><p><strong>contain</strong> Le défilement a un comportement normal sur l’élément concerné. Les éléments sous-jacents ne sont pas impactés par ce défilement.</p><p><strong>none</strong> Même chose que contain, les effets de défilement sont aussi évités à l'intérieur de l’élément.</p><p>La propriété est un raccourci de overscroll-behavior-x et overscroll-behavior-y. Elle est définie par l’une de ces valeurs pour l’axe x puis y.</p><p>Si une seule valeur est indiquée, alors elle s’applique à la foie pour x et y.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-BcZNVHIbHcXzycXSh9cynQ.png" alt="CSS overscroll-behavior : Contrôlez le scroll de vos interfaces."></p>
<!--kg-card-end: markdown--><p>Overscroll-behavior est une propriété non héritée. La spécification est consultable sur <a href="https://wicg.github.io/overscroll-behavior/"><strong>le Github du WICG</strong></a>.</p><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><h2 id="mise-en-pratique"><strong>Mise en pratique</strong></h2><p>Dans notre cas, on affiche une modale ouverte par dessus un article. Cette modale a suffisamment de contenu pour être scrollable.</p><p>Si je scroll dans la modale en dépassant sa limite de défilement, le comportement par défaut sera d’appliquer un scroll à l’élément qui est en arrière-plan. A savoir, l’article.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-mTRAF18NjfB2rBFjpnwUwg.gif" alt="CSS overscroll-behavior : Contrôlez le scroll de vos interfaces."></p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><iframe src="https://codepen.io/sebconejo/embed/preview/xyNYqe?height=600&slug-hash=xyNYqe&default-tabs=html,result&host=https://codepen.io" width="700" height="525" frameborder="0" scrolling="no"></iframe><!--kg-card-end: html--><p>Nous ne voulons pas appliquer cet effet. Notre souhait est d’empêcher le scroll sur l’article pendant que la modale est ouverte. Tout ça, sans utiliser javascript.</p><p>Pour cela on utilise overscroll-behavior-y: contain.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1--NMzCw-IYyQXg_sRDRVMwA.gif" alt="CSS overscroll-behavior : Contrôlez le scroll de vos interfaces."></p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><iframe src="https://codepen.io/sebconejo/embed/preview/bmOaxM?height=600&slug-hash=bmOaxM&default-tabs=html,result&host=https://codepen.io" width="700" height="525" frameborder="0" scrolling="no"></iframe><!--kg-card-end: html--><p>Vous pouvez tester l’impact de cette propriété sur l’utilisation du scroll en activant et désactivant la valeur “contain” de la modale <a href="https://codepen.io/sebconejo/pen/VEqprj"><strong>sur ce pen</strong></a>.</p><h3 id="compatibilit-navigateurs">Compatibilité navigateurs</h3><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-Z9_jZ1NM3gGIYMl6rR7aKg.png" alt="CSS overscroll-behavior : Contrôlez le scroll de vos interfaces."></p>
<!--kg-card-end: markdown--><p>Plus d’informations sur la compatiblité sur <a href="https://caniuse.com/#feat=css-overscroll-behavior">CanIuse</a>.

</p>]]></content:encoded></item><item><title><![CDATA[The Easiest NodeJS Scraper — with Instant Facebook Notification]]></title><description><![CDATA[
Just 67 lines of code to get notified instantaneously on each change for cheap flights, hot deals, new products, or any list of items.
]]></description><link>https://blog.buddyweb.fr/the-easiest-nodejs-scraper---with-instant-facebook-notification/</link><guid isPermaLink="false">5d653bc628bf700db0aecbc7</guid><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Mon, 17 Sep 2018 00:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-hc_Z8jIsiBo9_CxUhqn1nw-1.jpeg" alt="Shanghai Skyline"></p>
<!--kg-card-end: markdown--><p>Just 67 lines of code to get notified instantaneously on each change for cheap flights, hot deals, new products, or any list of items.</p><h2 id="intro">Intro</h2><p>In this tutorial, we are going build a script that visits a webpage every 5 minutes and sends a Facebook message if there is a new item. Nice, isn’t it ? In our example, <a href="https://www.voyagespirates.fr/tag/erreur-de-pri">the page we are scrapping</a> displays super-cheap flights with a “price mistake” : Those deals disappear very quickly, that’s why we want to know it right away ! NB: The page is in French, but there is no need to read it.</p><p>If you are busy, just get the <a href="https://github.com/brunobuddy/cheap-flights-scrapper">Github repo of the cheap flights scraper</a>. For everybody else, let’s go together on this journey step by step :</p><!--kg-card-begin: code--><pre><code>mkdir my-scrapper
cd my-scrapper</code></pre><!--kg-card-end: code--><p>Nice ! We just created a folder and <em>cd</em> into it.</p><h2 id="scrap">Scrap</h2><p>Let’s start with the main feature : <strong>scrap a website with NodeJs</strong>. We will use <a href="https://github.com/GoogleChrome/puppeteer">Puppeteer</a>, let’s say that it’s a version of Google Chrome without the window to view it. As we don’t need to <em>see</em> the website but just to extract data from it, it fits perfectly for our scraper.</p><!--kg-card-begin: code--><pre><code>npm init // Creates a package.json file
npm i puppeteer --save // "i" stands for install</code></pre><!--kg-card-end: code--><p>Puppeteer is super easy to use. Let’s create a file called <em>main.js</em> and start working. <a href="https://blog.buddyweb.fr/my-way-from-webstorm-to-vs-code-and-other-things-in-a-developer-s-life/">I am using VS Code</a>, but you can use any editor you want. That code below takes a screenshot of our page and stores it as <em>example.png </em>in the root folder.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-JyY0YlEfPIG4j-I3TcMaDg-1.png" alt="Fichier Javascript"></p>
<!--kg-card-end: markdown--><p>Let’s execute it :</p><!--kg-card-begin: code--><pre><code> node main.js</code></pre><!--kg-card-end: code--><p>Ok, this one was easy, but make sure that the image was generated. What we want to do now is to find a <strong>list of items</strong> in this page. We are using <a href="https://www.w3schools.com/cssref/css_selectors.asp">selectors</a> to fetch this list. Let get only the item titles, there is no need to get images and texts.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-FHGe_vYKnotdVcwJJiL9ZQ.png" alt="Code HTML"></p>
<!--kg-card-end: markdown--><p>The selector to get all the titles is <em><strong>h2 &gt; a</strong></em> that means <em>“all the &lt;a&gt; tags that have an &lt;h2&gt; tag as direct parent”</em>. Let’s try to <em>console.log</em> it to check if you have the right content.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-UslMXETj06LenKPQ109yEg.png" alt="Fichier javascript"></p>
<!--kg-card-end: markdown--><p>If you execute the file again (<em>node main.js</em>), you should receive an output in your terminal that lists all the items. Before going further, be sure that this output corresponds only to the items of the list, and that it’s the text you want. You may need to add a class selector like “<em>a.item-title</em>” to make it work</p><h2 id="compare-and-store">Compare and store</h2><p>Once we have that data, we need to compare it with a previous extract. If the data changed, we send a message.</p><p>So how are we going to store the data : SQLite ? MongoDB ? MySQL ? No, This is not the fanciest NodeJs scraper, it’s the easiest NodeJs scraper ! Let’s be cheap and play for time, we are going to store it in a JSON file :)</p><p>One more thing, we don’t need to get all the items, but only the last one published, witch is actually the first one to appear in the page (on a feed-like system).</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-aigTmNkmy1lwhW-EG4L0MA.png" alt="Code javascript"></p>
<!--kg-card-end: markdown--><p>Let’s add “fs” to read and write files. Don’t forget to “require” it on top of the file.</p><!--kg-card-begin: code--><pre><code>npm i fs --save</code></pre><!--kg-card-end: code--><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-89puExdIfPP40OhGPadEUg.png" alt="Code javascript"></p>
<!--kg-card-end: markdown--><p>Ok, things are going a bit faster here. First we read a file called “previous-deal.json”. If the text in it is similar to the last deal from the website, we do nothing and stop the script.</p><p>If it’s empty or different, we update the JSON and we follow the script. Notice that we are using a try/catch structure because an error is thrown if the file does not exist, and we don’t want the program to stop.</p><p>You can try to execute the script again several times, eventually changing the content of the JSON file to trick the script and let it believe that the data changed.</p><h2 id="send-facebook-messenger-notification">Send Facebook Messenger notification</h2><p>Now that we know if things changed, we need to send a notification to the recipients. We are using Facebook for that : it’s instantaneous, free, and easy to implement.</p><p>Once again, we will take a shortcut and we will NOT create a chatbot and manage tons of ids, authorizations and tokens. Instead, we will use an <a href="https://github.com/Schmavery/facebook-chat-api">unofficial small library</a> that allows to send messages as someone for whom you have the credentials. In order to keep our credentials and personal data safe, we will use <a href="https://github.com/motdotla/dotenv">dotenv</a> too.</p><!--kg-card-begin: code--><pre><code>npm i facebook-chat-api dotenv --save</code></pre><!--kg-card-end: code--><p>Let’s create a “.env” file with our sensitive data. This file remains private and will not be added to the version control system (git). You cannot send a message to yourself on Facebook so we need a sender account with login credentials (SENDER_USERNAME and SENDER_PASSWORD) and recipient accounts (Facebook IDs only)</p><p>Each Facebook account has an ID that you can find easily with <a href="https://findmyfbid.com/">this website</a>. You will need to get the ID of each one of the recipients and add them in the double-quote string in the RECIPIENTS environment variable (see code below, replace the “recipientX” by the ID).</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-vLWC5zygc734fqKT74pM0g.png" alt="Variables d'environnement"></p>
<!--kg-card-end: markdown--><p>For the sender account, if you are a hacker you probably have that old account that you made some time ago. If not, just create a new one.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-knHeHLyav1pvZsl26GAe3Q.png" alt="Code JS"></p>
<!--kg-card-end: markdown--><h2 id="repeat-every-5-minutes">Repeat every 5 minutes</h2><p>We will use a CRON job to run the script regularly :</p><!--kg-card-begin: code--><pre><code>npm i node-cron express --save</code></pre><!--kg-card-end: code--><p>We use <a href="https://www.npmjs.com/package/node-cron">node-cron</a> to schedule tasks and expressjs to keep listening.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-GRLqjSlfMuugSHRAQKN8qw.png" alt="Code d'une tache cron en javascript"></p>
<!--kg-card-end: markdown--><p>You just need to replace the <em>console.log</em> in line 13 by your code. Have a look at the <a href="https://github.com/brunobuddy/cheap-flights-scrapper/blob/master/main.js">final version here</a>.</p><h2 id="deploy">Deploy</h2><p>Now that your Node js scraper is ready, you need to deploy it on a server that will always be available. I will not enter too much in detail as this part will be different based on your solution, whereas you use <a href="https://www.heroku.com/">Heroku</a>, <a href="https://zeit.co/now">Now</a>, or another cloud service.</p><p>I use personally <a href="https://www.digitalocean.com/">Digital Ocean</a> servers with Ubuntu and had to install some libraries in order to run Puppeteer :(</p><p>That’s it ! Please let me know how it worked out for you. Let me know too if you know how we can make this scraper even simpler.</p><p><a href="https://github.com/brunobuddy/cheap-flights-scrapper"><strong>brunobuddy/cheap-flights-scrapper</strong></a><br><a href="https://github.com/brunobuddy/cheap-flights-scrapper"><em>Node scrapper to get instant Facebook messenger notification when new deal — brunobuddy/cheap-flights-scrapper</em>github.com</a>

</p>]]></content:encoded></item><item><title><![CDATA[Ma sélection de ressources UX pour trouver l’inspiration]]></title><description><![CDATA[
On me demande souvent oú trouver de l’inspiration, que ce soit pour définir une typo, des couleurs ou une mise en page. Il existe des…
]]></description><link>https://blog.buddyweb.fr/ma-s-lection-de-ressources-ux-pour-trouver-l-inspiration/</link><guid isPermaLink="false">5d6534be28bf700db0aecba5</guid><dc:creator><![CDATA[Sébastien Conejo]]></dc:creator><pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/2019/08/1_NnMyyDXOGpkQ7Xs1DcEjfQ.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/2019/08/1_NnMyyDXOGpkQ7Xs1DcEjfQ.png" alt="Ma sélection de ressources UX pour trouver l’inspiration"><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-ywKyxYISuTmcZrYgVj9Y-g.png" alt="Ma sélection de ressources UX pour trouver l’inspiration"></p>
<!--kg-card-end: markdown--><p>On me demande souvent oú trouver de l’inspiration, que ce soit pour définir une typo, des couleurs ou une mise en page. Il existe des centaines de ressources UX, des portfolios aux outils de présentation en passant par des librairies de composants. Je liste ici une sélection de ressources que nous utilisons à l’agence.</p><h3 id="outils"><strong>Outils</strong></h3><p><a href="http://diytoolkit.org/tools/">http://diytoolkit.org/tools/</a> : C’est une boîte à outils très complète. Les outils sélectionnés sont bien documentés.</p><h3 id="inspiration"><strong>Inspiration</strong></h3><p><a href="https://www.awwwards.com/">https://www.awwwards.com/</a> : On ne le présente plus je pense. C’est la plateforme que j’utilise le plus pour m’inspirer des dernières tendances.</p><p><a href="https://thefwa.com/">https://thefwa.com/</a> : Une alternative à AWWWARDS. Il y a d’autres plateformes comme celle-ci qui récompensent les meilleurs sites web. A vous de voir laquelle vous préférez utiliser. Ces 2 là sont mes favorites.</p><p><a href="https://www.behance.net/search?field=132&amp;content=projects&amp;sort=featured_date&amp;time=week&amp;featured_on_behance=true">https://www.behance.net/search?field=132&amp;content=projects&amp;sort=featured_date&amp;time=week&amp;featured_on_behance=true</a> : J’aime bien m’inspirer sur Behance parce qu’on trouve beaucoup de Web Design Concepts. Les designers proposent des interfaces très innovantes. Parfois même trop puisqu’on trouve souvent des interfaces impossibles à développer. Pour l’inspiration, car reste une plateforme parfaite.</p><p><a href="https://reallygoodemails.com/">https://reallygoodemails.com/</a> : Ce site recense des mails HTML avec le code source parfois. Dans certaines situations, c’est plus simple d’utiliser cette plateforme plutôt qu’un framework email qui peut prendre du temps de développement.On peut trouver la template mail de MeetUp, Uber ou encore AirBnb.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-5aOIFhBmW_RBz2s_d0mIvA.png" alt="Ma sélection de ressources UX pour trouver l’inspiration"><br>
<em>Really Good Email : Filtrez les mails par catégories, sélectionnez une template mail, puis éditez son code source.</em></p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><iframe src="https://codepen.io/reallygoodemails/embed/preview/oyJXPo?height=600&slug-hash=oyJXPo&default-tabs=html,result&host=https://codepen.io&embed-version=2" width="700" height="525" frameborder="0" scrolling="no"></iframe><!--kg-card-end: html--><p><a href="https://www.pages.xyz/type/landing">https://www.pages.xyz</a> : Une sélection de pages web</p><p><a href="https://www.lapa.ninja/">https://www.lapa.ninja</a> : Une sélection de jolies Landing Pages</p><p><a href="https://www.designspiration.net/">https://www.designspiration.net</a></p><p><a href="https://fontface.ninja/">https://fontface.ninja/</a> : Une extension pour Chrome géniale ! Elle permet de savoir quelle typo est utilisée sur un site consulté. On peut ensuite tester la typo via l’outil.</p><p><a href="https://mobbin.design/">https://mobbin.design</a> : Une collection des derniers patterns piochés dans le meilleur du design mobile.</p><p><a href="https://www.typographicposters.com/">https://www.typographicposters.com/</a> : Une belle plateforme pour l’inspiration. On trouve une sélection d’affiches avec une utilisation des typos très bien faite. Petit bémol : Le filtre est assez compliqué à utiliser je trouve.</p><h3 id="design-de-composants"><strong>Design de composants</strong></h3><p><a href="https://savee.it/">https://savee.it</a> : Une sélection de designs de composants. C‘est idéal quand on travaille sur une fonctionnalité. Vous pouvez par exemple faire une recherche de type « Calendar » ou « landing page ».</p><p><a href="http://collectui.com/designs">http://collectui.com/designs</a> : Une liste de composants sélectionnés pour la qualité de leur design depuis dribbble et catégorisés par composant. C’est plutôt cool !</p><p><a href="http://styleguides.io/">http://styleguides.io</a> : Une sélection de styleguides.</p><p><a href="https://www.calltoidea.com/">https://www.calltoidea.com</a> : Une alternative à Savee.it. Vous pouvez trouver des mockups de pages 404, Popups, players, listes d’offres d’emploi, et plein d’autres éléments …</p><p><a href="http://uigarage.net/">http://uigarage.net</a> : Au cas ou ça ne vous suffirait pas, encore une alternative à Savee.IT ou calltoidea.</p><p><a href="https://uimovement.com/">https://uimovement.com</a> : Une sélection qualitative d’animations. Tapez “carousel”, “scroll” ou “menu” et vous verrez…</p><p><a href="http://emptystat.es/">http://emptystat.es</a> : C’est une liste de designs qui correspondent à des états vides. Qu’affiche tableau de bord sans information ou une application de gestion de projet sans projet ?. C’est intéressant et il y a peu de ressources comme celles-ci.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-fLDMU78bAgKNaZTC4IEGTQ.png" alt="Ma sélection de ressources UX pour trouver l’inspiration"></p>
<!--kg-card-end: markdown--><p><a href="https://undraw.co/illustrations">https://undraw.co/illustrations</a> : Une liste d’illustrations libres de droit. On peut attribuer une couleur principale à chaque illustration avant de la télécharger.</p><h3 id="rd"><strong>R&amp;D</strong></h3><p><a href="https://www.productmanual.co/">https://www.productmanual.co</a> : Ce site est très complet. Pour chaque thème il liste des articles, livres, podcasts et outils.</p><p><a href="https://muz.li/">https://muz.li</a> : C’est top juste TOP ! Muzli est une extension de Chrome qui offre des histoires et des idées de design pertinentes. Tout est pioché parmi les meilleurs sources de contenus web (webdesignerdepot, Abduzeedo, Designspiration, etc…). J’adore cette extension. Elle me permet de faire de la veille plus facilement. Je ne vais pas chercher l’information. C’est elle qui vient à moi.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-NnMyyDXOGpkQ7Xs1DcEjfQ.png" alt="Ma sélection de ressources UX pour trouver l’inspiration"></p>
<!--kg-card-end: markdown--><p><a href="https://www.webdesignerdepot.com/category/community-inspiration/">https://www.webdesignerdepot.com/category/community-inspiration/</a> : la catégorie “community inspiration” de webdesignerdepot. C’est un classique mais la sélection des tendances à venir est superbe . Un indispensable pour moi.</p><p><a href="https://design.google/news/">https://design.google/news</a></p><p><a href="https://designshack.net/">https://designshack.net</a></p><p><a href="https://uxmyths.com/">https://uxmyths.com</a></p><h3 id="photos"><strong>Photos</strong></h3><p><a href="https://unsplash.com/">https://unsplash.com</a></p><p><a href="https://www.pexels.com/">https://www.pexels.com</a></p><h3 id="icons"><strong>Icons</strong></h3><p><a href="https://feathericons.com/">https://feathericons.com</a> : Une petite librairie d’icônes.</p><h3 id="outils-1"><strong>Outils</strong></h3><p><a href="https://getavataaars.com/">https://getavataaars.com</a> : Une générateur d’avatars.</p><p><a href="https://www.palettable.io/DEC199">https://www.palettable.io/</a> : J’utilise cet outil pour sélectionner mes couleurs. Je trouve ça bien fait pour un premier jet. La sélection des couleurs n’est pas forcément définitive mais ça me permet de débloquer certaines situations. Ensuite je travaille aussi avec d’autres outils comme ceux-ci :</p><p><a href="https://hihayk.github.io/wheel/?ref=webdesignernews.com">https://hihayk.github.io/wheel/?ref=webdesignernews.com</a></p><p><a href="https://coolors.co/app">https://coolors.co/app</a></p><p><a href="https://color.adobe.com/fr/">https://color.adobe.com/fr</a></p><p>Et voilà ! J’espère que vous avez découverts de nouvelles ressources.

</p><!--kg-card-begin: html--><iframe src="https://giphy.com/embed/xT8qB2e02TaKVIsaU8/twitter/iframe" width="435" height="435" frameborder="0" scrolling="no"></iframe><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[My way from WebStorm to VS Code and other things in a developer’s life]]></title><description><![CDATA[For developers, IDE/Text-editor choice has passed beyond rational debate long time ago : it’s something personal. Let me tell you my story.
]]></description><link>https://blog.buddyweb.fr/my-way-from-webstorm-to-vs-code-and-other-things-in-a-developer-s-life/</link><guid isPermaLink="false">5d653bc628bf700db0aecbc8</guid><category><![CDATA[WebStorm]]></category><category><![CDATA[VS Code]]></category><category><![CDATA[Visual Studio Code]]></category><category><![CDATA[IDE]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Fri, 06 Jul 2018 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/My-way-from-WebStorm-to-VS-Code-and-other-things-in-a-developer-s-life/1-VWzyNzVN4nnuduTXGwB0Dw.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/downloaded_images/My-way-from-WebStorm-to-VS-Code-and-other-things-in-a-developer-s-life/1-VWzyNzVN4nnuduTXGwB0Dw.png" alt="My way from WebStorm to VS Code and other things in a developer’s life"><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-e2bFJqGpZ8s3kRA5IFG7Ag.png" alt="My way from WebStorm to VS Code and other things in a developer’s life"></p>
<!--kg-card-end: markdown--><p>For developers, IDE/Text-editor choice has passed beyond rational debate long time ago : it’s something personal. For that reason, I don’t want to create another <em>VSCode VS WebStorm</em> post, but instead relate how and why I came to switch from JetBrains WebStorm to Microsoft VS Code.</p><h3 id="why-change-from-one-to-another">Why change from one to another ?</h3><p>First of all, let me say that both softwares are really good.</p><p>I have been working for 4 years on IntelliJ IDEA (IntelliJ, WebStorm, PHPStorm, PyCharm are basically “flavors” of the same product). I loved my experience and I even wrote <a href="https://blog.buddyweb.fr/why-i-stopped-using-sublimetext-for-phpstorm/">a post about it</a> at that time.</p><p>Both WebStorm and Microsoft Visual Studio Code are VERY similar, so why loose time to learn something new ? All started with performance. As my MacBook Pro started its third year of existence, it became a bit slow (thanks planned obsolescence), an its 8gb of RAM are not that much when WebStorm only itself often uses 2gb.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-LDCBZYgIB2VWWz4a7Chrqg.png" alt="My way from WebStorm to VS Code and other things in a developer’s life"></p>
<!--kg-card-end: markdown--><p>I heard that VS Code was more lightweight and I decided to take the opportunity to try the thing that everybody is talking about. When I say everybody, I mean the louder ones, the JS and NodeJS developers :)</p><p>Actually, I’m one of them without being one of them. I’ve started with PHP and did many <a href="https://laravel.com/">Laravel</a> projects, then started with AngularJS when it came out and evolved to <a href="https://angular.io/">Angular</a>. I fell in love with TypeScript and I’m still learning to do some server-side programming with a Node.js/TypeScript framework called <a href="https://nestjs.com/">Nest</a>.</p><p>Ok, let’s go back to performance. Using VS Code did a huge change in overall performance and my Mac seems young again. One point for VS Code !</p><h3 id="starting-with-vs-code">Starting with VS Code</h3><p>To reduce the learning curve, you can start by installing some plugins : <a href="https://marketplace.visualstudio.com/items?itemName=k--kato.intellij-idea-keybindings">IntelliJ IDEA Keybindings</a>, <a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker</a>, <a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier</a>, <a href="https://marketplace.visualstudio.com/items?itemName=krizzdewizz.goto-last-edit-location">goto-last-edit-location</a>, <a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag">Auto Rename Tag</a>, <a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight">TODO Highlight</a>. Those features are available out-of-the-box on WebStorm but we have to download them as plugins in VS Code. There is huge difference in their philospohy : As WebStorm comes with key-packages included from start, Microsoft VS Code comes half-naked and you have to dress it (like a PHP project in comparison to a NodeJS project). It’s neither good or bad, but the approach is different.</p><p>Settings are easy to change, JSON-style make it easy to search and to make the difference between the default ones and the ones you specifically changed.</p><p>Global UI is cleaner than WebStorm. For minimalist-lovers like me, you can use Zen Mode to focus even more.</p><h3 id="day-to-day-work-on-vs-code">Day-to-day work on VS Code</h3><p>After few days, I’m still adapting but I am quite happy with my new editor. Code’s Source Control is so much nicer that WebStorm. I use the <a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.git-extension-pack">Git Extension Pack</a> and everything is smooth. I actually don’t really know which features are native or from the plugin, it’s probably a good thing.</p><p>Regarding the terminal,I found out that VS Code is more convinient. With your keyboard you can <em>Create New Integrated Terminal</em>, split panes and navigate between them just with shortcuts. Maybe that shortcut exists on IntelliJ but I couldn’t find out.</p><h3 id="angular-on-vs-code">Angular on VS Code</h3><p>Let me introduce you to <a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme</a>. I’m actually not a huge fan of material design, but the point of this theme is that file icons represent not only their extension but their roles.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-7yo2pwg21o9XlSG8TAc39Q.png" alt="My way from WebStorm to VS Code and other things in a developer’s life"><br>
<em>Components, pipes, and services have different colors to distinguish them.</em></p>
<!--kg-card-end: markdown--><p>Another good thing for Angular developers : VS Code doesn’t save the file on highlighting other applications. That means that your browser will not reload unexpectedly. If you know what I’m talking about, you know it’s bothering.</p><h3 id="typescript-on-vs-code">TypeScript on VS Code</h3><p>Did I already told you that I love TypeScript ? TypeScript is great because it’s a fail-fast language that solidifies your apps. And there is a greater benefit, TypeScript helps IDEs to understand your code, and IDEs rewards you by providing you a better code completion and highlight errors. Unless you are still in the samouraï era and use emacs or vim, TypeScript will save you a lot of time and prevent mistakes.</p><p>VS Code was made by Microsoft that created TypeScript too. I had great expectations on that point. But WebStorm is already excellent on understanding TypeScript… Unless one tiny point : WebStorm doesn’t get <a href="https://developers.google.com/web/updates/2015/01/ES6-Template-Strings">ES6 Template strings</a>, VSC does. Anyway, both IDEs manage very well this language. Maybe VS Code will have a better / quicker implementation of future versions ?</p><h3 id="php-on-vs-code">PHP on VS Code</h3><p>On the other hand, PHP support is way better on IJ. If you work exclusively in PHP, stop reading here and keep IntelliJ.</p><h3 id="the-future">The future</h3><p>Before investing your precious time into something, it’s important to ensure that this thing will not die tomorrow. When I decided to learn <a href="https://laravel.com/">Laravel</a> (42k stars on Github today), around 4 years ago, it was way less used than Symphony (17k) , CakePHP (7k) or Yii (5k). But they where clues : overall quality was really good and acknowledged by thrusted developers, Github repo was well maintained and even the website design was nice and clean.</p><p>IDE choice is less community-dependent than an open-source framework but still it’s important to check if people are still going to use it in the future. Digging around the web, I found that VS Code seems having more and more enthusiasts whereas the other one is stagnating.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-VWzyNzVN4nnuduTXGwB0Dw.png" alt="My way from WebStorm to VS Code and other things in a developer’s life"></p>
<!--kg-card-end: markdown--><p>Did you heard about Solidity ? It’s a quite new language to create decentralized apps on the <a href="https://www.ethereum.org/">Ethereum blockchain</a>. Let’s say that it’s the new BIG thing alright ? So, witch editor do you think has more Solidity support ? Again, VS Code.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1--kbrUriadRXRsMMF2V5W7A.png" alt="My way from WebStorm to VS Code and other things in a developer’s life"></p>
<!--kg-card-end: markdown--><h3 id="conclusion">Conclusion</h3><p>If you don’t have a good reason to change from one to another, you’re not missing much by not doing it. Those are both really good software. If you have to choose between both, I would say that PHP and Java devs should go IntelliJ and JS/TS devs with VSCode. For myself, I’ll keep VS Code. And you ?</p><p><strong>VS Code pros</strong></p><ul><li>Open Source</li><li>Lightweight : less RAM and CPU usage</li><li>Bigger community : plugins, tutorials, etc.</li><li>A bit better with JavaScript and TypeScript</li><li>More “future-proof”</li></ul><p><strong>WebStorm pros</strong></p><ul><li>Better PHP / Java support</li><li>Less Intrusive</li><li>More configurable</li><li>More stable</li></ul>]]></content:encoded></item><item><title><![CDATA[Can we achieve fair betting games through blockchain technology ?]]></title><description><![CDATA[A white-paper about our POC, BetDemocracy : Ethereum-based Smart Contract fair betting platform.]]></description><link>https://blog.buddyweb.fr/can-we-achieve-fair-betting-games-through-blockchain-technology--/</link><guid isPermaLink="false">5d653bc628bf700db0aecbc2</guid><category><![CDATA[Blockchain]]></category><category><![CDATA[Ethereum]]></category><category><![CDATA[Betting]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Tue, 26 Jun 2018 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/Can-we-achieve-fair-betting-games-through-blockchain-technology--/1-oOz-IcQLpmmhGknj4Isr0g.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/downloaded_images/Can-we-achieve-fair-betting-games-through-blockchain-technology--/1-oOz-IcQLpmmhGknj4Isr0g.png" alt="Can we achieve fair betting games through blockchain technology ?"><p># Non-technical paper</p><p>Betting is a juicy business, but mostly for the casino. Even in sports betting, which requires a lot of strategy, very few people can bet for a living. The house always wins because they are keeping some of the money. Inevitably, bettors end up loosing.</p><blockquote>Can the blockchain change this ?</blockquote><p>The blockchain is a technology that empowers communities by cutting middle-men and bottlenecks in many configurations.</p><p>In this paper, we will demonstrate how we can make “fair bets” using two key features of the blockchain : <strong>crypto-currencies</strong> and <strong>smart contracts</strong>.</p><p>With this explanation comes a functional proof-of-concept (POC) : the <a href="http://betdemocracy.org/">betdemocracy.org</a> sports betting platform. Why sports betting ? Sports betting is huge on the internet and bookmaker margins are up to 10 times bigger that in any other betting types.</p><h3 id="what-is-a-fair-game-">What is a “fair game” ?</h3><p>A fair game is a game where the rules are not favorable to a specific side. Let’s say that two players play heads or tails for 1 € each throw, and get 2 € in case of win. In the long term, they will almost finish in the position they started in. We can say that this game is fair.</p><p>If players get rewarded 1,80 € per win by a middle-man (the coin-thrower), they will both finish broke soon if they keep playing. That game is not fair and it’s more or less what happends in casino games like black jack or roulette.</p><h3 id="real-life-case">Real life case</h3><p>In our example, we will use <a href="https://thefootytipster.com/1x2-betting/">1X2 soccer bets</a> on the World Cup 2018 in Russia. In this kind of game, you can bet for the 3 possible outcomes : a home team win, an away team win or a draw. As stronger teams have more chances to win, each of the 3 outcomes has a specific odd. In other words, you will get a bigger reward if you betted for the underdog than if you betted for the favorite. Let’s have a look to the odds for France X Peru in one of the major betting sites in the world (odds are almost similar in all platforms).</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-zZrOiwvXkPJa_S0nwDsD4w.png" alt="Can we achieve fair betting games through blockchain technology ?"><br>
<em>Odds for France X Peru soccer game. Fractional and moneyline odds are calculated from decimal values.</em></p>
<!--kg-card-end: markdown--><p>The total exceeds 100 %. This represents a bookmaker margin of 5,01%, which is not bad, margins are usually between 5% and 15% in those bets.</p><p>Now, let’s compare it with a “perfect” situation where the bookmaker doesn’t take any margin :</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-aNzrvVB6L18DmlULv0o_AA.png" alt="Can we achieve fair betting games through blockchain technology ?"><br>
<em>We estimate odds with cross-multiplication. Fractional and moneyline odds are calculated from decimal values, rounded to 0.01.</em></p>
<!--kg-card-end: markdown--><p>As you can see, all odds are better without the bookmaker margin. You may think that 5% doesn’t count very much, but it’s a huge difference. Have a look of <a href="https://www.bettingexpert.com/">betting experts’ yields on this website</a> and you will struggle to find a pro better with a ROI &gt; 5% .</p><h3 id="how-can-we-get-rid-of-bookmaker-margin">How can we get rid of bookmaker margin ?</h3><p>To get rid of the bookmaker margin, <strong>we have to get rid of the bookmaker itself</strong>. That is where the blockchain can help us.</p><p>A blockchain is a network were the power is decentralized and shared to the whole network. Our choice for this project is the <a href="https://ethereum.org/">Ethereum blockchain</a> for many reasons :</p><ul><li>It’s the 2nd biggest in <a href="https://coinmarketcap.com/">market cap</a> (right after Bitcoin), so many people own Ethers, its crypto-currency</li><li>Unlike Bitcoin, it support smart contracts. There is a well-documented language for those contracts : <a href="https://solidity.readthedocs.io/en/v0.4.24/">Solidity</a></li><li>There is a strong community and there is many projects on top of it</li></ul><p>Ethereum acts like a single universal computer where you can add pieces of code : smart contracts. A smart contract is like a<strong> digital contract between one or several entities</strong>. It also acts like a wallet as it can receive and store money. Our smart contract will store opponents’ bets safely and return the money back to the winner.</p><h3 id="betting-against-each-other">Betting against each other</h3><p>At this point there is a big difference: in betting sites, you always play against the house. The casino takes all bets.</p><p>Without casino, you have to play against someone betting for the exact opposite. For “France X Peru”, if you bet for a “France win”, you need someone betting for a “Peru win or draw” and agree on the odds and the stake. With that said, we are clear that we must have <strong>a platform to connect people</strong>.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-X9VNPLRsmxWmT0CRgXB7Fg.png" alt="Can we achieve fair betting games through blockchain technology ?"></p>
<!--kg-card-end: markdown--><p>To keep it simple, we look for one person to complete the player’s bet using double-chance bets (like “Peru win or draw”). It can work with more opponents : a “draw” bettor and a “Peru win” bettor. We also can have several players that join their stake to meet opponents requirements. But let’s keep it simple for now.</p><p>Indeed, our proof-of-concept is like a marketplace, but we can imagine an automated platform like an exchange it the future.</p><h3 id="the-cost-of-the-bet">The cost of the bet</h3><p>Let’s be clear : at the time we are writing this, crypto-currency transactions and smart contract execution require (small) fees. We will not achieve a “perfect” fair bet because the cost is not zero BUT we will consider that a bet is fair if the cost is ≤ 0,01 % of the total stake.</p><p>To make that number more visual, imagine that you bet for the 3 possible outcomes of a game (just for the example). It means that just one bet per match would be correct. In traditional betting sites, your initial stake will reduce by more than half <strong>after 14 games.</strong> With what we consider a fair game, you need to do the same for<strong> 6931 games</strong> to see your stake reduce to half of what it was. It is a ridiculously high amount of games so we can agree that the bet is “fair”.</p><p>In blockchains, fees are not based in the amount of money that is sent, but on the <strong>computation power</strong> that is needed to process the transaction. It means that fees are fixed costs. The higher the stake, the lower the cost in percentage.</p><p>Based on previous transactions on Bet Democracy, we found out that the average bet needs around 35 000 gas to be processed. In Ethereum, gas is the basic unit for computing power. The more complicated the function you call, the more gas you spend. And, of course, you have to pay your gas : )</p><p>You can choose the price you pay to skip the line or save money (or somewhere in the middle). In this example, we are using the <a href="https://ethgasstation.info/">SafeLow gas price of 1 gwei</a>, it’s the lowest price then ensures you that the transaction will be validated for sure. As this is a non-technical paper I don’t want to enter too much into details, but another paper will be created with more explanations.</p><p>At today’s rate of 1 ETH = 401,49 €, the price of the bet is 0,15 € divided by the bettors. Let’s make a chart.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-oOz-IcQLpmmhGknj4Isr0g-1.png" alt="Can we achieve fair betting games through blockchain technology ?"><br>
<em>Bet cost in percentage based on total stake in Euros (logarithmic scale).</em></p>
<!--kg-card-end: markdown--><p>There is 2 important points in this chart :</p><ul><li>At <strong>3 € of bet total stake</strong> (your stake plus your opponent’s), the bet is cheaper than in almost all betting sites (&lt; 5%).</li><li>At <strong>935 € of bet total stake</strong>, the fees are equal to 0.01 % and we consider it a “fair bet”.</li></ul><h3 id="conclusion">Conclusion</h3><p>With this paper and the Bet Democracy platform example, we proved that we can <strong>achieve a virtually “fair game” in Sports betting</strong>.</p><p>We strongly believe that we can decrease the gas needed by optimizating the smart contract to lower that 935 € “fair bet” step. In addition to that, as blockchain technology quickly improves, transaction prices are lowering. Transactions are already free in many blockchains.</p><p>So, <strong>YES</strong>, blockchains can provide “fair bets” and <strong>YES</strong> it is probably going to disrupt the betting industry. Blockchain betting enables many possibilities, especially everything about reducing costs, bet trading and anymousity.</p><p>Of course, there is some obstacles : crypto-currencies are not yet widely used by bettors and people need to gain confidence in blockchains. Security can be a big deal too, as we already saw smart contracts being robbed by hackers. But we are really confident about the fact that there is a bright future for <strong>blockchain betting</strong>.</p><p>If you read until this point, we recommend that you have a look at the POC version of <a href="https://betdemocracy.org/">Bet Democracy</a> that enables bets with dummy-money (Ropsten Ethers). Make sure to have the MetaMask extension on your browser.</p><p>Our plan is to build a fully functional version on the main Ethereum network with real money. <strong>We are looking for funding, sponsoring and anything that can help us achieve our goal.</strong> If you are interested, write us at <a href="mailto:hello@betdemocracy.org">hello@betdemocracy.org</a>.

</p>]]></content:encoded></item><item><title><![CDATA[Les Moteurs de Recherche alternatifs à Google]]></title><description><![CDATA[Il y a plein de raisons d’arrêter d’utiliser Google : privacité, éthique, pratique... On a testé quelques alternatives pour vous.]]></description><link>https://blog.buddyweb.fr/les-moteurs-de-recherche-alternatifs-a-google/</link><guid isPermaLink="false">5d653bc628bf700db0aecbd2</guid><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Mon, 04 Sep 2017 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/Les-Moteurs-de-Recherche-alternatifs---Google/1-w4Xe-6_1v1lgZPt5QwNJOw.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.buddyweb.fr/content/images/downloaded_images/Les-Moteurs-de-Recherche-alternatifs---Google/1-w4Xe-6_1v1lgZPt5QwNJOw.png" alt="Les Moteurs de Recherche alternatifs à Google"><p>Il y a plein de raisons d’arrêter d’utiliser Google : privacité, éthique, pratique, ou tout simplement pour arrêter de nourrir le monstre qui est bien parti pour en finir avec l’humanité un de ces jours.</p><p>On a donc testé quelques alternatives pour vous. Différentes approches, différentes promesses. Découvrez tout de suite les moteurs de recherche de l’internet d’aujourd’hui.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-wOI77I6FdIYOpRMpWDFKzA.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="duckduckgo-le-moteur-de-recherche-respectueux-de-la-privacit-">DuckDuckGo : Le moteur de recherche respectueux de la privacité</h2><p><a href="https://duckduckgo.com/">DuckDuckGo</a> est le “moteur de recherche qui ne vous espionne pas”. Soucieux du respect de la vie privée, il n’y a pas de trackers ni sur le moteur de recherche, ni sur les publicités. Aucune information personnelle n’est conservée. La classe.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-Ctdmtapy8DXPG3C_ad_JlA.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="ecosia-le-moteur-de-recherche-colo">Ecosia : Le moteur de recherche écolo</h2><p><a href="https://www.ecosia.org/">Ecosia</a> : “lancer une recherche pour planter des arbres”. Ils gagnent de l’argent avec les liens sponsorisés et reversent 80% des ces revenus à des associations environnementales. Ecosia est en fait un meta-moteur de recherche : sous le capot, c’est en fait les résultats de Bing qui s’affichent. Ecosia est totalement transparent sur son activité et publie <a href="http://ecosia.dropmark.com/369419">des rapports financiers</a> tous les mois.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-VjnLG59ERK15OK3Y9BMILg.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="lilo-la-recherche-solidaire">Lilo : La recherche solidaire</h2><p><a href="https://search.lilo.org/">Lilo</a> est également un moteur de recherche engagé. Chaque recherche permet d’obtenir des “gouttes” que l’on peut convertir en don pour une association de son choix. Sympa ! Comme <strong>Ecosia</strong>, ils agissent comme une sur-couche d’autres moteurs de recherche (Google et Bing pour le coup).</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-krRb6ucNK7RukdVpQIWo5A.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="bing-le-challenger-qui-n-a-pas-su-s-imposer">Bing : Le challenger qui n’a pas su s’imposer</h2><p>Conçu par Microsoft en copiant clairement Google sur tous les points, <a href="http://www.bing.com/">Bing</a> n‘a jamais vraiment réussi à inquiéter Google. Pourtant, Microsoft avait soi-disant réalisé un test qui prouvait que ses résultats étaient meilleurs que ceux de Google… Malgré son éternelle 2ème place ils est néanmoins un très bon moteur de recherche.</p><p>Personnellement, en tant que développeur, j’aime bien leur <a href="https://azure.microsoft.com/fr-fr/services/cognitive-services/bing-web-search-api/">API de recherche</a> qui m’a bien servi pour certains projets.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-b4OF5PB9jJWH6KlkrQPz6g.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="twitter-l-information-live">Twitter : L’information LIVE</h2><p>Si vous cherchez l’actualité immédiate sur un évènement qui se passe en ce moment même, <a href="http://twitter.com">Twitter</a> est votre meilleur allié.</p><p>Twitter n’obéit pas aux mêmes règles que les moteurs de recherches : Il n’a pas à indexer des millions de sites pour en trier l’information. Tout est déjà sur sa plate-forme.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-J54mhLRMrePHTE_N13lOHg.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="google-maps-recherche-de-lieux">Google Maps : Recherche de lieux</h2><p>Bon j’avoue, ce n’est pas une “vraie” alternative à Google, mais cela vaut quand même le détour !</p><p>Avec toujours plus de lieux répertoriés, <a href="https://www.google.fr/maps/">Google Maps</a> permet de rechercher des lieux et de consulter les photos et les avis des utilisateurs. La disposition des résultats sur une carte et le fort côté social en font un moteur de recherche très efficace pour des recherches de restaurants, attractions touristiques et lieux particuliers.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-e41ZL6Z1-jHS9Y-q5xEouw.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="quora-des-questions-et-des-r-ponses">Quora : Des questions et des réponses</h2><p>Comme nous l’avons vu, un moteur de recherche ce n’est pas forcément des résultats soulignés en bleu sur un fond blanc ! <a href="http://quora.com">Quora</a> en est l’exemple : c’est une plate-forme de questions et réponses, un peu comme <a href="https://fr.answers.yahoo.com/">Yahoo Questions/Réponses</a> mais avec des gens intelligents.</p><p>La version anglaise a pratiquement la réponse à tout, tandis que la version française est un peu moins fournie. Et dans tous le cas, vous pouvez toujours poser votre propre question si vous ne trouvez pas ce que vous voulez…</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-18UAPHyJA-i-q9vJN97Wnw.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="siri-alexa-les-assistants-vocaux">Siri / Alexa : Les assistants vocaux</h2><p>2017 est l’année de sortie de l’<a href="https://www.amazon.com/Amazon-Echo-Bluetooth-Speaker-with-WiFi-Alexa/dp/B00X4WHP5E">Amazon Echo</a>, du <a href="https://madeby.google.com/home/">Google Home</a> et du <a href="https://www.apple.com/homepod/">HomePod d’Apple</a>. Tous investissent dans la sortie d’un assistant vocal, même si leur arrivée dans nos salons en intimide plus d’un.</p><p>Ces assistants sont déjà présents sur nos smartphones et sur quelques ordinateurs. Ils nous permettent une recherche vocale et non plus visuelle. Le recherche vocale est pressentie pour remplacer petit à petit la recherche textuelle.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-w4Xe-6_1v1lgZPt5QwNJOw.png" alt="Les Moteurs de Recherche alternatifs à Google"></p>
<!--kg-card-end: markdown--><h2 id="lycos-l-oubli-">Lycos : L’oublié</h2><p>Et pour finir on vous laisse avec <a href="https://www.lycos.fr/">Lycos</a>, qui autrefois faisait concurrence à Google pour ceux qui s’en souviennent (va chercher Lycos !).</p><p>Eh oui, le moteur de recherche est toujours sur internet. C’est moche, c’est kitch et c’est lent, mais ça fait du bien une fois de temps en temps !

</p>]]></content:encoded></item><item><title><![CDATA[Create an open REST API in 2 minutes with Bridge [no code]]]></title><description><![CDATA[Quick tutorial to go from an Excel or CSV file to an open REST API in JSON in just 2 minutes with Bridge.
]]></description><link>https://blog.buddyweb.fr/create-an-open-rest-api-in-2-minutes-with-bridge--no-code-/</link><guid isPermaLink="false">5d653bc628bf700db0aecbd3</guid><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Fri, 01 Sep 2017 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/Create-an-open-REST-API-in-2-minutes-with-Bridge--no-code-/1-FoXfm-dao7RNpUmCxh8lhQ.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/downloaded_images/Create-an-open-REST-API-in-2-minutes-with-Bridge--no-code-/1-FoXfm-dao7RNpUmCxh8lhQ.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-FoXfm-dao7RNpUmCxh8lhQ--1-.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><br>
<em>Bridge is a free tool to create REST APIs for your mocks or Open Data projects.</em></p>
<!--kg-card-end: markdown--><p><em>Quick tutorial to go from an Excel or CSV file to an open REST API in JSON in just 2 minutes with Bridge.</em></p><h3 id="which-kind-of-api-can-we-create"><strong>Which kind of API can we create ?</strong></h3><p><a href="https://getbridgeapp.co/en">Bridge</a> is a free tool that creates and hosts simple APIs. If you need API that calculates the distance from your current position to the moon, it’s definitely not the right tool. But if you just need a standard API that returns a static set of data (GET requests only), this tutorial is made for you.</p><p>We don’t need to install and configure any kind of server (and neither pay for it). Bridge takes care of the dirty work. Basically, we just have to upload the data.</p><h3 id="create-a-new-api"><strong>Create a new API</strong></h3><p>Ok, let’s click on “sign up” and create an account (one step only). Once in the dashboard click on “create a new API”.</p><p>We will pretend that we are a museum that wants to list its works in this example.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-tOiMc-RX4vfDFRRskvD1sw-1.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><br>
<em>Create easily an API for your organisation.</em></p>
<!--kg-card-end: markdown--><p>The API name should be general, like the name of your organisation/project/company… (the museum’s name in our case). You will be able to add spreadsheets later on.</p><h3 id="add-a-spreadsheet-to-our-api"><strong>Add a spreadsheet to our API</strong></h3><p>Let’s continue and click on “add a new spreadsheet”. We are going to upload our Excel or CSV file with the data we want to open.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-KwiwsJ00Lm93NeNWA-dUyg-1.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><br>
<em>We want to import this spreadsheet with a list of works. Notice the “field with no values”, the field is empty for all our works but we could have a 4th work with a value in this field.</em></p>
<!--kg-card-end: markdown--><p>In our example, we will import a simple spreadsheet with a list of the museum’s works. The spreadsheet name will be “works”.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-TGQtyvOBwbul-swmWM44_Q-1.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><br>
<em>Bravo</em></p>
<!--kg-card-end: markdown--><p>That’s it ! The Excel / CSV spreadsheet has been imported in the API and it is now open to the public. If you want to update the data later, you would just need to upload un updated Excel file.</p><p>Back on the API page of “The Peach Museum”, we will click on “see documentation”. If you are a developper, we will instantanelly have 2 thoughts :</p><ul><li>Cool, the doc has been automatically generated !</li><li>Wow, it’s really nice.</li></ul><p>If you are not a developper, just know that this documentation contains all the elements needed for others to connect to your new API.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-2Ioh-g0CPFA5pojxxMWQEg-1.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><br>
<em>Your API documentation is available ! Check the example responses at right, one for each endpoint.</em></p>
<!--kg-card-end: markdown--><p>It was fast, right ? Let’s test what we created.</p><h3 id="test-our-new-rest-api"><strong>Test our new REST API</strong></h3><p>The documentation shows us 2 RESTful endpoints :</p><ul><li>GET /works for the list of works</li><li>GET /works/{id} to get a specific work</li></ul><p>Let’s copy-paste the full URL to see what happens. I am using Postman but you can do it in the web browser you are using right now. As you can see, wee receive clean JSON with our data.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-JyKHJwWb86iq1nQh3YQkLA-1.png" alt="Create an open REST API in 2 minutes with Bridge [no code]"><br>
<em>We receive clean JSON from the API. The “field with no values” is still here because it was in our Excel spreadsheet.</em></p>
<!--kg-card-end: markdown--><p>We can filter those results if we want, using one or several parameters in our HTTP request. Bridge automatically extracts parameters from the uploaded spreadsheets. Just try it yourself :</p><ul><li><a href="https://bridge.buddyweb.fr/api/thepeachmuseum/works?artist=Picasso">https://bridge.buddyweb.fr/api/thepeachmuseum/works?artist=Picasso</a></li></ul><h3 id="retreive-a-single-item"><strong>Retreive a single item</strong></h3><p>There is no “id” property in our data. If it was the case, we could retreive a defined item by its id.</p><p>If there is no “id” column like in our case, Bridge will consider each item’s position in the array as it’s id :1 to get the first item, 2 for the second etc. Technically it’s an “index + 1” :)</p><ul><li><a href="https://bridge.buddyweb.fr/api/thepeachmuseum/works/3">https://bridge.buddyweb.fr/api/thepeachmuseum/works/3</a></li></ul><h3 id="conclusion"><strong>Conclusion</strong></h3><p>We just created an open REST API incredibly fast.</p><p>API URLs are RESTful, on “https” and deliver clean JSON based on your Excel or CSV file.

</p>]]></content:encoded></item><item><title><![CDATA[Créer une API REST sans coder en 2 minutes avec Bridge]]></title><description><![CDATA[Tutoriel rapide et pour passer d’un tableau Excel à une API REST ouverte en 2 minutes avec Bridge.
]]></description><link>https://blog.buddyweb.fr/cr-er-une-api-rest-sans-coder-en-2-minutes-avec-bridge/</link><guid isPermaLink="false">5d653bc628bf700db0aecbe8</guid><category><![CDATA[API]]></category><category><![CDATA[REST]]></category><category><![CDATA[OpenData]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Fri, 01 Sep 2017 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/downloaded_images/Cr-er-une-API-REST-sans-coder-en-2-minutes-avec-Bridge/1-HwDiIRUjUrUNU9yqLnyFCg.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/downloaded_images/Cr-er-une-API-REST-sans-coder-en-2-minutes-avec-Bridge/1-HwDiIRUjUrUNU9yqLnyFCg.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-HwDiIRUjUrUNU9yqLnyFCg.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><br>
<em>Bridge permet de créer rapidement des APIs REST pour vos mocks ou pour des projets d’Open Data</em></p>
<!--kg-card-end: markdown--><p>Tutoriel rapide et pour <strong>passer d’un tableau Excel à une API REST</strong> ouverte en 2 minutes avec <a href="https://bridge.buddyweb.fr">Bridge</a>.</p><h3 id="quelle-genre-d-api-pouvons-nous-cr-er"><strong>Quelle genre d’API pouvons-nous créer ?</strong></h3><p>Bridge est un service gratuit qui permet de créer et d’héberger des APIs ouvertes.</p><p>Nous allons créer une API simple avec des données d’exemple. Si vous voulez une API qui calcule la distance de la terre à la lune, passez votre chemin. Par contre, si vous souhaitez une API qui permette d’accéder à une liste de données simples (requêtes GET seulement), ce tuto est fait pour vous !</p><p>Pas besoin d’installer soi-même un serveur et d’en payer les frais (en temps et en argent). Bridge est là pour réaliser le sale travail.</p><h3 id="cr-er-une-nouvelle-api"><strong>Créer une nouvelle API</strong></h3><p>En cliquant sur “s’inscrire”, nous créons un compte (en une étape) et arrivons sur le dashboard. Il est vide, allons donc créer une nouvelle API !</p><p>Nous allons prendre l’exemple d’un musée qui va référencer ces oeuvres.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-tOiMc-RX4vfDFRRskvD1sw.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><br>
<em>Créez une API simplement pour votre organisation.</em></p>
<!--kg-card-end: markdown--><p>Le nom de l’API doit correspondre au nom de votre organisation ou projet (le musée dans notre cas). Vous pourrez ensuite ajouter plusieurs tableaux de données dans cette API.</p><h3 id="ajouter-un-tableau-de-donn-es"><strong>Ajouter un tableau de données</strong></h3><p>On continue et on clique sur “ajouter un tableau”. Nous allons ici uploader le tableau Excel ou CSV avec les données à intégrer sur l’API.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-KwiwsJ00Lm93NeNWA-dUyg.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><br>
<em>Voici le tableau de la liste des oeuvres du musée. Notez le “field sans valeurs”, il est vide pour les 3 tableaux mais on pourrait avoir un 4ème tableau avec une valeur sur ce champ.</em></p>
<!--kg-card-end: markdown--><p>Dans cet exemple, nous allons importer un tableau des oeuvres disponibles dans notre musée d’exemple. Nous imaginons que ce musée veut rendre public et accessible la liste de ses oeuvres. Le nom du tableau sera “oeuvres”.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-TGQtyvOBwbul-swmWM44_Q.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><br>
<em>Bravo</em></p>
<!--kg-card-end: markdown--><p>Ca y est ! Le tableau a été importé dans l’API et elle est désormais ouverte au public. Pour mettre à jour les données, il vous suffira d’uploader un nouveau fichier Excel actualisé.</p><p>De retour sur la page de l’API du “Musée de la Pomme”, nous allons cliquer sur “voir la doc”. Si vous êtes développeur, instantanément, vous vous dites 2 choses :</p><ul><li>Cool, la documentation a été générée automatiquement !</li><li>Cool, elle est jolie en plus.</li></ul><p>Si vous n’êtes pas développeur, sachez que cette documentation contient tous les éléments nécessaires pour qu’on se connecte à votre nouvelle API.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-2Ioh-g0CPFA5pojxxMWQEg.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><br>
<em>La documentation de l’API a été générée automatiquement ! Vous pouvez voir à droite une example de la réponse pour chaque endpoint.</em></p>
<!--kg-card-end: markdown--><p>Rapide non ? Allons donc tester tout ça.</p><p><strong>Tester notre nouvelle API REST</strong></p><p>Sur la doc, on peut voir qu’on a 2 endpoints (très RESTful) :</p><ul><li>GET /oeuvres pour la liste des oeuvres</li><li>GET /oeuvres/{id} pour une seule oeuvre</li></ul><p>On va donc copier cette adresse pour la tester. Ici j’utilise <a href="https://www.getpostman.com/">Postman</a> mais on peut très bien le faire depuis le navigateur que vous utilisez en ce moment même. Comme vous pouvez le voir, nous recevons du JSON avec les données envoyées.</p><!--kg-card-begin: markdown--><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-JyKHJwWb86iq1nQh3YQkLA.png" alt="Créer une API REST sans coder en 2 minutes avec Bridge"><br>
<em>L’API renvoie un JSON propre. Le “field sans valeurs” est également présent dans la réponse car il était dans le tableau Excel importé.</em></p>
<!--kg-card-end: markdown--><p>Il est également possible de filtrer ces résultats en spécifiant un ou plusieurs paramètres dans notre requête. Bridge a automatiquement généré des paramètres à partir des données fournies. On vous laisse tester par vous-même :</p><ul><li><a href="https://bridge.buddyweb.fr/api/museedelapomme/oeuvres?artiste=Picasso">https://getbridgeapp.co/api/museedelapomme/oeuvres?artiste=Picasso</a></li></ul><h3 id="r-cup-rer-un-l-ment-unique">Récupérer un élément unique</h3><p>Il n’y a pas de propriété “id” dans les données que nous avons fourni. Si c’était le cas, nous aurions pu recevoir un élément spécifique en fournissant son id.</p><p>Néanmoins, si aucun “id” n’est spécifié, Bridge va considérer la position de l’élément dans le tableau comme “id” : 1 pour récupérer le 1er élément, 2 pour le 2ème, etc. Techniquement il s’agit de “index + 1” :)</p><ul><li><a href="https://bridge.buddyweb.fr/api/museedelapomme/oeuvres/3">https://getbridgeapp.co/api/museedelapomme/oeuvres/3</a></li></ul><h3 id="conclusion"><strong>Conclusion</strong></h3><p>Nous avons créé une API REST ouverte au public très rapidement. L‘API est en “https” et la réponse est en JSON.

</p>]]></content:encoded></item><item><title><![CDATA[Développeurs : Maîtrisez les changements d’environnement (local, production)]]></title><description><![CDATA[On a tous vécu ce bug-surprise qui n’apparait qu’en production. Tout allait bien en local, puis une fois déployé, c’est le drame.
]]></description><link>https://blog.buddyweb.fr/developpeurs-maitrisez-les-changements-d-environnement/</link><guid isPermaLink="false">5d653bc628bf700db0aecbe1</guid><category><![CDATA[Developpeur]]></category><category><![CDATA[agence développement application web]]></category><category><![CDATA[agence développement web]]></category><category><![CDATA[agence developpement web paris]]></category><category><![CDATA[Agence application mobile]]></category><category><![CDATA[Agence digitale]]></category><category><![CDATA[agence mobile]]></category><category><![CDATA[Agence site mobile paris]]></category><category><![CDATA[agence site mobile]]></category><category><![CDATA[Agence web]]></category><category><![CDATA[agence web design]]></category><category><![CDATA[agence web design paris]]></category><category><![CDATA[agence web paris]]></category><category><![CDATA[Création site web paris]]></category><category><![CDATA[Création site professionnel]]></category><category><![CDATA[développement application web]]></category><category><![CDATA[développement application web paris]]></category><category><![CDATA[web design agency paris]]></category><category><![CDATA[Web Design]]></category><category><![CDATA[web design agency]]></category><dc:creator><![CDATA[Bruno Pérez]]></dc:creator><pubDate>Fri, 07 Apr 2017 00:00:00 GMT</pubDate><media:content url="https://blog.buddyweb.fr/content/images/2019/08/1-I0ye8dbdbfOU_H9A6qmN4w.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.buddyweb.fr/content/images/2019/08/1-I0ye8dbdbfOU_H9A6qmN4w.png" alt="Développeurs : Maîtrisez les changements d’environnement (local, production)"><p><img src="https://blog.buddyweb.fr/content/images/2020/01/1-I0ye8dbdbfOU_H9A6qmN4w.png" alt="Développeurs : Maîtrisez les changements d’environnement (local, production)"></p>
<!--kg-card-end: markdown--><p>On a tous vécu ce bug-surprise qui n’apparait qu’en production. Tout allait bien en local, puis une fois déployé,<strong> c’est le drame</strong>.</p><p>Avoir une <strong>maîtrise des environnements</strong> (local, pré-production, production) permet d’éviter <strong>99,99%*</strong> de ces problèmes (voir la conclusion pour le petit astérisque). En plus de cela, vous allez gagner du temps et votre code sera plus solide et <em>safe</em>.</p><blockquote></blockquote><p>On fait communément la différence entre l’environnement <strong>local</strong> (ou développement, en gros: mon ordinateur) et <strong>remote</strong> (serveur distant de pré-production ou production).</p><p>On appelle <strong>production</strong> la version “live”, c’est celle qui est utilisée par vos utilisateurs et qui tourne en ce moment même. Vous êtes actuellement sur la version de production de Medium.</p><p>La <strong>pré-production</strong> est un environnement à part entière qui peut être sur le même serveur que la production ou non. Il a pour but de réaliser des tests et validations avant le déploiement en production.</p><h2 id="les-variables-d-environnement">Les variables d’environnement</h2><p>Comme son nom l’indique les variables d’environnement dépendent de l’environnement dans lequel l’application est installée. Examples : l’URL de l’application ou de l’API, les identifiants (base de données, services tiers…), les configurations, etc.</p><p>Quel que soit votre techno, les bonnes pratiques nous poussent à réunir toutes ces variables dans <strong>un seul et même fichier</strong>.</p><p>Dotenv (.env) est un design pattern disponible sous forme de module pour quasiment <a href="https://www.npmjs.com/browse/keyword/dotenv">tous les languages</a>. Même le mal-aimé (ou bien-aimé) Wordpress dispose de solutions comme <a href="https://roots.io/bedrock/">Bedrock</a> qui intègrent <strong>dotenv</strong>.</p><p>Prenons l’example de l’utilisation de <strong>dotenv</strong> du framework Laravel :</p><!--kg-card-begin: code--><pre><code>APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

[...]</code></pre><!--kg-card-end: code--><p>C’est simple, non ?</p><p>Notez que ce fichier s’appelle <strong>.env.example</strong> et non pas <strong>.env</strong> car le “vrai” fichier <strong>.env</strong> est personnel et privé (il ne doit jamais être commité sur <em>git</em>). Chaque développeur est prié de copier ce fichier, de le renommer en <strong>.env</strong> et de remplir ses propres identifiants. Rien d’autre, tout est là.</p><p>Cela permet d’<strong>améliorer la sécurité</strong> car il n’y pas d’identifiants qui se promènent en dur dans le code. Cette pratique permet aussi de <strong>faciliter la collaboration</strong> avec d’autres développeurs qui pourront faire tourner rapidement votre app.</p><p>En plus des identifiants, on peut aussi <strong>réaliser des actions différentes</strong> en fonction de l’environnement dans lequel on est.</p><p>Dans l’exemple ci-dessous, on récupère l’adresse email d’un vendeur (sales person) pour lui envoyer un email. Dans un environnement local ou de pré-production (<em>staging</em>), l’email ne sera pas envoyé au vrai vendeur mais sur un mail de test (le mien). Pour finir, ce mail de test est également stocké dans une variable d’environnement <em>TEST_EMAIL</em>, ce qui fait que les développeurs avec qui je collabore pourront le recevoir sur leur propre email :</p><!--kg-card-begin: code--><pre><code>public function getSalesPersonEmail()
{
    if (env('APP_ENV') == 'local' || env('APP_ENV') == 'staging') {
        return env('TEST_EMAIL');
    }
    return $this-&gt;sales_person_email;
}</code></pre><!--kg-card-end: code--><p>Ce type de code doit être <strong>fréquent</strong> dans votre application. Cela va vous permettre de pouvoir utiliser l’application en profondeur <strong>sans rien changer</strong> au code.</p><h2 id="les-task-runners-gulp-webpack-grunt-">Les task runners (Gulp, Webpack, Grunt…)</h2><p>Si vous utilisez des task runners, différencier les environnements vous apporte des avantages :</p><ul><li>Rapidité de compilation en ne minimifiant les images et assets qu’en production</li><li>Sécurité : ne générer des sourcemaps qu’en local</li><li>Propreté : ne pas polluer votre code de développement avec de l’<em>inline-css</em> ou des scripts de web analytics par exemple</li></ul><p>Je vais prendre <a href="http://gulpjs.com/">Gulp</a> comme example mais on peut le faire avec d’autres task runners. Le module <a href="https://www.npmjs.com/package/gulp-util">gulp-util</a> permet de faire la différence entre</p><!--kg-card-begin: code--><pre><code>gulp</code></pre><!--kg-card-end: code--><p>et</p><!--kg-card-begin: code--><pre><code>gulp —-production</code></pre><!--kg-card-end: code--><p>Une fois téléchargé le module, vous pouvez l’utiliser dans votre <em>gulpfile.js</em>. Le code ci-dessous permet de minimifier (avec <em>uglify</em>) en environnement de production uniquement :</p><!--kg-card-begin: code--><pre><code>var gulp = require('gulp'),
    // ajouter les autres dépendances ici
    util = require('gulp-util');

// deux points d'exclamation pour changer le undefined en false
var production = !!util.env.production;

// pour le tester vous-même
console.log(production);

gulp.task('scripts', function () {
  return gulp.src([
    // ajouter vos dépendences 
  ])
      .pipe(concat('all.js'))
      .pipe(production ? uglify() : util.noop())
      .pipe(gulp.dest('./dist/js'));
});</code></pre><!--kg-card-end: code--><h2 id="la-virtualisation">La virtualisation</h2><p>On ne peut pas parler de différences d’environnement sans parler de virtualisation bien entendu. La virtualisation a reproduire un système sur un autre. Example : je développe mon application sous Mac mais mon serveur de production est sous Linux, je vais donc créer une machine virtuelle Linux pour mon développement.</p><p>L’objectif est simple : <strong>travailler en se rapprochant le plus possible de l’environnement de production.</strong></p><p>Si j’utilise Apache (MAMP, WAMP et autres) en local et que mon serveur de production fonctionne avec NGINX, je ne peux pas prévoir les erreurs qui vont se produire après mon déploiement.</p><p>J’utilise <a href="https://www.vagrantup.com/">Vagrant</a> pour résoudre ce problème. <a href="https://www.docker.com/">Docker</a> est un outil permettant une approche différente qui est de plus en plus adopté par les développeurs.</p><p>Attention : la virtualisation ne reproduit en aucun cas les performances d’un serveur de production. Si votre application est gourmande en ressources, il faut le tester dans un environnement similaire.</p><h3 id="est-ce-que-c-est-obligatoire">Est-ce que c’est obligatoire ?</h3><p>Personnellement j’ai eu l’habitude pendant longtemps de ne pas créer d’environnement virtuel pour les “petits” projets. Ma réponse était la suivante: <em>“Je connais mes serveurs et mon environnement local, il n’y aura pas de problème”</em>. Ce manque de considération m’a parfois joué des tours et m’a forcé à passer beaucoup de temps sur des petites choses. Je recommande donc de le faire <strong>pour tous les projets</strong>. Gardez en tête qu’une minime différence de version de PHP ou NodeJS peut vous bloquer totalement votre application.</p><h2 id="conclusion">Conclusion</h2><p>Comme vous avez pu le constater, cet article présente une vision générale et non pas détaillée des problématiques liées au changement d’environnement. Chaque technologie est différente et vous trouverez de très bons articles adaptée à votre cas en cherchant sur internet.</p><p>Maîtriser les changements d’environnement apporte de la solidité dans votre code, réduit nettement les possibilités de bugs, améliore la sécurité et la collaboration avec d’autres développeurs.</p><p>Tout cela aux prix de quelques lignes de code en plus, qui vous feront gagner bien plus de temps qu’elle n’ont prit à être écrites !</p><p><em>*Pourquoi éviter 99,99% des problèmes et pas 100% ? Pour cela, il faudrait un environnement parfaitement identique lors du développement et de la production, ce qui n’est pas possible dans la pratique. Mais cela relève plus du détail qu’autre chose. Allez, au travail !</em>

</p>]]></content:encoded></item></channel></rss>