<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Benjamin Rancourt</title>
    <description>The latest articles on DEV Community by Benjamin Rancourt (@benjaminrancourt).</description>
    <link>https://dev.to/benjaminrancourt</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%2F182034%2F8ce6408f-9756-46de-b32c-390f1c1dacfb.jpg</url>
      <title>DEV Community: Benjamin Rancourt</title>
      <link>https://dev.to/benjaminrancourt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benjaminrancourt"/>
    <language>en</language>
    <item>
      <title>Happy Holidays! 🎁</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Fri, 24 Dec 2021 00:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/happy-holidays-3kg1</link>
      <guid>https://dev.to/benjaminrancourt/happy-holidays-3kg1</guid>
      <description>&lt;p&gt;I don't know about you, but I've been busy at work this week with the &lt;a href="https://cyber.gc.ca/en/alerts/active-exploitation-apache-log4j-vulnerability"&gt;Apache Log4j vulnerability&lt;/a&gt;, trying to make sure our major system vendors had secured them properly! It tired me a little bit at the end of the day, so I didn't have the energy to write you a technical article this week! 😴&lt;/p&gt;

&lt;p&gt;But wait, I still have two hours before 7.15 PM to write something pretty interesting... Well, I have no ideas so I'm going to take a break and show you what I bought for Christmas instead! 🎄&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HPM2Ji76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2021-12-23-personal-desktop.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HPM2Ji76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2021-12-23-personal-desktop.jpg" alt="" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Merry Christmas to me! 🎅&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are two &lt;a href="https://www.samsung.com/us/computing/monitors/flat/27--led-monitor-with-borderless-design-lf27t350fhnxza/"&gt;Samsung 27" monitors&lt;/a&gt;! As I now work remotely full time, I needed to have monitors with better resolutions, because the code was really small in my "&lt;a href="https://www.dell.com/en-ca/work/shop/laptops-ultrabooks/new-latitude-7210-2-in-1-business-detachable-laptop/spd/latitude-12-7210-2-in-1-laptop"&gt;New Latitude 7210 2-in-1 Business Detachable Laptop&lt;/a&gt;" or my previous monitors! 🔍&lt;/p&gt;

&lt;p&gt;So far, these monitors seem ok. We'll see if it's still the case in the long term! 😬&lt;/p&gt;

&lt;p&gt;And that ends this article! I hope to take advantage of the next few weeks to recharge my batteries! 🤖&lt;/p&gt;

&lt;p&gt;Stay safe and happy holidays! 😷&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Create a Chrome Extension to Edit Websites</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Fri, 26 Nov 2021 00:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/how-to-create-a-chrome-extension-to-edit-websites-4817</link>
      <guid>https://dev.to/benjaminrancourt/how-to-create-a-chrome-extension-to-edit-websites-4817</guid>
      <description>&lt;h2&gt;
  
  
  Context
&lt;/h2&gt;

&lt;p&gt;Have you ever been on a website that you would like to have a different layout? Or that some functionalities were just missing and could simply be implemented?&lt;/p&gt;

&lt;p&gt;You can choose to go to another similar site, but sometimes, there may be no suitable alternative and you are stuck with it... 😕&lt;/p&gt;

&lt;p&gt;Imagine you were a developer for the company that maintains that website, you could simply improve it to suit your needs... Unfortunately, you are probably not an employee or you may be not allowed to change it... 🙁&lt;/p&gt;

&lt;p&gt;Fortunately, there is something you can do and it's simpler than you think: you could &lt;strong&gt;create a Google Chrome extension&lt;/strong&gt;. Continue to read this tutorial to learn how to. 🤓&lt;/p&gt;

&lt;h2&gt;
  
  
  What will you learn?
&lt;/h2&gt;

&lt;p&gt;In this tutorial, in about five minutes, you should learn:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to create a minimal Chrome extension&lt;/li&gt;
&lt;li&gt;How to &lt;strong&gt;load it&lt;/strong&gt; into your browser&lt;/li&gt;
&lt;li&gt;How your extension can modify the HTML of a website&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm pretty sure that in under 15 minutes, you'll have a simple Chrome extension working in your browser. Are you ready? 🙃&lt;/p&gt;

&lt;h2&gt;
  
  
  Example of a website you may want to alter
&lt;/h2&gt;

&lt;p&gt;But before beginning, let's see a fictitious example of a case you would like to modify the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction"&gt;DOM&lt;/a&gt; of a website, with the homepage of &lt;a href="https://www.cinoche.com/"&gt;www.cinoche.com&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I really want to &lt;strong&gt;point out&lt;/strong&gt; that I have nothing against this website, I just needed to have a concrete example of a website I could edit. As I love to watch movies, this site was one of the first websites I thought of. In fact, I ❤️ Cinoche.com. 😉&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0eji0eL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2021-11-24-cinoche-before.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0eji0eL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2021-11-24-cinoche-before.jpg" alt="" width="880" height="552"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Screenshot of Cinoche.com.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You might not notice it, but there is a big space in the right section where the news are displayed. What is causing this incorrect layout? An advertisement was present but was removed by the &lt;a href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm"&gt;uBlock Origin&lt;/a&gt; extension. Since it didn't remove the &lt;code&gt;div&lt;/code&gt; parent, the &lt;code&gt;flex&lt;/code&gt; layout no longer works... 😟&lt;/p&gt;
&lt;h2&gt;
  
  
  Create the manifest.json file
&lt;/h2&gt;

&lt;p&gt;Inside an empty folder, create a &lt;code&gt;manifest.json&lt;/code&gt; file with the content below. It's the file that gives the browser &lt;strong&gt;information about your extension&lt;/strong&gt; (and the users if you publish it). This is the &lt;strong&gt;only required&lt;/strong&gt; file that every browser extension needs to function.&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;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Make Cinoche Great Again"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;&lt;em&gt;The first version of the manifest.json file, where the three required attributes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These attributes tell us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;manifest_version&lt;/strong&gt; : the version of the manifest. &lt;code&gt;3&lt;/code&gt; is the latest version available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;name&lt;/strong&gt; : the name of our extension.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;version&lt;/strong&gt; : the version of our extension.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And we are done! All necessary code has been written! In our case, our extension is pretty useless for now, but we can go ahead and add it to Chrome! 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Load your extension into your browser
&lt;/h2&gt;

&lt;p&gt;Now go to &lt;a href="https://dev.tochrome://extensions/"&gt;chrome://extensions&lt;/a&gt; and click on the " &lt;strong&gt;Load unpacked&lt;/strong&gt;" button to select the directory of your custom extension. To see the three buttons, the "Developer mode" on the right must be enabled.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VXalDaqR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/chrome-extensions-page.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VXalDaqR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/chrome-extensions-page.jpg" alt="" width="500" height="354"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Screenshot of my chrome://extensions page, with only one extension.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You should now see your extension on the same page! Congratulation! 🥳&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9LMq1D6P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/chrome-extension-with-our-extension.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9LMq1D6P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/chrome-extension-with-our-extension.jpg" alt="" width="513" height="352"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Your extension should now appear on the chrome://extensions page.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you need to edit any file in the selected directory, you'll need to click on the update button to reload the extension into Chrome. Otherwise, your changes won't appear on your extension.&lt;/p&gt;

&lt;p&gt;Now, let's see how we could add some functionalities to our extension. 😃&lt;/p&gt;
&lt;h2&gt;
  
  
  Inject a script to modify a website
&lt;/h2&gt;

&lt;p&gt;Do you remember our &lt;a href="https://www.cinoche.com/"&gt;example website&lt;/a&gt;? If you go there and open the &lt;a href="https://developer.chrome.com/docs/devtools/"&gt;DevTools&lt;/a&gt; (with &lt;code&gt;F12&lt;/code&gt;), you can type this simple line of code to fix our bug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div.featured-box-right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;In my example, it doesn't take a lot of code to improve our experience, right? 😆&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you have tried it, you have seen the layout has been arranged but, if you refresh the page, your changes wouldn't be saved... 😭&lt;/p&gt;

&lt;p&gt;How could we inject our little script on each page of the website? Let's put the previous code inside a new file named &lt;code&gt;cinoche.js&lt;/code&gt;. But now, we have to tell the extension that this code exists and needs to be injected on every page.&lt;/p&gt;

&lt;p&gt;Reopen the &lt;code&gt;manifest.json&lt;/code&gt; of your extension and add a &lt;strong&gt;&lt;a href="https://developer.chrome.com/docs/extensions/mv3/content_scripts/"&gt;content_scripts&lt;/a&gt;&lt;/strong&gt; attribute that looks like:&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;"content_scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"js"&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="s2"&gt;"cinoche.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matches"&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="s2"&gt;"https://www.cinoche.com/*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="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;This attribute tells our extension to inject a JavaScript file named &lt;code&gt;cinoche.js&lt;/code&gt; (&lt;code&gt;js&lt;/code&gt;) when the current URL &lt;a href="https://developer.chrome.com/docs/extensions/mv3/content_scripts/#matchAndGlob"&gt;matches&lt;/a&gt;&lt;code&gt;https://www.cinoche.com/*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You should now have a file that looks like below:&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;"content_scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"js"&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="s2"&gt;"cinoche.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matches"&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="s2"&gt;"https://www.cinoche.com/*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Make Cinoche Great Again"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.1.0"&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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : you may have noticed that I've incremented its version. Doing this make it easier to know if your extension has been successfully reloaded and that you have the latest changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may now reload your extension on &lt;a href="https://dev.tochrome://extensions"&gt;chrome://extensions&lt;/a&gt; and come back to &lt;a href="https://www.cinoche.com/"&gt;www.cinoche.com&lt;/a&gt; to see the final result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SV-yYQxm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2021-11-24-cinoche-after.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SV-yYQxm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2021-11-24-cinoche-after.jpg" alt="" width="880" height="552"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Screenshot of Cinoche.com, after our extension has removed the empty div.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As our extension injects our script into every page of the domain, you should add protection to make sure your script doesn't fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;featureBoxRight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div.featured-box-right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;featureBoxRight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;featureBoxRight&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Our script now makes sure that the feature box exists before trying to remove it.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One last tip&lt;/strong&gt; : the auto-injected script is equivalent to opening the DevTools and pasting it there. So, if there is any error or logs, you will see them in the console. 🤖&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;In this tutorial, you should have learned the basics to create a Chrome extension. If you want to learn more about that, you should read the &lt;a href="https://developer.chrome.com/docs/extensions/mv3/"&gt;official documentation on Chrome Developers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are a lot more attributes and customizations that you could add to your extension, but you'll learn them from me in another tutorial! 🧐&lt;/p&gt;

&lt;p&gt;Good luck! ✌️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>development</category>
    </item>
    <item>
      <title>How to Install Manjaro</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Fri, 19 Nov 2021 00:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/how-to-install-manjaro-1m46</link>
      <guid>https://dev.to/benjaminrancourt/how-to-install-manjaro-1m46</guid>
      <description>&lt;p&gt;Over the previous years, I had to install &lt;a href="https://manjaro.org/"&gt;&lt;strong&gt;Manjaro&lt;/strong&gt;&lt;/a&gt; a couple of times and to ease the process for the next time, I began to document more and more the command I typed. You will find below the procedure that I will try to follow the next time I want to install this distribution.  🤓&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt; : this procedure may be &lt;em&gt;incomplete&lt;/em&gt; or may be &lt;em&gt;not working on your setup&lt;/em&gt;. Follow it cautiously. 🚸&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Create a bootable USB
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the distribution on the &lt;a href="https://manjaro.org/download/"&gt;official website&lt;/a&gt;, such as the &lt;a href="https://manjaro.org/downloads/official/xfce/"&gt;XFCE edition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Insert a USB key into your computer&lt;/li&gt;
&lt;li&gt;Open a terminal&lt;/li&gt;
&lt;li&gt;Make yourself a superuser with &lt;code&gt;sudo su&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Take note of the path of the inserted USB key with &lt;code&gt;fdisk -l&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Burn the ISO on the USB key with &lt;code&gt;dd bs=4M if=/home/ranb2002/Downloads/manjaro-xfce-21.1.6-minimal-211017-linux513.iso of=/dev/sda status=progress&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Remove the USB key&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  BIOS configuration
&lt;/h2&gt;

&lt;p&gt;Depending on your computer, you may need to activate the &lt;a href="https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface"&gt;UEFI&lt;/a&gt; mode to be able to boot from your USB key:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Insert your USB key and restart the computer&lt;/li&gt;
&lt;li&gt;Repeatedly press on &lt;code&gt;ESC&lt;/code&gt; on your keyboard to enter the BIOS when your computer is booting&lt;/li&gt;
&lt;li&gt;Activate the UEFI&lt;/li&gt;
&lt;li&gt;Boot from the USB key&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Just follow the instructions on your screen! 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Install applications
&lt;/h2&gt;

&lt;p&gt;Some applications may exist only on the &lt;a href="https://aur.archlinux.org/"&gt;AUR repository&lt;/a&gt;. If it is not already activated, you can look at &lt;a href="https://www.fosslinux.com/2103/how-to-install-google-chrome-in-manjaro-linux.htm"&gt;this tutorial&lt;/a&gt; to activate it with &lt;em&gt;Package Manager&lt;/em&gt;.&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;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# (su) Multiple applications from AUR #&lt;/span&gt;
&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# Switch to the super user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su

&lt;span class="c"&gt;# Make sure all installed applications are up to date&lt;/span&gt;
pacman &lt;span class="nt"&gt;-Syyu&lt;/span&gt;

&lt;span class="c"&gt;# Install applications with pacman&lt;/span&gt;
pacman &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  noto-fonts-emoji &lt;span class="se"&gt;\&lt;/span&gt;
  dnsutils &lt;span class="se"&gt;\ &lt;/span&gt;
  dockbarx &lt;span class="se"&gt;\&lt;/span&gt;
  docker &lt;span class="se"&gt;\&lt;/span&gt;
  firefox-beta-bin &lt;span class="se"&gt;\&lt;/span&gt;
  firefox-nightly &lt;span class="se"&gt;\&lt;/span&gt;
  google-chrome &lt;span class="se"&gt;\&lt;/span&gt;
  google-chrome-beta &lt;span class="se"&gt;\&lt;/span&gt;
  google-chrome-dev &lt;span class="se"&gt;\&lt;/span&gt;
  gradle &lt;span class="se"&gt;\&lt;/span&gt;
  gradle-doc &lt;span class="se"&gt;\&lt;/span&gt;
  jdk11-openjdk &lt;span class="se"&gt;\&lt;/span&gt;
  jetbrains-toolbox &lt;span class="se"&gt;\&lt;/span&gt;
  nvm &lt;span class="se"&gt;\&lt;/span&gt;
  sshfs &lt;span class="se"&gt;\&lt;/span&gt;
  system-config-printer &lt;span class="se"&gt;\&lt;/span&gt;
  teams &lt;span class="se"&gt;\&lt;/span&gt;
  vim &lt;span class="se"&gt;\&lt;/span&gt;
  vmware-horizon-client &lt;span class="se"&gt;\&lt;/span&gt;
  vmware-keymaps &lt;span class="se"&gt;\&lt;/span&gt;
  xfce4-dockbarx-plugin

&lt;span class="nb"&gt;exit&lt;/span&gt;

&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# Node.js #&lt;/span&gt;
&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# Finish the setup of NVM&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source /usr/share/nvm/init-nvm.sh'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;

&lt;span class="c"&gt;# Install the latest version of NVM&lt;/span&gt;
nvm &lt;span class="nb"&gt;install &lt;/span&gt;16.13.0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nvm use 16.13.0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nvm &lt;span class="nb"&gt;alias &lt;/span&gt;default 16.13.0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; node &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# (su) Misc #&lt;/span&gt;
&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# Switch to the super user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su

&lt;span class="c"&gt;# Disable Linux PC speaker beep permanently&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"blacklist pcspkr"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/modprobe.d/nobeep.conf

&lt;span class="c"&gt;# Set ntp so that the clock is set to the correct time&lt;/span&gt;
timedatectl set-ntp &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# (su) Docker #&lt;/span&gt;
&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# Start Docker now&lt;/span&gt;
systemctl start docker

&lt;span class="c"&gt;# Start Docker when starting the computer&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker

&lt;span class="c"&gt;# Show the version of Docker (ex. Docker version 20.10.9, build c2ea9bc90b)&lt;/span&gt;
docker &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Add your user ID to the docker group to be able to manage it as non-root&lt;/span&gt;
usermod &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; docker ranb2002

&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# (su) Restart #&lt;/span&gt;
&lt;span class="c"&gt;#######################################&lt;/span&gt;
&lt;span class="c"&gt;# Restart the computer&lt;/span&gt;
shutdown &lt;span class="nt"&gt;--reboot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Generate SSH keys
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Generate SSH keys with ssh-keygen
ssh-keygen -t ed25519 -C "ranb2002-laptop"
ssh-keygen -t rsa -b 4096 -C "ranb2002-laptop"

# See the generated keys
cat ~/.ssh/id_ed25519.pub
cat ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check your settings&lt;/span&gt;
git config &lt;span class="nt"&gt;--list&lt;/span&gt;

&lt;span class="c"&gt;# Set your identity&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Benjamin Rancourt"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email benjamin.rancourt@email.com

&lt;span class="c"&gt;# Set Vim as default editor for Git&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.editor vim

&lt;span class="c"&gt;# Set some useful aliases (https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases)&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.co checkout
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.br branch
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.ci commit
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.st status

&lt;span class="c"&gt;# https://www.stefanjudis.com/snippets/a-git-alias-to-show-a-detailed-git-branch-overview/&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.zup &lt;span class="s2"&gt;"for-each-ref --sort='authordate:iso8601' --format='%(color:green)%(authordate:relative)%09%(color:white)%(refname:short) / %(contents:subject)' refs/heads"&lt;/span&gt;

&lt;span class="c"&gt;## Unstage a file (git unstage fileA)&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.unstage &lt;span class="s1"&gt;'reset HEAD --'&lt;/span&gt;

&lt;span class="c"&gt;## See the last commit easily (git last)&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.last &lt;span class="s1"&gt;'log -1 HEAD'&lt;/span&gt;

&lt;span class="c"&gt;## Set the push default config to simple&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; push.default simple

&lt;span class="c"&gt;## Add Git completion&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"source ~/git-completion.bash"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc

&lt;span class="c"&gt;## Add Git branch name to bash prompt&lt;/span&gt;
&lt;span class="c"&gt;# Follow instructions on https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt&lt;/span&gt;

&lt;span class="c"&gt;# TODO To document correctly&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Upgrade
&lt;/h2&gt;

&lt;p&gt;If you want to update applications and dependencies on your computer:&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;# Via pacman&lt;/span&gt;
&lt;span class="c"&gt;# Switch to the super user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su

pacman &lt;span class="nt"&gt;-Syu&lt;/span&gt;
pacman &lt;span class="nt"&gt;--sync&lt;/span&gt; &lt;span class="nt"&gt;--refresh&lt;/span&gt; &lt;span class="nt"&gt;--sysupgrade&lt;/span&gt;

&lt;span class="c"&gt;# Or, via pamac&lt;/span&gt;
pamac update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hopes it could also help you if you want this distribution! 😇&lt;/p&gt;

</description>
      <category>bash</category>
      <category>devops</category>
      <category>tooling</category>
      <category>programming</category>
    </item>
    <item>
      <title>Au revoir UdeS!</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Fri, 12 Nov 2021 00:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/au-revoir-udes-1g8d</link>
      <guid>https://dev.to/benjaminrancourt/au-revoir-udes-1g8d</guid>
      <description>&lt;p&gt;Après &lt;strong&gt;plus de cinq années&lt;/strong&gt; à travailler pour le &lt;a href="https://www.usherbrooke.ca/sti/"&gt;Service des technologies de l'information&lt;/a&gt; de l'&lt;strong&gt;&lt;a href="https://www.usherbrooke.ca/"&gt;Université de Sherbrooke&lt;/a&gt;&lt;/strong&gt;, j'ai décidé dernièrement qu'il était temps pour moi d'aller relever de nouveaux défis dans une autre organisation de la région. Je terminerai donc mon emploi à l'Université le vendredi 19 novembre prochain. 🙂&lt;/p&gt;

&lt;p&gt;Ce ne fut pas une décision facile et je sais déjà qu'il va y avoir un élément qui va me manquer : les relations que j'ai avec mes &lt;strong&gt;collègues&lt;/strong&gt;. Juste en l'annonçant à ceux-ci, plusieurs me sont revenus avec des commentaires positifs et cela m'a fait encore plus réalisé comment ils vont me manquer. 🥲&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w_c5_JAC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/20211029_152224.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w_c5_JAC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/20211029_152224.jpg" alt="" width="880" height="660"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Adieu également à mon bureau, qui ne sera prochainement plus autant décoré!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Heureusement pour moi, je suis sûr que nous aurons l'occasion de se recroiser à quelque part! Surtout que ce n'est pas les événements en TI qui manquent à Sherbrooke : &lt;a href="https://www.meetup.com/fr-FR/techno-drinks/"&gt;Techno Drinks&lt;/a&gt;, &lt;a href="https://agilesherbrooke.ca/"&gt;Agile Sherbrooke&lt;/a&gt; et &lt;a href="https://societic.ca/"&gt;SociéTIC&lt;/a&gt;. 🥳&lt;/p&gt;

&lt;p&gt;Ce sera bientôt un nouveau départ! 😇&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Psst, pour ceux et celles se demandant où est-ce que je m'en va, je devrais bientôt être en mesure de vous le dire, j'attends prochainement ma lettre d'embauche officielle! 😉&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>How to migrate projects from Subversion to Git with svn2git 🦅</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 04 Nov 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/how-to-migrate-projects-from-subversion-to-git-with-svn2git-3jam</link>
      <guid>https://dev.to/benjaminrancourt/how-to-migrate-projects-from-subversion-to-git-with-svn2git-3jam</guid>
      <description>&lt;p&gt;Do you remember &lt;a href="https://subversion.apache.org/"&gt;Subversion&lt;/a&gt; (also known as SVN)? 🤔 Unfortunately, there is still a few teams that still use it, but ultimately want to migrate them to a better option: &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;. 🤖&lt;/p&gt;

&lt;p&gt;If you still hesitate to take some time to do this migration, rest assured, it doesn't take too much time with a simple tool named &lt;strong&gt;&lt;a href="https://github.com/nirvdrum/svn2git"&gt;svn2git&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is svn2git?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;svn2git&lt;/strong&gt; is a small tool for migrating projects from Subversion to Git. It is useful to use it if you want to keep the full history of the project. All commits, as well their authors, dates and comments, will be kept for all branches, the &lt;em&gt;trunk&lt;/em&gt; (main branch) and tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install it?
&lt;/h2&gt;

&lt;p&gt;Depending on your operating system and the tools you are using, the command to install &lt;code&gt;svn2git&lt;/code&gt; may differ. In my case, as I use &lt;a href="https://www.manjaro.org/"&gt;Manjaro&lt;/a&gt; as my Linux distribution and the &lt;a href="https://github.com/Jguer/yay"&gt;yay&lt;/a&gt; tool to install dependencies from &lt;a href="https://aur.archlinux.org/"&gt;AUR&lt;/a&gt; (&lt;em&gt;Arch User Repository&lt;/em&gt;), I just have to type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yay &lt;span class="nt"&gt;--sync&lt;/span&gt; ruby-svn2git

&lt;span class="c"&gt;# or&lt;/span&gt;
yay &lt;span class="nt"&gt;-S&lt;/span&gt; ruby-svn2git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voilà, it is now installed!&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Preparation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Variables
&lt;/h4&gt;

&lt;p&gt;To simplify the commands you are going to type, I suggest that first put together some information that you will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PROJECT_NAME&lt;/strong&gt; : The name of your project, used to create a new empty folder, (like &lt;code&gt;rabbit-cms&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVN_PROJECT_URL&lt;/strong&gt; : The URL of your old SVN repository (like &lt;code&gt;svn+ssh://svn.benjaminrancourt.ca/projects&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GIT_PROJECT_URL&lt;/strong&gt; : The URL of your new Git repository (it doesn't need to be created first) (like &lt;code&gt;git@gitlab.com:ranb2002/rabbit-cms.git&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have all the information, export them to your terminal so that you can use them as variables:&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;export &lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rabbit-cms
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SVN_PROJECT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;svn+ssh://svn.benjaminrancourt.ca/projects/rabbit-cms
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GIT_PROJECT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;git@gitlab.com:ranb2002/rabbit-cms.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Authors file
&lt;/h4&gt;

&lt;p&gt;Before using the tool, you will also need to prepare a file named &lt;code&gt;authors.txt&lt;/code&gt; which will contains all the information about the authors that have committed in your project (username, full name and email address). The file looks like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ranb2002 = Benjamin Rancourt &amp;lt;noreply@BenjaminRancourt.ca&amp;gt;
(no author) = Unknown user &amp;lt;unknown@BenjaminRancourt.ca&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your project has a lot of collaborators, it may take a while to gather the necessary information. Fortunately, there is a command to list at least their usernames:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;svn log &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SVN_PROJECT_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"r[0-9]+ &lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt; .+ &lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;'|'&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/ //g'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should produce a list of usernames, like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;outb3145
ranb2002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the list produced to complete your author's file (&lt;code&gt;authors.txt&lt;/code&gt;) according to the previous&lt;br&gt;&lt;br&gt;
syntax. If you are unable to find the email address of a retired colleague (such as &lt;code&gt;Joe Bloe&lt;/code&gt;), use a fictitious email such as &lt;code&gt;Joe.Bloe@BenjaminRancourt.ca&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Export the SVN project
&lt;/h3&gt;

&lt;p&gt;To make sure you don't commit unwanted files, I suggest you clone your SVN project into a new folder:&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;# Go to your Desktop directory, or elsewhere&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Desktop

&lt;span class="c"&gt;# Make sure to copy the authors file here&lt;/span&gt;

&lt;span class="c"&gt;# Create a new empty directory for your project&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally, run the svn2git utility:&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;# Print the beginning date&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s1"&gt;'+%Y-%m-%d %H:%M:%S'&lt;/span&gt;

&lt;span class="c"&gt;# Run the svn2git with the authors file defined previously&lt;/span&gt;
&lt;span class="nb"&gt;time &lt;/span&gt;svn2git &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SVN_PROJECT_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--authors&lt;/span&gt; ../authors.txt 

&lt;span class="c"&gt;# Print the finishing date&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s1"&gt;'+%Y-%m-%d %H:%M:%S'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As it can run for a while, I added the &lt;code&gt;date&lt;/code&gt; commands and the &lt;code&gt;time&lt;/code&gt; command to know how long it took. For some projects, it may take several hours, but it usually takes around fifteen minutes. ⏲️&lt;/p&gt;

&lt;h3&gt;
  
  
  Create the Git project
&lt;/h3&gt;

&lt;p&gt;If there were no errors, you should now have a local Git repository for your project. 🎉 But, unless you are only working on your computer, you might want to push the code to your Git server.&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;# Add the Git repository as origin&lt;/span&gt;
git remote add origin &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_PROJECT_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Push all branches to the origin&lt;/span&gt;
git push &lt;span class="nt"&gt;--all&lt;/span&gt; origin

&lt;span class="c"&gt;# Push all tags to the origin&lt;/span&gt;
git push &lt;span class="nt"&gt;--tags&lt;/span&gt; origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clean up
&lt;/h3&gt;

&lt;p&gt;If you look at the tags created in GitLab or GitHub, you may see some incorrect tags. 🤨 You are probably going to want to delete them.&lt;/p&gt;

&lt;p&gt;For example, if you have tags that look like &lt;code&gt;VERSION@REVISION&lt;/code&gt; (like &lt;code&gt;1.26@19330&lt;/code&gt;), use the following command to remove them:&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;# Delete the remote tags&lt;/span&gt;
git push &lt;span class="nt"&gt;-d&lt;/span&gt; origin &lt;span class="si"&gt;$(&lt;/span&gt;git tag &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s2"&gt;"*@*"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Delete the local tags&lt;/span&gt;
git tag &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;git tag &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s2"&gt;"*@*"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have other tags that you don't want, just adapt the regex used previously and run the new commands!&lt;/p&gt;

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

&lt;p&gt;Hope this post helps you to get rid of Subversion once and for all. 😉&lt;/p&gt;

</description>
      <category>devops</category>
      <category>git</category>
      <category>code</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Objectifs SMARTIES</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 28 Oct 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/objectifs-smarties-1jgd</link>
      <guid>https://dev.to/benjaminrancourt/objectifs-smarties-1jgd</guid>
      <description>&lt;p&gt;Je suis présentement entrain de faire du ménage dans mes notes personnelles et je suis tombé sur mes notes relatives aux &lt;strong&gt;objectifs SMARTIES&lt;/strong&gt;. Ayant constaté que &lt;a href="https://www.rvezina.com/blogue/les-objectifs-smarties"&gt;ma source&lt;/a&gt; mène maintenant vers une page 404 (heureusement disponible sur &lt;a href="https://web.archive.org/web/20190415083432/https://www.rvezina.com/blogue/les-objectifs-smarties"&gt;WaybackMachine&lt;/a&gt;), j'ai décidé réapprendre le concept et de vous le présenter. En espérant que cela vous soit utile la prochaine fois que vous définirerez vos objectifs!&lt;/p&gt;

&lt;p&gt;Mais avant de parler des trois dernières lettres ( &lt;strong&gt;IES&lt;/strong&gt; ), revenons sur ce qu'est un &lt;strong&gt;&lt;a href="https://fr.wikipedia.org/wiki/Objectifs_et_indicateurs_SMART"&gt;objectif SMART&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  S.M.A.R.T.
&lt;/h2&gt;

&lt;p&gt;Plutôt que décrire de long en large un sujet qui a déjà été largement expliqué, voyons quelques définitions simples :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spécifique&lt;/strong&gt; : doit être &lt;strong&gt;précis&lt;/strong&gt; tout en étant &lt;strong&gt;simple à comprendr&lt;/strong&gt; e&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mesurable&lt;/strong&gt; : être en mesure de le &lt;strong&gt;quantifier&lt;/strong&gt; , de le &lt;strong&gt;qualifier&lt;/strong&gt; ou de le &lt;strong&gt;mesurer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atteignable&lt;/strong&gt; : compte tenu du temps et des efforts à mettre, il est &lt;strong&gt;possible&lt;/strong&gt; de le réaliser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Réaliste&lt;/strong&gt; : doit être réaliste et donc &lt;strong&gt;atteignable&lt;/strong&gt; avec les moyens à disposition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporel&lt;/strong&gt; : avoir une &lt;strong&gt;échéance&lt;/strong&gt; précise (date butoir) avec, éventuellement, des dates intermédiaires&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passons maintenant aux fameuses trois nouvelles lettres. 😀&lt;/p&gt;

&lt;h2&gt;
  
  
  I.E.S.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intègre&lt;/strong&gt; : être &lt;strong&gt;conforme aux valeurs&lt;/strong&gt; que vous souhaitez véhiculer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Écologique&lt;/strong&gt; : être en mesure de mesurer l'impact sur l' &lt;strong&gt;environnement&lt;/strong&gt; (sens large) autour de soi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Senti&lt;/strong&gt; : doit être &lt;strong&gt;motivant&lt;/strong&gt; afin d'être enthousiaste face à sa réalisation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certains organismes et certaines personnes ont également définis d'autres mots pour représenter ces trois lettres. Par exemple, &lt;a href="https://bluebridge.ca/viser-haut-mais-viser-juste/"&gt;Blue Bridge&lt;/a&gt; les définis comme étant :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intégrateur&lt;/strong&gt; : être bénéfique pour toutes les parties impliquées (employé, équipe et entreprise par exemple)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Évolutif&lt;/strong&gt; : être en mesure de le faire évoluer en fonction de nouvelles données&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Satisfaisant et valorisant&lt;/strong&gt; : l'atteinte de l'objectif sera valorisant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Peu importe quels mots vous utiliser, le plus important est que vous choissize ceux qui vous interpellent le plus. Dans les cas des objectifs d'équipe, assurez-vous que tout le monde possède la même définition. 😅 De mon côté, je vais rester avec la première définition.&lt;/p&gt;

&lt;p&gt;Voyons maintenant un exemple d'un objectif SMARTIES que je viens de me fixer dans le cadre de cette article. 🥳&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemple
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;D'ici novembre 2022, je souhaite effectuer une deuxième présentation au &lt;a href="https://www.meetup.com/fr-FR/techno-drinks/"&gt;Techno Drinks Sherbrooke&lt;/a&gt; sur un sujet qui m'intéresse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;J'aurais pu définir directement le sujet que je souhaites présenter afin d'être plus &lt;em&gt;spécifique&lt;/em&gt;, mais afin qu'il soit plus &lt;em&gt;évolutif&lt;/em&gt; pour correspondre à mes intérêts du moment, je n'ai pas spécifier le sujet.&lt;/p&gt;

&lt;p&gt;Qu'en pensez-vous? Pensez-vous qu'il répond à tous les critères? 😛&lt;/p&gt;

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

&lt;p&gt;La prochaine fois que vous aurez à fixer des objectifs, vous pourrez maintenant ajouter trois nouvelles dimensions à ceux-ci.&lt;/p&gt;

&lt;p&gt;Bon succès! 😇&lt;/p&gt;

</description>
      <category>french</category>
      <category>goals</category>
      <category>writing</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Sustainable Web Manifesto 📜</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 21 Oct 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/sustainable-web-manifesto-2mhd</link>
      <guid>https://dev.to/benjaminrancourt/sustainable-web-manifesto-2mhd</guid>
      <description>&lt;p&gt;À l'heure où le monde entier parle de plus en plus de l' &lt;strong&gt;urgence climatique&lt;/strong&gt; , nous devons nous aussi, en tant que &lt;strong&gt;professionnels des technologies de l'information&lt;/strong&gt; , voir de quelle façon nous pouvons contribuer à &lt;strong&gt;lutter contre les changements climatiques&lt;/strong&gt;. 🖥️&lt;/p&gt;

&lt;p&gt;C'est dans cette optique que je suis avec intérêt les nouvelles initiatives qui vont dans ce sens-là. Aujourd'hui, je souhaite vous parler d'une initiative débutée l'an dernier nommée : &lt;em&gt;&lt;a href="https://www.sustainablewebmanifesto.com/"&gt;&lt;strong&gt;Sustainable Web Manifesto&lt;/strong&gt;&lt;/a&gt;&lt;/em&gt; (en français : manifeste du Web durable).&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu'est-ce qu'est le &lt;em&gt;Sustainable Web Manifesto&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;Initié par une agence londonienne soucieuse de son impact environnemental, &lt;a href="https://www.wholegraindigital.com/"&gt;Wholegrain Digital&lt;/a&gt;, le &lt;strong&gt;manifeste du Web durable&lt;/strong&gt; est une réponse à l'augmentation de l'utilisation de données sur le Web. 🕸️&lt;/p&gt;

&lt;p&gt;En effet, avec une infrastructure technologique constamment en évolution, les sites Web et les applications Web ont généralement tendance à utiliser de &lt;strong&gt;plus en plus de données&lt;/strong&gt;. 📈&lt;/p&gt;

&lt;p&gt;Nous devons donc nous questionner sur la place grandissante qu'occupe &lt;strong&gt;Internet&lt;/strong&gt; dans les &lt;strong&gt;changements climatiques&lt;/strong&gt;. Selon une comparaison effectuée par les auteurs du manifeste :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;« Si Internet était un pays, il serait le 7&lt;sup&gt;ème&lt;/sup&gt; plus gros pollueur. ».&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cela peut paraître anodin, mais les données stockées sur des serveurs, les données transférées d'un réseau à l'autre et la puissance de calcul nécessaire pour traiter et afficher ces données ont toutes un point en commun : elles consomment de l' &lt;strong&gt;électricité&lt;/strong&gt;. ⚡&lt;/p&gt;

&lt;p&gt;Une infime quantité d'électricité est peut-être utilisée pour transmettre une simple page Web, mais lorsqu'on additionne toutes les utilisations partout sur la planète à chaque jour, cela commence à être une quantité gigantesque. 😵&lt;/p&gt;

&lt;p&gt;Considérant que dans la plupart dans le monde, l'électricité est générée à &lt;a href="https://www.gazprom-energy.fr/gazmagazine/2020/08/le-mix-energetique-mondial-en-2020/"&gt;plus de 84 %&lt;/a&gt; à partir d' &lt;strong&gt;énergies fossiles&lt;/strong&gt; (pétrole, gaz naturel et charbon), nous pouvons donc affirmer qu'Internet contribue présentement à l'émissions de gaz à effet de serre... 😰&lt;/p&gt;

&lt;p&gt;Cela fait un peu peur, n'est-ce pas? Heureusement, si tout le monde commence à suivre les &lt;strong&gt;six principes fondamentaux&lt;/strong&gt; du manifeste, nous pouvons certainement contribuer à &lt;strong&gt;verdir&lt;/strong&gt; le Web. 🐢&lt;/p&gt;

&lt;h2&gt;
  
  
  Quelles sont ses principes fondamentaux?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Propre
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Les services que nous fournissons et les services que nous utilisons seront alimentés par des &lt;strong&gt;énergies renouvelables&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Efficace
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Les produits et services que nous proposons utiliseront &lt;strong&gt;le moins&lt;/strong&gt; d' &lt;strong&gt;énergie&lt;/strong&gt; et de &lt;strong&gt;ressources matérielles&lt;/strong&gt; possible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ouvert
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Les produits et services que nous fournissons seront &lt;strong&gt;accessibles&lt;/strong&gt; , permettront un &lt;strong&gt;échange ouvert d'informations&lt;/strong&gt; et permettront aux utilisateurs de &lt;strong&gt;contrôler leurs données&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Honnête
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Les produits et services que nous fournissons &lt;strong&gt;ne tromperont&lt;/strong&gt; ni &lt;strong&gt;n'exploiteront&lt;/strong&gt; les utilisateurs dans leur conception ou leur contenu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Régénérateur
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Les produits et services que nous fournissons &lt;strong&gt;soutiendront une économie&lt;/strong&gt; qui nourrit les gens et la planète.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Résilient
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Les produits et services que nous fournissons fonctionneront aux &lt;strong&gt;moments&lt;/strong&gt; et aux &lt;strong&gt;endroits&lt;/strong&gt; où les gens en ont &lt;strong&gt;le plus besoin&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Comment signer le manifeste?
&lt;/h2&gt;

&lt;p&gt;Si vous ne l'avez pas déjà fait, vous pouvez signer le manifeste sur son &lt;a href="https://www.sustainablewebmanifesto.com"&gt;site Web officiel&lt;/a&gt;. Celui-ci vous permet d'ajouter votre nom comme signataire et de déclarer votre engagement à créer un &lt;strong&gt;Internet durable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ensemble, nous pouvons faire une différence! 🤗&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>development</category>
      <category>code</category>
      <category>french</category>
    </item>
    <item>
      <title>How to be notified when a new tag has been created on a Docker Hub repository 📧</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 14 Oct 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/how-to-be-notified-when-a-new-tag-has-been-created-on-a-docker-hub-repository-4cdk</link>
      <guid>https://dev.to/benjaminrancourt/how-to-be-notified-when-a-new-tag-has-been-created-on-a-docker-hub-repository-4cdk</guid>
      <description>&lt;p&gt;When I started creating my private architecture on &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; for my projects, I started having a lot of container images that I have to check from time to time &lt;strong&gt;to see if there was a new version&lt;/strong&gt;. It was okay to do that with a small number of images, but as my architecture was just growing, it started to be a bit cumbersome for one person. 🤨&lt;/p&gt;

&lt;p&gt;So I searched on the Internet to see if anyone has found a solution to my problem and, after a while, I fall on a small service named &lt;strong&gt;&lt;a href="https://docker-notify.com/"&gt;docker notify&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is docker-notify?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dVG1Dehu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dVG1Dehu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify.jpg" alt=""&gt;&lt;/a&gt;Screenshot of the "docker notify" service.&lt;/p&gt;

&lt;p&gt;As the name suggests, it allows you to &lt;strong&gt;subscribe to the updates of the containers&lt;/strong&gt; you want to follow. To use this service, simply enter your email address into the email input and click on the "&lt;em&gt;Sign up&lt;/em&gt;" button. You should receive a few seconds later an email containing a link, to log in to the service without a password. 🔑&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Wo870A---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify-email-login.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Wo870A---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify-email-login.jpg" alt=""&gt;&lt;/a&gt;The email you will receive to log in to your account. &lt;/p&gt;

&lt;p&gt;After clicking on the link, you will arrive at the interface that will allow you to &lt;strong&gt;manage the containers&lt;/strong&gt; you are following.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ApK0YN5g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify-update.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ApK0YN5g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify-update.jpg" alt=""&gt;&lt;/a&gt;A screenshot of the container images I am currently following.&lt;/p&gt;

&lt;p&gt;On the left, you can search the name of the image you want to follow and on the right, you can see the images you are currently subscribed to. To unsubscribe from an image, simply click on its name and it will be removed. And don't forget to click on the "&lt;em&gt;Update&lt;/em&gt;" button, otherwise, none of your changes will be saved! 😜&lt;/p&gt;

&lt;p&gt;When someone releases a new version of the containers you are following, you will receive an email as below containing the recently updated containers. 😍&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r9BFSwAd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify-email-updated-tags.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r9BFSwAd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/docker-notify-email-updated-tags.jpg" alt=""&gt;&lt;/a&gt;The latest email that I have received, with three new updates.&lt;/p&gt;

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

&lt;p&gt;Unfortunately, this service works only for Docker Hub, so you can not follow the containers published on the &lt;a href="https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry"&gt;GitHub Container registry&lt;/a&gt;. I hope the maintainers of this service will support it soon but, in the meantime, we will have to follow them manually. 🤭&lt;/p&gt;

&lt;p&gt;So, I hope this service will help keep your containers up to date! 🤗&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>security</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Hacktoberfest 2021 🍂</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 07 Oct 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/hacktoberfest-2021-h55</link>
      <guid>https://dev.to/benjaminrancourt/hacktoberfest-2021-h55</guid>
      <description>&lt;p&gt;Pour une huitième année consécutive, l'&lt;strong&gt;&lt;a href="https://hacktoberfest.digitalocean.com/"&gt;Hacktoberfest&lt;/a&gt;&lt;/strong&gt; est de retour! Qu'est-ce que c'est? L'Hacktoberfest est un &lt;strong&gt;événement virtuel&lt;/strong&gt; visant à &lt;strong&gt;encourager les contributions&lt;/strong&gt; dans la communauté des &lt;a href="https://www.gnu.org/philosophy/free-sw.fr.html"&gt;logiciels libres&lt;/a&gt;. L'événement est &lt;strong&gt;gratuit&lt;/strong&gt; et est &lt;strong&gt;ouvert à tous&lt;/strong&gt; , que vous soyez un développeur ou non. Il commençait le vendredi 1&lt;sup&gt;er&lt;/sup&gt; octobre et se terminera le dimanche 31 octobre, à l'Halloween. 🎃&lt;/p&gt;

&lt;p&gt;L'événement propose un &lt;strong&gt;défi&lt;/strong&gt; : &lt;strong&gt;créer quatre demandes de fusion de branches&lt;/strong&gt; (&lt;em&gt;pull requests&lt;/em&gt; ou &lt;em&gt;merge requests&lt;/em&gt;) de qualité sur n'importe quel projet public (&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; ou &lt;a href="https://gitlab.com/"&gt;GitLab&lt;/a&gt;). Ces demandes doivent être faites sur des projets ayant le sujet &lt;em&gt;hacktoberfest&lt;/em&gt; et comptent lorsqu'ils sont acceptés ou fusionnés.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Comment participer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Si vous souhaitez prendre part à l'événement, vous avez seulement besoin de :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Créer un compte gratuit&lt;/strong&gt; sur &lt;a href="https://github.com/join"&gt;GitHub&lt;/a&gt; ou sur &lt;a href="https://gitlab.com/users/sign_up"&gt;GitLab&lt;/a&gt; (ou les deux), si vous en avez pas un déjà.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://hacktoberfest.digitalocean.com/"&gt;S'inscrire sur la page de l'événement&lt;/a&gt;&lt;/strong&gt;, afin de suivre votre progrès. Vous pouvez vous enregistrer à n'importe quel moment entre aujourd'hui et le 31 octobre. 👻&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contribuer et effectuer quatre demandes de fusion,&lt;/strong&gt; sur n'importe quel projet public (GitHub ou GitLab) &lt;strong&gt;.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Si vous avez des questions sur l'Hacktoberfest, vous pouvez jeter un coup d'œil sur leur &lt;a href="https://hacktoberfest.digitalocean.com/faq"&gt;foire aux questions&lt;/a&gt;, elle est très complète. 🙋&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Récompenses 🏆&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Si vous relevez le défi, &lt;a href="https://www.digitalocean.com/"&gt;DigitalOcean,&lt;/a&gt; une des compagnies derrière l'événement, vous &lt;strong&gt;récompensera&lt;/strong&gt; pour votre contribution à la communauté &lt;em&gt;open-source&lt;/em&gt; avec du &lt;em&gt;swag&lt;/em&gt; : des autocollants et un beau t-shirt confortable comme ceux que j'ai reçus ces dernières années. 👕&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sKxB6YrT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2020-09-12-hacktoberfest-t-shirts.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sKxB6YrT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/2020-09-12-hacktoberfest-t-shirts.jpg" alt=""&gt;&lt;/a&gt;Mes chandails des éditions 2017 à 2019.&lt;/p&gt;

&lt;p&gt;Peu de temps après la fin de l'événement, tous les participants devraient recevoir un courriel pour choisir leur &lt;em&gt;swag&lt;/em&gt;. Les participants auront la possibilité de choisir entre le t-shirt ou faire &lt;strong&gt;don d'un arbre&lt;/strong&gt; dans la &lt;a href="https://tree-nation.com/profile/digitalocean"&gt;forêt de DigitalOcean sur Tree-Nation&lt;/a&gt;. 🌳&lt;/p&gt;

&lt;p&gt;Si vous décidez de prendre le t-shirt, mais que vous souhaitez tout de même compenser vos émissions de carbone, vous pouvez tout de même planter un arbre vous-même sur Tree-Nation.&lt;/p&gt;

&lt;p&gt;De plus, il est également possible que les autres compagnies promouvant l'événement (&lt;a href="https://hacktoberfest.appwrite.io/"&gt;Appwrite&lt;/a&gt;, &lt;a href="http://devmesh.intel.com/"&gt;Intel&lt;/a&gt; et &lt;a href="https://deepsource.io/hacktoberfest/"&gt;DeepSource&lt;/a&gt;) ajoutent quelques autocollants. 🧳 Vous pourrez les coller sur votre ordinateur. 😉&lt;/p&gt;

&lt;p&gt;Afin de recevoir gratuitement votre &lt;em&gt;swag&lt;/em&gt;, vous devrez fournir votre adresse postale. N'ayez crainte, les organisateurs l'utilisent uniquement pour vous envoyer votre colis! 📦&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Buts personnels 🚩&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;L'an dernier, j'avais rajouté un peu de mes couleurs en me donnant des &lt;strong&gt;&lt;a href="https://www.benjaminrancourt.ca/hacktoberfest-2020#personal-goals-"&gt;défis supplémentaires&lt;/a&gt;&lt;/strong&gt;. Bien que j'avais réussi à tous les relever avec succès, je vais cette année me contenter d'écrire cet article et de relever le défi. 🤔&lt;/p&gt;

&lt;p&gt;En effet, avec l'achat d'une maison et bientôt d'une nouvelle automobile, il ne me reste plus beaucoup de temps personnel... Je me reprendrai plus tard cette année! 😅&lt;/p&gt;

&lt;p&gt;Et vous, pensez-vous relever le défi de l'Hacktoberfest 2021? 💪&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Psst, si vous avez besoin d'utiliser la &lt;strong&gt;plateforme de DigitalOcean&lt;/strong&gt; pour effectuer vos contributions et que vous n'avez pas encore de compte, vous pouvez utiliser mon &lt;strong&gt;&lt;a href="https://m.do.co/c/e79694c46dfc"&gt;lien de référence&lt;/a&gt;&lt;/strong&gt; pour recevoir un &lt;strong&gt;crédit de 100 $ US&lt;/strong&gt;. Celui-ci est bon pour 60 jours.   &lt;/p&gt;

&lt;p&gt;En retour, je vais recevoir 25 $ une fois que vous aurez dépenser le même montant. C'est une situation gagnante-gagnante. Merci! 😉&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>hacktoberfest</category>
      <category>news</category>
      <category>git</category>
      <category>programming</category>
    </item>
    <item>
      <title>Best New Features in GitLab 14.2 and 14.3 ⛲</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 30 Sep 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/best-new-features-in-gitlab-142-and-143-29m4</link>
      <guid>https://dev.to/benjaminrancourt/best-new-features-in-gitlab-142-and-143-29m4</guid>
      <description>&lt;p&gt;Last month, on September 22, &lt;a href="https://about.gitlab.com/releases/2021/09/22/gitlab-14-3-released"&gt;&lt;strong&gt;GitLab 14.3&lt;/strong&gt;&lt;/a&gt; was released. It made me realize that I forgot to check the releases notes for the previous version, &lt;a href="https://about.gitlab.com/releases/2021/08/22/gitlab-14-2-released/"&gt;14.2&lt;/a&gt;. 😅&lt;/p&gt;

&lt;p&gt;So, in this post, I'm going to address that by highlighting some of the new features and improvements that you might be interested in. 😬&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;GitLab 14.2&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/08/22/gitlab-14-2-released/#use-cicd-variables-in-include-statements-in-gitlab-ciyml"&gt;Use CI/CD variables in include statements in .gitlab-ci.yml&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;By allowing the use of variables inside the &lt;a href="https://docs.gitlab.com/ee/ci/yaml/index.html#include"&gt;include&lt;/a&gt; keyword, it will open new ways to define CI/CD pipelines. An example is to allow updating of the template in multiple projects through the use of a variable as below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my-group/ci-pipelines'&lt;/span&gt;
  &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$PIPELINE_TEMPLATE_REF&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;templates/main.yml'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
An example of a variable inside the include keyword.





&lt;p&gt;A DevOps engineer could just update the &lt;code&gt;$PIPELINE_TEMPLATE_REF&lt;/code&gt; variable in the group CI variables and all projects would use the new version of the template. Incredible, right? 🤩&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/08/22/gitlab-14-2-released/#stageless-pipelines"&gt;Stageless pipelines&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;One of the main features of this version is the ability to define a pipeline &lt;strong&gt;without stages&lt;/strong&gt;. For some pipelines, this will also add clarity as the &lt;strong&gt;relationships&lt;/strong&gt; between each job will be &lt;strong&gt;explicit&lt;/strong&gt; , instead of being &lt;strong&gt;implicit&lt;/strong&gt;. It should be easier now to introduce GitLab pipelines to newcomers. 🌚&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jXiRmM12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/stack-example-gitlab-14-2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jXiRmM12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/stack-example-gitlab-14-2.jpg" alt="" width="200" height="166"&gt;&lt;/a&gt;For some pipelines, it doesn't make sense to define stages. In this one, all jobs are independent of each other. &lt;/p&gt;

&lt;p&gt;This feature should make to way to remove completely &lt;a href="https://docs.gitlab.com/ee/ci/yaml/#stages"&gt;stages&lt;/a&gt;in GitLab CI. Long live to &lt;a href="https://en.wikipedia.org/wiki/Directed_acyclic_graph"&gt;directed acyclic graphs&lt;/a&gt;!😀&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/08/22/gitlab-14-2-released/#add-pronunciation-to-gitlab-profile-page"&gt;Add pronunciation to GitLab profile page&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C6f3bdFT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/gitlab-pronouced-as.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C6f3bdFT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/gitlab-pronouced-as.jpg" alt="" width="392" height="177"&gt;&lt;/a&gt;I'm still don't know how to write the pronunciation, but at least I tried. 🤓 &lt;/p&gt;

&lt;p&gt;I don't know about you, but the number of people who mispronouncing my name is too high for my liking. 😅&lt;/p&gt;

&lt;p&gt;This feature will be especially useful in helping us learn how to pronounce the names of newcomers. It's the least we can do, right? 👍&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/08/22/gitlab-14-2-released/#display-local-time-on-users-profile"&gt;Display local time on user’s profile&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R05-BW3k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/gitlab-local-time.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R05-BW3k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.benjaminrancourt.ca/images/gitlab-local-time.jpg" alt="" width="679" height="341"&gt;&lt;/a&gt;I still have two hours before my bedtime and I'm currently writing this post. 😉&lt;/p&gt;

&lt;p&gt;If you working with people in different time zones, it could help you not to wait for someone else to answer if it's late where they are. If it is past my bedtime at 10 PM, don't expect an answer from me, I should be sleeping. 😴&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;GitLab 14.3&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/09/22/gitlab-14-3-released/#include-gitlab-cicd-configuration-based-on-conditions"&gt;Include GitLab CI/CD configuration based on conditions&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;By adding rules to the include keyword, we can now only  define one &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; and include some of its parts if certain conditions are met.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# file: /templates/common.gitlab-ci.yml&lt;/span&gt;
&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;__TEMPLATES_COMMON_YML__ &lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;

&lt;span class="c1"&gt;# file: /templates/docker/build.gitlab-ci.yml"&lt;/span&gt;
&lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;local&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/templates/common.gitlab-ci.yml"&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$ __TEMPLATES_COMMON_YML__&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
The build.gitlab-ci.yml file will include the other file only if the &lt;code&gt;$ __TEMPLATES_COMMON_YML__ &lt;/code&gt; variable is evaluated to true.





&lt;p&gt;I hope this will also allow us to include another template if the project contains some files.&lt;/p&gt;

&lt;p&gt;Imagine, instead of manually updating each &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; file to add &lt;a href="https://github.com/hadolint/hadolint"&gt;hadolint&lt;/a&gt; when a repository contains a Docker file, you could simply add your common pipeline and the repository pipeline would build itself! 😲&lt;/p&gt;

&lt;p&gt;This is definitively something that I will be trying soon! ⌛&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/09/22/gitlab-14-3-released/#use-variables-in-other-variables"&gt;Use variables in other variables&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Everyone loves inception, right? I'm sure this new functionality will also help us develop and maintain our pipelines as well. ♾️&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;FLAGS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-al'&lt;/span&gt;
    &lt;span class="na"&gt;LS_CMD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ls&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"$FLAGS"'&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;eval&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"$LS_CMD"'&lt;/span&gt; &lt;span class="c1"&gt;# Executes 'ls -al'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
An example from the &lt;a href="https://docs.gitlab.com/ee/ci/variables/#use-variables-in-other-variables"&gt;documentation&lt;/a&gt;.





&lt;h3&gt;
  
  
  &lt;a href="https://about.gitlab.com/releases/2021/09/22/gitlab-14-3-released/#support-merging-cicd-rules-arrays-with-reference"&gt;Support merging CI/CD rules arrays with !reference&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I started to use the new &lt;a href="https://docs.gitlab.com/ee/ci/yaml/#reference-tags"&gt;!reference&lt;/a&gt; keyword after it was introduced, but I remember that I quickly ran into one of its limitations: we couldn't use it with the rules keyword. It is now a thing of the past! 🌟&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;.no_schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$CI_PIPELINE_SOURCE == "schedule"&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;never&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on_success&lt;/span&gt;

&lt;span class="na"&gt;job1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:latest&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;!reference&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;.no_schedule&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;echo "run except schedules and tags"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
An example that reported a syntax error in previous versions of GitLab.





&lt;p&gt;So, that's it, the latest versions of GitLab have revealed us the new improvements. I look forward to trying them. 🤗&lt;/p&gt;

</description>
      <category>news</category>
      <category>tooling</category>
      <category>programming</category>
      <category>git</category>
    </item>
    <item>
      <title>Upgrading from Java 11 to Java 17</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 23 Sep 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/upgrading-from-java-11-to-java-17-22pf</link>
      <guid>https://dev.to/benjaminrancourt/upgrading-from-java-11-to-java-17-22pf</guid>
      <description>&lt;p&gt;With the release of &lt;strong&gt;&lt;a href="https://openjdk.java.net/projects/jdk/17/"&gt;Java 17&lt;/a&gt;&lt;/strong&gt; on September 14, 2021, those who use only &lt;em&gt;Long Term Support&lt;/em&gt; (LTS) versions will be thrilled to update their Java version! But to use the new functionalities that come with a new version, we must know what are they. 😉&lt;/p&gt;

&lt;p&gt;The list below is the ongoing new features that I think will be useful to my colleagues or myself. It doesn't contain any advanced features (or deep), so if you want to know them, check all the release notes. 😘&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.baeldung.com/java-12-new-features#stringMethods"&gt;Text indentation&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Java 12 introduces a new String function: &lt;code&gt;indent&lt;/code&gt; and as its name says, it helps to &lt;strong&gt;indent a string&lt;/strong&gt; with spaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// From older versions&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Java 12"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;" There is a new indent function."&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Java 12 +&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Java 12"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;release&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"There is a new indent function."&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both versions will produce an output that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Java&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
  &lt;span class="nc"&gt;There&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
The output text from the previous lines of code.





&lt;h2&gt;
  
  
  &lt;a href="https://www.baeldung.com/java-text-blocks"&gt;Text Blocks&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Since Java 15, &lt;strong&gt;multi-line strings&lt;/strong&gt; , more know as &lt;em&gt;Text Blocks&lt;/em&gt; in the Java world, are available.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="s"&gt;"Une ou plusieurs exceptions sont survenues durant l'exécution de la passerelle."&lt;/span&gt;
  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;NEW_LINE&lt;/span&gt;
  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;NEW_LINE&lt;/span&gt;
  &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" **Veuillez vérifier le bon fonctionnement de celle-ci et adaptez le code en conséquence.**"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
 &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
   &lt;span class="s"&gt;"""
     Une ou plusieurs exceptions sont survenues durant l'exécution de la passerelle.

     **Veuillez vérifier le bon fonctionnement de celle-ci et adaptez le code en conséquence.**
   """&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;" **"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;note&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"**"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;NEW_LINE&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"```

"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;getStackTrace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"

```"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;NEW_LINE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"""
    **%s**
    %s
  """&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;formatted&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getStackTrace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It was one of the features that I was looking forward to, as it is available for a long time in JavaScript. 😎&lt;/p&gt;

&lt;p&gt;It is much cleaner, right? 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.baeldung.com/java-14-new-features#switch"&gt;Switch Expressions&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;For this one, I'm am not sure about the readability, but it could prove useful to know someday that there is a way to write &lt;strong&gt;succinct switch expressions&lt;/strong&gt; in Java 14:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;DayOfWeek&lt;/span&gt; &lt;span class="n"&gt;dayOfWeek&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getDayOfWeek&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isTodayHoliday&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;MONDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;TUESDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;WEDNESDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;THURSDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;FRIDAY&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;SATURDAY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;SUNDAY&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"What's a "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="https://www.baeldung.com/java-14-new-features#nullpointer"&gt;Helpful NullPointerExceptions&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Ever had a &lt;em&gt;NullPointerException&lt;/em&gt;? Before Java 14, we needed to debug the code to know exactly what variable had caused the exception. Now, the log will be more precise and will say which variable caused the exception.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Before
Exception in thread "main" java.lang.NullPointerException
at com.baeldung.MyClass.main(MyClass.java:27)

// After
java.lang.NullPointerException: Cannot store to int array because "a" is null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can't wait to see the next time I run across this exception. 🤣&lt;/p&gt;

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

&lt;p&gt;If you find other features that others and I should learn, let me know! 🤘&lt;/p&gt;

&lt;p&gt;Do you plan to upgrade your Java applications to the latest LTS version?&lt;/p&gt;

</description>
      <category>java</category>
      <category>news</category>
      <category>programming</category>
      <category>development</category>
    </item>
    <item>
      <title>Quelle extension de nom de domaine privilégier?</title>
      <dc:creator>Benjamin Rancourt</dc:creator>
      <pubDate>Thu, 16 Sep 2021 23:15:00 +0000</pubDate>
      <link>https://dev.to/benjaminrancourt/quelle-extension-de-nom-de-domaine-privilegier-146k</link>
      <guid>https://dev.to/benjaminrancourt/quelle-extension-de-nom-de-domaine-privilegier-146k</guid>
      <description>&lt;p&gt;Avec &lt;strong&gt;plus de 1 500 extensions&lt;/strong&gt; de nom de domaine possible, il peut être difficile d'effectuer un choix parmi une aussi vaste sélection.&lt;/p&gt;

&lt;p&gt;Heureusement, à moins que vous souhaitez vous distinguer à ce niveau là, vous pouvez choisir une des extensions les plus connues.&lt;/p&gt;

&lt;p&gt;En effet, vos visiteurs sont généralement habitués de voir une extension comme  &lt;code&gt;.com&lt;/code&gt;, &lt;code&gt;.ca&lt;/code&gt;, &lt;code&gt;.org&lt;/code&gt;, &lt;code&gt;.coop&lt;/code&gt;, &lt;code&gt;.info&lt;/code&gt; ou une plus récente, &lt;code&gt;.quebec&lt;/code&gt;. Toutefois, parmi celles-ci laquelle devriez-vous priviligier?&lt;/p&gt;

&lt;p&gt;Voyons quelques points afin de vous aider à effectuer votre choix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Longueur du nom de domaine
&lt;/h3&gt;

&lt;p&gt;Une des différences entre toutes ces extensions est leur longeur. De 2 caractères pour le &lt;code&gt;.ca&lt;/code&gt;, on passe à 5 caractères pour le &lt;code&gt;.quebec&lt;/code&gt;. Bien que ce n'est que quelques caractères, il est important d'en tenir compte pour les personnes devant saisir manuellement l'adresse Web, particulièrement sur mobile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prix
&lt;/h2&gt;

&lt;p&gt;Au niveau du prix, il n'y a pas tant de différence entre le .ca et le .com, le .ca étant seulement quelques dollars de moins que le .com. Par contre, le .quebec lui est beaucoup plus dispendieux! Au moment d'écrire ces lignes, ce dernier coûte plus de 3 fois le coût d'un domaine canadien! 😮&lt;/p&gt;

&lt;p&gt;À moins que vous prévoyez enregistrer beaucoup de noms de domaine différents ou que vous soyez un particulier, je ne vous conseille pas de baser votre décision uniquement sur ce facteur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension .ca
&lt;/h2&gt;

&lt;p&gt;Un autre élément à tenir compte est que les domaines canadiens possèdent &lt;strong&gt;quelques particularités&lt;/strong&gt; qui feront peut-être pencher la balance en leur faveur.&lt;/p&gt;

&lt;p&gt;En effet, seuls les organismes et particuliers &lt;strong&gt;canadiens&lt;/strong&gt; peuvent enregistrer un domaine &lt;code&gt;.ca&lt;/code&gt;. L'extension est donc un bon indicateur d'une présence canadienne.&lt;/p&gt;

&lt;p&gt;Les individus achetant un nom de domaine &lt;code&gt;.ca&lt;/code&gt; obtiendront également gratuitement la &lt;strong&gt;protection d'identité&lt;/strong&gt;. Si tel est votre cas, cela voudra dire qu'il ne sera pas possible de savoir publiquement que vous êtes titulaire du domaine &lt;code&gt;exemple-secret.ca&lt;/code&gt;. ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  L'heure de la décision
&lt;/h2&gt;

&lt;p&gt;Au final, vous êtes libres de choisir l'extension qui vous attire le plus. Vous pouvez également réserver plusieurs noms de domaines différents et mettre en place des redirections permanentes vers le domaine que vous avez choisi.&lt;/p&gt;

&lt;p&gt;Cela vous laissera la possibilité de revenir sur votre décision plus tard et d'inverser la redirection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pour en savoir plus
&lt;/h2&gt;

&lt;p&gt;Si vous souhaitez en savoir davantage, je vous invites à consulter les 2 articles suivants. Ces derniers sont très bien écrits et peuvent vous apporter d'autres éléments intéressants pour influence votre décision.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.cira.ca/fr/blogue/domaines-ca/ca-ou-com-quel-tld-est-le-meilleur-pour-votre-site-web"&gt;.CA ou .com – quel TLD est le meilleur pour votre site Web ?&lt;/a&gt;, sur CIRA.ca&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://whc.ca/blog/le-guide-ultime-pour-trouver-votre-nom-de-domaine-parfait/"&gt;Le guide ultime pour trouver votre nom de domaine parfait&lt;/a&gt;, sur WHC.ca&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bonne réflexion!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;P.-S. – Si vous cherchez un hébergement Web, un hébergement WordPress ou un certificat SSL, je vous recommande de regarder les &lt;a href="https://clients.whc.ca/aff.php?aff=2076"&gt;offres de WHC.ca&lt;/a&gt;. 😉&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tooling</category>
      <category>architecture</category>
      <category>french</category>
      <category>writing</category>
    </item>
  </channel>
</rss>
