<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Demily Clément</title>
    <description>The latest articles on Forem by Demily Clément (@demily_clement).</description>
    <link>https://forem.com/demily_clement</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F204916%2F4dcd4e85-8cae-41f4-ae78-4ffbed8f4415.jpg</url>
      <title>Forem: Demily Clément</title>
      <link>https://forem.com/demily_clement</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/demily_clement"/>
    <language>en</language>
    <item>
      <title>Recoding my portfolio using Gatsby 🤘</title>
      <dc:creator>Demily Clément</dc:creator>
      <pubDate>Tue, 11 Aug 2020 07:21:43 +0000</pubDate>
      <link>https://forem.com/demily_clement/recoding-my-portfolio-using-gatsby-4mm3</link>
      <guid>https://forem.com/demily_clement/recoding-my-portfolio-using-gatsby-4mm3</guid>
      <description>&lt;p&gt;Hello everyone ! 👋&lt;/p&gt;

&lt;p&gt;In this article I will give you feedback on my portfolio's develpment with &lt;a href="https://jamstack.wtf/" rel="noopener noreferrer"&gt;JAMstack&lt;/a&gt; using &lt;a href="https://github.com/gatsbyjs/gatsby" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A little background
&lt;/h2&gt;

&lt;p&gt;I have a personal website / blog / portfolio for the past 10 years ... where I occasionally write my moods, tech favorites and tutorials. (mostly in French)&lt;br&gt;
Over time, this project has been used as a sandbox to learn new skills. &lt;br&gt;
In 2010, a first version was created with &lt;strong&gt;Wordpress&lt;/strong&gt; hosted directly in-house 🤘 It was roots, but it allowed me to see how &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;MySQL&lt;/strong&gt;, &lt;strong&gt;Apache2&lt;/strong&gt; worked ... in short, everything you need to host a web application.&lt;br&gt;
Then around 2013 changed to &lt;strong&gt;Jekyll&lt;/strong&gt;, which allowed me very quickly to familiarize myself with the &lt;strong&gt;Ruby&lt;/strong&gt; environment (and its ecosystem like &lt;strong&gt;Gem&lt;/strong&gt; and &lt;strong&gt;Bundler&lt;/strong&gt; ).&lt;br&gt;
We are now in 2020, and it's time to change and ride the &lt;strong&gt;JAMstack&lt;/strong&gt; hype train! 🚞&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Gatsby?
&lt;/h2&gt;

&lt;p&gt;To begin, I really like using &lt;strong&gt;React&lt;/strong&gt;. I hesitated a bit to use &lt;strong&gt;Create-React-App&lt;/strong&gt;, being familiar with this tool (at Picto Acccess, we use this boilerplate for some of our apps). Having heard more and more about the &lt;strong&gt;JAMstack&lt;/strong&gt;, I told myself that it was the ideal paradigm to give my portfolio a fresh look!&lt;br&gt;
I looked around and chose &lt;strong&gt;Gatsby&lt;/strong&gt; because of the many benefits it offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A growing community (more than 46k stars on Github)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A wide choice of &lt;a href="https://www.gatsbyjs.org/plugins/" rel="noopener noreferrer"&gt;plugins&lt;/a&gt; / &lt;a href="https://www.gatsbyjs.org/starters/?v=2" rel="noopener noreferrer"&gt;themes&lt;/a&gt; are available directly on the official website&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's easy to get started (especially if you are familiar with &lt;strong&gt;React&lt;/strong&gt;!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved performance (obviously ... since it is a static site)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Has a lot of similarity with &lt;strong&gt;CRA&lt;/strong&gt;: hot reloading, a development environment very easy to use and a ready-to-use build script. 🙌&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.gatsbyjs.org/docs/graphql-concepts/" rel="noopener noreferrer"&gt;GraphQL support&lt;/a&gt;: A GraphQL server runs alongside your application, allowing you to retrieve all kinds of data related to your project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evolution: with all the different plugins, I could possibly upgrade my static site using a &lt;a href="https://www.lafabriquedunet.fr/blog/headless-cms/" rel="noopener noreferrer"&gt;Headless CMS&lt;/a&gt; for exemple.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Show-time !
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.demily-clement.com/" rel="noopener noreferrer"&gt;Here's the link to my new portfolio&lt;/a&gt;, in French. (I'll play with some i18n plugins later !). Feel free to give me some feedback!&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start ?
&lt;/h2&gt;

&lt;p&gt;The documentation for Gatsby is clear: &lt;a href="https://www.gatsbyjs.org/docs/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. You'll find a tutorial as well as a "Quick Start" part.&lt;br&gt;
If you don't want to start "from scratch", you can use the starters offered by &lt;a href="https://www.gatsbyjs.org/starters/?v=2" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt;, or even use &lt;a href="//https:%20//%20www%20.stackbit.com%20/"&gt;Stackbit&lt;/a&gt; which allows you, in a few clicks, to generate a complete site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment &amp;amp; hosting 🧙🏼‍♀️
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gatsby&lt;/strong&gt; ultimately generates static files, therefore you’ll have plenty of choice to host them.&lt;/p&gt;

&lt;p&gt;As for me, the old version of my personal site was hosted using Github Pages. This is a free solution, powered by Github. You can have have private repositories with a free account, it's a solid option. You'll find &lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;here the documentation&lt;/a&gt; to host your static site on Github Pages.&lt;/p&gt;

&lt;p&gt;For this new version, I chose to host my application using &lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;. Netlify offers different services including automatic SSL certificate generation (HTTPS), CDN, continuous integration and also what they call "notifications", which allows you to integrate forms on your static site (limited to 100 notifications per month for the free version).&lt;br&gt;
Netlify also takes care of building &amp;amp; deploying your application from a simple push to your master branch, just like Github Pages.&lt;br&gt;
Best of all, the integration is very easy: just click on the "New site from Git" button on the dashboard and choose the right repository. You can add a few more configurations, if you wish ... and that's it!&lt;/p&gt;

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

&lt;p&gt;I strongly recommend you to test &lt;strong&gt;Gatsby&lt;/strong&gt;, which for me offers good benefits by removing a bunch of constraints related to setups, builds &amp;amp; deployments, which ultimately allows us to focus on what really matter.&lt;/p&gt;

&lt;p&gt;Thanks for reading and good code! 👋&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.stackbit.com/" rel="noopener noreferrer"&gt;Stackbit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>gatsby</category>
      <category>graphql</category>
    </item>
    <item>
      <title>Docker + bash : This tip can save your time ! ⏰</title>
      <dc:creator>Demily Clément</dc:creator>
      <pubDate>Mon, 03 Aug 2020 07:05:45 +0000</pubDate>
      <link>https://forem.com/demily_clement/docker-bash-this-tip-can-save-your-time-353n</link>
      <guid>https://forem.com/demily_clement/docker-bash-this-tip-can-save-your-time-353n</guid>
      <description>&lt;p&gt;Today, I'm going to give you a tip on an inattention error with docker that cost me few minutes of my time!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This advice is intended for beginners with docker.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;There are quite a few kinds of docker images, we'll take the &lt;a href="https://hub.docker.com/_/ruby"&gt;&lt;strong&gt;ruby&lt;/strong&gt;&lt;/a&gt; image as an example.&lt;br&gt;
As you can see, there are different types of images available: buster, slim, alpine, stretch, ...&lt;/p&gt;

&lt;p&gt;Some of these images are based on particular distributions, much lighter (alpine), others come with larger OS &amp;amp; dependencies.&lt;/p&gt;

&lt;p&gt;To package and deploy my application, I chose to use an alpine image. This image has minimum dependencies &amp;amp; pre-installed packages, and therefore ideal for deployment.&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;When you create your dockerfile, you have the option of using the &lt;code&gt;ENTRYPOINT&lt;/code&gt; &amp;amp;&lt;code&gt;CMD&lt;/code&gt; directives at the end of your file. These directives allow you to execute commands and to call scripts that you could have previously created.&lt;/p&gt;

&lt;p&gt;If you are used to using bash to execute your script, you must have written the following line in your script file header: &lt;code&gt;# /bin/bash&lt;/code&gt;.&lt;br&gt;
This tells the terminal (inside docker) to use &lt;code&gt;bash&lt;/code&gt; to run this script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;When you launch docker with the dockerfile, it might doing nothing: no script starts, leaving you without an error message. 😨&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;As said before, the alpine images are very light and do not embed superfluous dependencies. You must either install &lt;code&gt;bash&lt;/code&gt; using the &lt;code&gt;RUN&lt;/code&gt; directive in your dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  RUN apk add &lt;span class="nt"&gt;--no-cache&lt;/span&gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Either change your script to make it compatible with the &lt;code&gt;sh&lt;/code&gt; shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# / bin / sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hope I have been clear on how to fix this. &lt;br&gt;
I wish you all a happy coding ! 🐳 ✨&lt;/p&gt;

</description>
      <category>docker</category>
      <category>bash</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Development and productivity tools on Mac 👩‍💻 👨‍💻</title>
      <dc:creator>Demily Clément</dc:creator>
      <pubDate>Fri, 24 Jul 2020 09:57:31 +0000</pubDate>
      <link>https://forem.com/demily_clement/tools-for-developing-on-mac-53pc</link>
      <guid>https://forem.com/demily_clement/tools-for-developing-on-mac-53pc</guid>
      <description>&lt;p&gt;Hello everyone ! 👋&lt;/p&gt;

&lt;p&gt;I recently had to re-install my development environment on Mac. I took the opportunity to sort out the utilities &amp;amp; software that I use on a daily basis. So I share with you this list of tools that allow me to be productive!&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;p&gt;We will first install &lt;a href="https://brew.sh/index_fr"&gt;Brew&lt;/a&gt;, then we will configure our new terminal (&lt;a href="https://www.iterm2.com/"&gt;iterm2&lt;/a&gt;).&lt;br&gt;
Then we will install some interesting extensions of &lt;a href="https://code.visualstudio.com/"&gt;visual studio code&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Brew
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://brew.sh/index_fr"&gt;Brew&lt;/a&gt; is a package manager for mac. It allows you to install command line programs as well as graphics programs. I offer you a small list of utilities &amp;amp; software that I use daily.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  nvm &lt;span class="c"&gt;# node version manager&lt;/span&gt;
  nmap &lt;span class="c"&gt;# network utils&lt;/span&gt;
  curl &lt;span class="c"&gt;# make resquests via terminal&lt;/span&gt;
  jsonpp &lt;span class="c"&gt;# json pretty print&lt;/span&gt;
  imagemagick &lt;span class="c"&gt;# image utils&lt;/span&gt;
  catimg &lt;span class="c"&gt;# cat image in terminal&lt;/span&gt;
  dive &lt;span class="c"&gt;# inspect docker images&lt;/span&gt;
  git &lt;span class="c"&gt;# Source Control Manager&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew cask &lt;span class="nb"&gt;install
  &lt;/span&gt;cakebrew &lt;span class="c"&gt;# homebrew GUI&lt;/span&gt;
  google-chrome &lt;span class="c"&gt;# web browser&lt;/span&gt;
  visual-studio-code &lt;span class="c"&gt;# IDE&lt;/span&gt;
  imageoptim &lt;span class="c"&gt;# optimize pictures utils&lt;/span&gt;
  mtmr &lt;span class="c"&gt;# touchbar utils&lt;/span&gt;
  postman &lt;span class="c"&gt;# request API utils&lt;/span&gt;
  graphiql &lt;span class="c"&gt;# same as postman, but specific for graphql&lt;/span&gt;
  docker &lt;span class="c"&gt;# Docker desktop&lt;/span&gt;
  iterm2 &lt;span class="c"&gt;# Alternative terminal&lt;/span&gt;
  psequel   &lt;span class="c"&gt;# Postgres GUI interface&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Iterm2 configuration
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ohmyz.sh/"&gt;Oh my zsh&lt;/a&gt; is an open source framework that allows you to easily manage your zsh configuration. You can install themes, plugins ...&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Open Iterm2, and install &lt;a href="https://ohmyz.sh/"&gt;oh my zsh&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then advise you to install the "Powerline Fonts" fonts (&lt;a href="https://github.com/powerline/fonts"&gt;here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;You will then have to change the preferences and themes directly on iterm2 ("session" menu) to choose a theme that you like with a "Powerline Fonts" font.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vscode configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install extensions
&lt;/h3&gt;

&lt;p&gt;You will find here several types of extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for languages &amp;amp; snippets (jsx, toml, js, react, rails)&lt;/li&gt;
&lt;li&gt;Themes &amp;amp; graphic enhancement (material theme, bracket pair colorizer, LogFileHighlighter, rainbow-csv, ...)&lt;/li&gt;
&lt;li&gt;Productivity (json-pretty-printer, vscode-eslint, guides, vscode-wakatime, ...)&lt;/li&gt;
&lt;li&gt;git utilities (gitlens, git-graph)&lt;/li&gt;
&lt;li&gt;New features (gc-excelviewer, vscode-docker, vsliveshare, ...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;File: &lt;code&gt;vs_code_extensions_list.txt&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;blanu.vscode-styled-jsx
bungcip.better-toml
CoenraadS.bracket-pair-colorizer
DavidAnson.vscode-markdownlint
dbaeumer.vscode-eslint
eamodio.gitlens
emilast.LogFileHighlighter
Equinusocio.vsc-community-material-theme
Equinusocio.vsc-material-theme
equinusocio.vsc-material-theme-icons
euskadi31.json-pretty-printer
esbenp.prettier-vscode
formulahendry.auto-rename-tag
GrapeCity.gc-excelviewer
HookyQR.beautify
Hridoy.rails-snippets
karigari.chat
kisstkondoros.vscode-gutter-preview
mechatroner.rainbow-csv
mhutchie.git-graph
mikestead.dotenv
ms-azuretools.vscode-docker
MS-CEINTL.vscode-language-pack-fr
ms-vsliveshare.vsliveshare
ms-vsliveshare.vsliveshare-audio
ms-vsliveshare.vsliveshare-pack
slevesque.vscode-zipexplorer
spywhere.guides
TabNine.tabnine-vscode
WakaTime.vscode-wakatime
wix.vscode-import-cost
xabikos.JavaScriptSnippets
xabikos.ReactSnippets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, run vscode &amp;amp; install vscode in the &lt;strong&gt;PATH&lt;/strong&gt; (&lt;a href="https://code.visualstudio.com/docs/setup/mac"&gt;more info here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Then, create the file &lt;code&gt;vs_code_extensions_list.txt&lt;/code&gt; with the contents of the extensions. Then run the following command, which will install the extensions listed in this file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;vs_code_extensions_list.txt | xargs &lt;span class="nt"&gt;-n&lt;/span&gt; 1 code &lt;span class="nt"&gt;--install-extension&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Vscode settings configuration
&lt;/h3&gt;

&lt;p&gt;Here is an excerpt from my &lt;code&gt;settings.json&lt;/code&gt; file, which you can use to configure your IDE &amp;amp; extensions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"window.zoomLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"breadcrumbs.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workbench.colorTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dracula"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.tabSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.wordWrap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnPaste"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.wordWrapColumn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.minimap.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.smoothScrolling"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.minimap.showSlider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mouseover"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.minimap.maxColumn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.cursorStyle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"block"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.cursorBlinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"phase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.insertSpaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"terminal.external.osxExec"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iTerm.app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.shell.osx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zsh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files.associations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*.inky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"slim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"javascriptreact"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files.exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/.git"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/.svn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/.hg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/CVS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/.DS_Store"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files.watcherExclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/.git/objects/**"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/.git/subtree-cache/**"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"**/node_modules/*/**"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[ruby]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jnbt.vscode-rufo"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[json]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HookyQR.beautify"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascript]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[javascriptreact]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[html]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HookyQR.beautify"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"[jsonc]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitlens.views.repositories.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitlens.views.fileHistory.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitlens.views.lineHistory.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitlens.views.compare.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitlens.views.search.location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gitlens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gitlens.advanced.messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"suppressLineUncommittedWarning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files.autoSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"off"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"guides.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"diffEditor.renderSideBySide"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extensions.ignoreRecommendations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"javascript.updateImportsOnFileMove.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"always"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"git.confirmSync"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"workbench.statusBar.visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"git-graph.maxDepthOfRepoSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"git.showPushSuccessNotification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tabnine.experimentalAutoImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auto-rename-tag.activationOnLanguage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roboto Mono for Powerline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scm.inputFontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Roboto Mono for Powerline"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And There you go ! 👏&lt;/p&gt;

&lt;p&gt;Do not hesitate to suggest tools that are useful to you on a daily basis!&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources and useful links
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://brew.sh/index_fr"&gt;Brew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iterm2.com/"&gt;Iterm2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ohmyz.sh/"&gt;Oh my zsh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cakebrew.com/"&gt;Cakebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Toxblh/MTMR"&gt;MTMR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://imageoptim.com/fr"&gt;ImageOptim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/intl/fr_fr/chrome/"&gt;Google Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.psequel.com/"&gt;Psquel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/powerline/fonts"&gt;Powerline Fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://demily-clement.com"&gt;My personal website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mac</category>
      <category>brew</category>
      <category>setup</category>
    </item>
    <item>
      <title>Using GraphQL apollo client in Redux-Thunks actions</title>
      <dc:creator>Demily Clément</dc:creator>
      <pubDate>Fri, 13 Mar 2020 15:15:30 +0000</pubDate>
      <link>https://forem.com/demily_clement/using-graphql-apollo-client-in-redux-thunks-actions-5dcm</link>
      <guid>https://forem.com/demily_clement/using-graphql-apollo-client-in-redux-thunks-actions-5dcm</guid>
      <description>&lt;p&gt;Hi everyone 👋&lt;/p&gt;

&lt;p&gt;React-Apollo is the go to library to use graphQL alongside React. Their documentation is really cool and comprehensive, but they promote the usage of React Hooks to perform all your requests.&lt;br&gt;
Regarding your frontend architecture, you may not be thrill by the idea of letting all your React components handling these kind of responsibility. &lt;br&gt;
In my case, we were integrating GraphQL within an existing frontend app with React, React-redux and redux-thunk. The code is written the way that all network API calls are executed via redux actions (using redux thunk).&lt;/p&gt;

&lt;p&gt;Assuming you have knowledge of redux-thunk and React-Apollo, I will show some basic example of actions.&lt;/p&gt;

&lt;p&gt;For these examples, I will use a public GraphQL API :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Arjun-sna/directions_graphql/"&gt;https://github.com/Arjun-sna/directions_graphql/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.graphqlbin.com/v2/z71NUw"&gt;https://www.graphqlbin.com/v2/z71NUw&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import ApolloClient from "apollo-client";
import { InMemoryCache } from "apollo-cache-inmemory";
import { HttpLink } from "apollo-link-http";
import { setContext } from "apollo-link-context";
import * as UserUtils from "../utils/user";

const cache = new InMemoryCache();
const link = new HttpLink({
  uri: `https://directions-graphql.herokuapp.com/graphql`
});

const authLink = setContext((_, { headers }) =&amp;gt; {
  const token = UserUtils.getTokenFromLocalStorage();

  return {
    headers: {
      ...headers,
      authorization: token
    }
  };
});

const client = new ApolloClient({
  cache,
  link: authLink.concat(link)
});

export default client;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import gql from 'graphql-tag';
import graphQlClient from "client"

export const signUp = (username = "johndoe", email = "john.doe@test.com", password = "mypassword") =&amp;gt; (dispatch, getState) =&amp;gt; {
  dispatch(setLoading(true))

  graphQlClient
    .mutate({
      mutation: gql`
        mutation($username: String!, $email: String!, $password: String!) {
          signUp(username: $username, email: $email, password: $password) {
            user {
              id,
              username,
              email
            }
          }
        }
      `,
      variables: { username, email, password },
      update: (_cache, result) =&amp;gt; {
        const { data: { signUp: { user: { username, email } } } } = result
        dispatch(signIn(email, password))
      },
    })
    .catch((error) =&amp;gt; {
      console.log('error', error)
    })
    .finally(() =&amp;gt; {
      dispatch(setLoading(false))
    })
}

const setTokenToLocalStorage = (token) =&amp;gt; {
  localStorage.setItem('token', token)
}

const getTokenFromLocalStorage = () =&amp;gt;
  localStorage.getItem("token") || null;

export const signIn = (email, password) =&amp;gt; (dispatch, getState) =&amp;gt; {
  dispatch(setLoading(true))

  graphQlClient
    .mutate({
      mutation: gql`
        mutation($email: String!, $password: String!) {
          signIn(userIdentifier: $email, password: $password") {
              token
          }
        }
      `,
      variables: { email, password },
      update: (_cache, result) =&amp;gt; {
        const { data: { signIn: { token} }} = result
        dispatch(setTokenToLocalStorage(token))
      },
    })
    .catch((error) =&amp;gt; {
      console.log('error', error)
    })
    .finally(() =&amp;gt; {
      dispatch(setLoading(false))
    })
}

export const direction = (coordinates = {startLat: 50.6333, startLng: 3.0667, endLat: 48.8534, endLng: 2.3488} , travelMode = "driving" ) =&amp;gt; (dispatch, getState) =&amp;gt; {
  dispatch(setLoading(true))

  graphQlClient.
    graphQlClient.query({
      query: gql`
        input PlaceCoordinatesInput {
          startLat: Float!
          startLng: Float!
          endLat: Float!
          endLng: Float
        }

        enum AllowTravelModes {
          transit
          driving
          walking
        }

        query($coordinates: PlaceCoordinatesInput!, $travelMode: AllowTravelModes!) {
          direction(coordinates: $coordinates, travelMode: $travelMode) {
            steps {
              stepInstruction
            }
          }
        }
      `,
      variables: { coordinates , travelMode },
    }).then((result) =&amp;gt; {
      const { data: { direction } } = result
      dispatch(doSomethingWithDirection(direction))
    })    
    .catch((error) =&amp;gt; {
      console.log('error', error)
    })
    .finally(() =&amp;gt; {
      dispatch(setLoading(false))
    })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the sake of the example I used default values for the actions parameters.&lt;br&gt;
As you can see, you easily manipulate graphql apollo client inside redux thunks actions.&lt;/p&gt;

&lt;p&gt;To conclude, I will share you some links to help you during your journey of learning GraphQL and react-apollo as well as the repository containing the source code of these examples. &lt;/p&gt;

&lt;p&gt;Documentation :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/docs/react/"&gt;https://www.apollographql.com/docs/react/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/docs/tutorial/client/"&gt;https://www.apollographql.com/docs/tutorial/client/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Further reads :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.hasura.io/graphql/react"&gt;https://learn.hasura.io/graphql/react&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/43471623/apollo-client-mutation-error-handling"&gt;https://stackoverflow.com/questions/43471623/apollo-client-mutation-error-handling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/clementdemily/react-redux-thunks-apollo-graphql"&gt;https://github.com/clementdemily/react-redux-thunks-apollo-graphql&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>graphql</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
