<?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: Christophe Colombier</title>
    <description>The latest articles on DEV Community by Christophe Colombier (@ccoveille).</description>
    <link>https://dev.to/ccoveille</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%2F906403%2F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg</url>
      <title>DEV Community: Christophe Colombier</title>
      <link>https://dev.to/ccoveille</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ccoveille"/>
    <language>en</language>
    <item>
      <title>Follow up: I'm back to dev.to</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Tue, 10 Sep 2024 12:24:46 +0000</pubDate>
      <link>https://dev.to/ccoveille/follow-up-im-back-to-devto-4lf6</link>
      <guid>https://dev.to/ccoveille/follow-up-im-back-to-devto-4lf6</guid>
      <description>&lt;p&gt;After long pause, because of my newborn daugther, I'm back to dev.to&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/ccoveille" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F906403%2F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/ccoveille/im-a-dad-again-m4k" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I'm a dad again 🤩🥳 dev.to pause&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ Apr 26&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#community&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I will try to post things again.&lt;/p&gt;

&lt;p&gt;Today, I posted a series about Integer overflow in Go&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/ccoveille" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F906403%2F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/ccoveille/about-the-gosec-g115-drama-or-how-i-faced-back-integer-conversion-overflow-in-go-1302" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;About the gosec G115 drama, or how I faced back integer conversion overflow in Go 🤯&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ Sep 9&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#go&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>devto</category>
      <category>community</category>
    </item>
    <item>
      <title>go-safecast: Safe number conversion in Go 🪄</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Tue, 10 Sep 2024 11:45:00 +0000</pubDate>
      <link>https://dev.to/ccoveille/go-safecast-safe-number-conversion-in-go-4c2l</link>
      <guid>https://dev.to/ccoveille/go-safecast-safe-number-conversion-in-go-4c2l</guid>
      <description>&lt;p&gt;I worked on my first open-source package last weekend.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ccoVeille" rel="noopener noreferrer"&gt;
        ccoVeille
      &lt;/a&gt; / &lt;a href="https://github.com/ccoVeille/go-safecast" rel="noopener noreferrer"&gt;
        go-safecast
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Safe number conversion in Go: address gosec G115 and cwe-190 Integer Overflow or Wraparound
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🪄 go-safecast: safe numbers conversion&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://goreportcard.com/report/github.com/ccoveille/go-safecast" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0036744575bf9a7e6971b03b07f59f47b480b5c85b1a1e984e736d5d8339ba4a/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f63636f7665696c6c652f676f2d7361666563617374" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://godoc.org/github.com/ccoVeille/go-safecast" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/40083914709fa28c4e2a720ba709d09313b8875a0cf4d6c71fe12f0cabc52af2/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f63636f5665696c6c652f676f2d73616665636173743f7374617475732e737667" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/ccoVeille/go-safecast" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/05391ab5ca0b4a5695b3185edf12f48915aae2e932ba1ba8570437f404848f63/68747470733a2f2f636f6465636f762e696f2f67682f63636f5665696c6c652f676f2d73616665636173742f67726170682f62616467652e7376673f746f6b656e3d565730564f3530335536" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/ccoVeille/go-safecast" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a189412d844856bad975ed90458ed8379e3c01c33f23887133ce67457d2a6e51/68747470733a2f2f636f6465636c696d6174652e636f6d2f6769746875622f63636f5665696c6c652f676f2d73616665636173742e706e67" alt="Code Climate"&gt;&lt;/a&gt;
&lt;a href="https://github.com/search?q=%22%5C%22github.com%2Fccoveille%2Fgo-safecast%5C%22%22+language%3Ago++-is%3Afork+-is%3Aarchived+&amp;amp;type=code" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e9cd8c5ad045fbbaf2b8b3f5a7bbb29833fa5307bfad5ce4fbfda29b58c79f28/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7365617263683f71756572793d2532322535432532326769746875622e636f6d25324663636f7665696c6c65253246676f2d73616665636173742535432532322532322532306c616e6775616765253341676f2532302532302d6973253341666f726b2532302d69732533416172636869766564253230266c6162656c3d476f253230696d706f727473" alt="Go Imports"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3480e95105f7e1e0eb342f8e85da50d2fa074f77f89c4c6e9bc7a22aa3e0396b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f63636f7665696c6c652f676f2d7361666563617374"&gt;&lt;img src="https://camo.githubusercontent.com/3480e95105f7e1e0eb342f8e85da50d2fa074f77f89c4c6e9bc7a22aa3e0396b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f63636f7665696c6c652f676f2d7361666563617374" alt="GitHub Repo stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;go-safecast solves the type conversion issues in Go&lt;/p&gt;
&lt;p&gt;In Go, integer type conversion can lead to a silent and unexpected behavior and errors if not handled carefully.&lt;/p&gt;
&lt;p&gt;This package helps to convert any number to another, and report an error when if there would be a &lt;a href="https://github.com/ccoVeille/go-safecast#conversion-issues" rel="noopener noreferrer"&gt;loss or overflow in the conversion&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-go notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;package&lt;/span&gt; main
&lt;span class="pl-k"&gt;import&lt;/span&gt; (
  &lt;span class="pl-s"&gt;"fmt"&lt;/span&gt;
  &lt;span class="pl-s"&gt;"math"&lt;/span&gt;

  &lt;span class="pl-s"&gt;"github.com/ccoveille/go-safecast"&lt;/span&gt;
)

&lt;span class="pl-k"&gt;func&lt;/span&gt; &lt;span class="pl-s1"&gt;main&lt;/span&gt;() {
  &lt;span class="pl-k"&gt;var&lt;/span&gt; &lt;span class="pl-s1"&gt;a&lt;/span&gt; &lt;span class="pl-smi"&gt;int&lt;/span&gt;

  &lt;span class="pl-s1"&gt;a&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-c1"&gt;42&lt;/span&gt;
  &lt;span class="pl-s1"&gt;b&lt;/span&gt;, &lt;span class="pl-s1"&gt;err&lt;/span&gt; &lt;span class="pl-c1"&gt;:=&lt;/span&gt; &lt;span class="pl-s1"&gt;safecast&lt;/span&gt;.&lt;span class="pl-c1"&gt;ToUint8&lt;/span&gt;(&lt;span class="pl-s1"&gt;a&lt;/span&gt;) &lt;span class="pl-c"&gt;// everything is fine&lt;/span&gt;
  &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-s1"&gt;err&lt;/span&gt; &lt;span class="pl-c1"&gt;!=&lt;/span&gt; &lt;span class="pl-c1"&gt;nil&lt;/span&gt; {
    &lt;span class="pl-s1"&gt;fmt&lt;/span&gt;.&lt;span class="pl-c1"&gt;Println&lt;/span&gt;(&lt;span class="pl-s1"&gt;err&lt;/span&gt;)
  }
  &lt;span class="pl-s1"&gt;fmt&lt;/span&gt;.&lt;span class="pl-c1"&gt;Println&lt;/span&gt;(&lt;span class="pl-s1"&gt;b&lt;/span&gt;)
  &lt;span class="pl-c"&gt;// Output: 42&lt;/span&gt;

  &lt;span class="pl-s1"&gt;a&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-c1"&gt;255&lt;/span&gt; &lt;span class="pl-c1"&gt;+&lt;/span&gt; &lt;span class="pl-c1"&gt;1&lt;/span&gt;
  &lt;span class="pl-s1"&gt;_&lt;/span&gt;, &lt;span class="pl-s1"&gt;err&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;safecast&lt;/span&gt;.&lt;span class="pl-c1"&gt;ToUint8&lt;/span&gt;(&lt;span class="pl-s1"&gt;a&lt;/span&gt;) &lt;span class="pl-c"&gt;// 256 is greater than uint8 maximum value&lt;/span&gt;
  &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-s1"&gt;err&lt;/span&gt; &lt;span class="pl-c1"&gt;!=&lt;/span&gt; &lt;span class="pl-c1"&gt;nil&lt;/span&gt; {
    &lt;span class="pl-s1"&gt;fmt&lt;/span&gt;.&lt;span class="pl-c1"&gt;Println&lt;/span&gt;(&lt;span class="pl-s1"&gt;err&lt;/span&gt;)
    &lt;span class="pl-c"&gt;// Output: conversion issue: 256&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ccoVeille/go-safecast" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;About the story behind this library, you can read my first article about integer overflow in Go&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/ccoveille" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F906403%2F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/ccoveille/about-the-gosec-g115-drama-or-how-i-faced-back-integer-conversion-overflow-in-go-1302" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;About the gosec G115 drama, or how I faced back integer conversion overflow in Go 🤯&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ Sep 9 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#go&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;As I found nothing to cope with this kind of error, except adding a lot of boilerplate for each cast to do, so I decided to make my own Go package.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/ldemailly"&gt;@ldemailly&lt;/a&gt; helped me to review the code, thank.&lt;/p&gt;

&lt;p&gt;The package is now mature enough for me to talk about it.&lt;/p&gt;

&lt;p&gt;So instead of this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxUint8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"overflow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxUint8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"overflow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxInt8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"overflow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x99&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="c"&gt;// hexadecimal representation of Trademark ASCII character: ™&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxInt8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"overflow"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://go.dev/play/p/5KP76Q37D-p" rel="noopener noreferrer"&gt;Go Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now do this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;safecast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;safecast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;safecast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToInt8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x99&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="c"&gt;// hexadecimal representation of Trademark ASCII character: ™&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;safecast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToUint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://go.dev/play/p/O14grpNaM0X" rel="noopener noreferrer"&gt;Go Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm curious about your feedbacks&lt;/p&gt;

</description>
      <category>go</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Go: integer overflows</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Tue, 10 Sep 2024 09:00:03 +0000</pubDate>
      <link>https://dev.to/ccoveille/go-integer-overflows-5dfh</link>
      <guid>https://dev.to/ccoveille/go-integer-overflows-5dfh</guid>
      <description>&lt;p&gt;Let's continue my articles about &lt;a href="https://dev.to/ccoveille/about-the-gosec-g115-drama-or-how-i-faced-back-integer-conversion-overflow-in-go-1302"&gt;integer overflows in Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here are examples&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 0 conversion overflow&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 255 conversion overflow&lt;/span&gt;

&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;int8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 44&lt;/span&gt;

&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x99&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;             &lt;span class="c"&gt;// hexadecimal representation of Trademark ASCII character: ™&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c"&gt;// 153&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="c"&gt;// -103&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://go.dev/play/p/-n516BE8FYM" rel="noopener noreferrer"&gt;Go Playground&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
    </item>
    <item>
      <title>About the gosec G115 drama, or how I faced back integer conversion overflow in Go 🤯</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Mon, 09 Sep 2024 22:10:48 +0000</pubDate>
      <link>https://dev.to/ccoveille/about-the-gosec-g115-drama-or-how-i-faced-back-integer-conversion-overflow-in-go-1302</link>
      <guid>https://dev.to/ccoveille/about-the-gosec-g115-drama-or-how-i-faced-back-integer-conversion-overflow-in-go-1302</guid>
      <description>&lt;p&gt;Go is a strongly typed language, it avoids making mistakes.&lt;/p&gt;

&lt;p&gt;I wrongly assumed Go was handling integer overflows, and reported an error.&lt;/p&gt;

&lt;p&gt;Here is the perfect world where everything works as expected&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So what does the following code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;    &lt;span class="c"&gt;// 255 is the higher value an uint8 can reach&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// ?&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;uint8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// ?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the &lt;a href="https://go.dev/play/p/Bp4ncHo6xAy" rel="noopener noreferrer"&gt;solution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spoiler: it doesn't work as expected, or at least as we could expect.&lt;/p&gt;

&lt;p&gt;So here Go is doing a silent conversion, of course it cannot store the value in the integer types provided, but there is no panic at all.&lt;/p&gt;

&lt;p&gt;There are consequences: &lt;a href="https://cwe.mitre.org/data/definitions/190.html" rel="noopener noreferrer"&gt;CWE-190&lt;/a&gt;. Please note CWE-190 is Common Weakness that affects a lot of language, and that is documented since 2006-07-19.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Imagine you access a resource by its identifier, but you need to convert from an integer type to another, you may allow to access to another resource.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of this, &lt;a href="https://github.com/securego/gosec" rel="noopener noreferrer"&gt;gosec&lt;/a&gt; a linter focused on improving the security in Go, provided a linter to detect the issue: the linter G115&lt;/p&gt;

&lt;p&gt;The G115 linter idea was good.&lt;/p&gt;

&lt;p&gt;But it was unfortunately &lt;a href="https://github.com/securego/gosec/pull/1149" rel="noopener noreferrer"&gt;merged&lt;/a&gt; with &lt;a href="https://github.com/securego/gosec/pull/1187" rel="noopener noreferrer"&gt;some&lt;/a&gt; &lt;a href="https://github.com/securego/gosec/pull/1194" rel="noopener noreferrer"&gt;false&lt;/a&gt; &lt;a href="https://github.com/securego/gosec/pull/1194" rel="noopener noreferrer"&gt;issues&lt;/a&gt;, that are now addressed, except &lt;a href="https://github.com/securego/gosec/issues/1212" rel="noopener noreferrer"&gt;a few ones&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The problem becomes massive after &lt;a href="https://github.com/securego/gosec/releases/tag/v2.21.0" rel="noopener noreferrer"&gt;gosec v2.21.0&lt;/a&gt; was merged into &lt;a href="https://github.com/golangci/golangci-lint/releases/tag/v1.60.2" rel="noopener noreferrer"&gt;golangci-lint 1.60.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many people disabled gosec G115, because of the false positives and noise it was bringing to the CI. They were so numerous false-positives, they couldn't be fixed with a &lt;code&gt;//nolint:gosec // disable G115&lt;/code&gt; directive.&lt;/p&gt;

&lt;p&gt;The problem is now (almost) fixed with &lt;a href="https://github.com/golangci/golangci-lint/releases/tag/v1.61.0" rel="noopener noreferrer"&gt;golangci-lint 1.61.0&lt;/a&gt; (that ships &lt;a href="https://github.com/securego/gosec/releases/tag/v2.21.2" rel="noopener noreferrer"&gt;gosec v2.21.2&lt;/a&gt;, there are &lt;a href="https://github.com/securego/gosec/issues/1212" rel="noopener noreferrer"&gt;still a few remaining false-positive issues&lt;/a&gt; that need to be addressed, but they are less frequent.&lt;/p&gt;

&lt;p&gt;Unfortunately, during that 2 weeks delay, many people chose to disable the G115 checker, you can &lt;a href="https://github.com/search?q=path%3Agolangci+g115&amp;amp;type=code" rel="noopener noreferrer"&gt;see it easily on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe, they would enable them back now.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>git switch and git restore, or why not using git checkout</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Sat, 04 May 2024 14:58:56 +0000</pubDate>
      <link>https://dev.to/ccoveille/please-stop-using-git-checkout-learn-to-use-the-right-git-commands-an0</link>
      <guid>https://dev.to/ccoveille/please-stop-using-git-checkout-learn-to-use-the-right-git-commands-an0</guid>
      <description>&lt;p&gt;&lt;code&gt;git checkout&lt;/code&gt; command exists since the beginning of &lt;code&gt;git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It is used for these things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating new branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git checkout -b new-feature upstream/main&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;switching branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git checkout main&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;restoring unstaged changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git checkout README.md&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checking out code from other branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git checkout v1.0.0 -- README.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout&lt;/code&gt; command confuses everyone who start using &lt;code&gt;git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because it mixes two concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;branches juggling&lt;/li&gt;
&lt;li&gt;restoring files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why new commands were added with Git 2.23 (August 2019, &lt;strong&gt;almost 5 years ago&lt;/strong&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/docs/git-switch" rel="noopener noreferrer"&gt;git switch&lt;/a&gt;: for playing with branches&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/docs/git-restore" rel="noopener noreferrer"&gt;git restore&lt;/a&gt;: for restoring files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;git restore can be used as a simple replacement on action on files.&lt;/p&gt;

&lt;p&gt;the only noticeable changes between git switch and git checkout is that branch creation was done with &lt;code&gt;git checkout -b name&lt;/code&gt; while it's now &lt;code&gt;git switch -c name&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;Credit: &lt;a href="https://twitter.com/_risacan_/status/1162539626373865472" rel="noopener noreferrer"&gt;https://twitter.com/_risacan_/status/1162539626373865472&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>git</category>
    </item>
    <item>
      <title>Git commit helper: add emojis to your commits</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Sat, 04 May 2024 06:49:39 +0000</pubDate>
      <link>https://dev.to/ccoveille/git-commit-helper-add-emojis-to-your-commits-1aka</link>
      <guid>https://dev.to/ccoveille/git-commit-helper-add-emojis-to-your-commits-1aka</guid>
      <description>&lt;p&gt;Following the article wrote by &lt;a class="mentioned-user" href="https://dev.to/muzammil-cyber"&gt;@muzammil-cyber&lt;/a&gt; &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/muzammil-cyber" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1357490%2Fc331c7ff-8670-4298-9dff-9323d70657cc.jpeg" alt="muzammil-cyber"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/muzammil-cyber/git-commit-message-decoder-new-coder-edition-48l7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Git Commit Message Decoder: New Coder Edition&lt;/h2&gt;
      &lt;h3&gt;Muhammad Muzammil Loya ・ May 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#git&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I would recommend anyone looking for having emojis in their commits to use the following tool made by &lt;a class="mentioned-user" href="https://dev.to/carloscuesta"&gt;@carloscuesta&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/carloscuesta" rel="noopener noreferrer"&gt;
        carloscuesta
      &lt;/a&gt; / &lt;a href="https://github.com/carloscuesta/gitmoji-cli" rel="noopener noreferrer"&gt;
        gitmoji-cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A gitmoji interactive cli tool for using emojis on commits. 💻
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;gitmoji-cli&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/carloscuesta/gitmoji-cli/actions?query=workflow%3ACI+branch%3Amaster" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ba74ff0a3629c37489346546e6302e1ebccd644714a3ef4fff215fe91a14add9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6361726c6f736375657374612f6769746d6f6a692d636c692f63692e796d6c3f6272616e63683d6d6173746572267374796c653d666c61742d737175617265" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/carloscuesta/gitmoji-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7b901bc341de099f8476c12aa4d06600feee6e929978962ddf9000e1c1a8fac4/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636c696d6174652f6d61696e7461696e6162696c6974792f6361726c6f736375657374612f6769746d6f6a692d636c692e7376673f7374796c653d666c61742d737175617265" alt="Code Climate"&gt;&lt;/a&gt;
&lt;a href="https://github.com/carloscuesta/gitmoji-cli" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/46a421b14cc93da99eb08d1e24f7fe40dee245b19d63f99cf6967bdd08c51b2a/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f6361726c6f736375657374612f6769746d6f6a692d636c692e7376673f7374796c653d666c61742d737175617265" alt="Codecov"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/gitmoji-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/eecdbc041e03d493d799f2ae4d27127c9f5ce441711db12d4bfce8a872a64909/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6769746d6f6a692d636c692e7376673f7374796c653d666c61742d737175617265" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/gitmoji-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d026e318c38439be5dea7d98c44fcd26eef5b6069712a392c041f4f78a4c49df/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64742f6769746d6f6a692d636c692e7376673f7374796c653d666c61742d737175617265" alt="npm downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/carloscuesta/gitmoji" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5e63ba2d8b1194b27e7f325f43a6172eaeead73bf8fed8ab7546efa3f85ea0bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6769746d6f6a692d2532302546302539462539382539432532302546302539462539382538442d4646444436372e7376673f7374796c653d666c61742d737175617265" alt="gitmoji badge"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://cloud.githubusercontent.com/assets/7629661/20454643/11eb9e40-ae47-11e6-90db-a1ad8a87b495.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcloud.githubusercontent.com%2Fassets%2F7629661%2F20454643%2F11eb9e40-ae47-11e6-90db-a1ad8a87b495.gif" alt="gitmoji-cli"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;a href="https://github.com/carloscuesta/gitmoji" rel="noopener noreferrer"&gt;gitmoji&lt;/a&gt; interactive client for using gitmojis on commit messages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;About&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This project provides an easy solution for using &lt;a href="https://github.com/carloscuesta/gitmoji" rel="noopener noreferrer"&gt;&lt;strong&gt;gitmoji&lt;/strong&gt;&lt;/a&gt; from your command line. Gitmoji-cli solves the hassle of searching through the gitmoji list. Includes a bunch of options you can play with! 🎉&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;npm&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm i -g gitmoji-cli&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;brew&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;brew install gitmoji&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;gitmoji --help&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;A gitmoji interactive client for using gitmojis on commit messages.

  Usage
    $ gitmoji
  Options
    --init, -i      Initialize gitmoji as a commit hook
    --remove, -r    Remove a previously initialized commit hook
    --config, -g    Setup gitmoji-cli preferences.
    --commit, -c    Interactively commit using the prompts
    --list, -l      List all the available gitmojis
    --search, -s    Search gitmojis
    --version, -v   Print gitmoji-cli installed version
    --update, -u    Sync emoji list with the repo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Commit&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;You can use the commit functionality in two ways, directly or via a commit-hook.&lt;/p&gt;
&lt;p&gt;If you want to integrate &lt;code&gt;gitmoji-cli&lt;/code&gt; in your project I…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/carloscuesta/gitmoji-cli" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You can select the right emoji for your commits.&lt;/p&gt;

&lt;p&gt;You can also use &lt;a class="mentioned-user" href="https://dev.to/folke"&gt;@folke&lt;/a&gt; devmoji&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/folke" rel="noopener noreferrer"&gt;
        folke
      &lt;/a&gt; / &lt;a href="https://github.com/folke/devmoji" rel="noopener noreferrer"&gt;
        devmoji
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🤖 🚀 ✨ Emojify your conventional commits with Devmoji
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;✨ Devmoji&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/folke/devmoji/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/folke/devmoji/workflows/Node%20CI/badge.svg" alt="Node CI"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/devmoji" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6844b578a90aa28acfa580d083f38e695fe096eb690e09a394b89bdd0c8da5c0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6465766d6f6a69" alt="npm"&gt;&lt;/a&gt;
&lt;a href="https://github.com/folke/devmoji/blob/master/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c561ca6d09ce6ae0ca381eb88e8badbbb886a9aabb86a9466ecfbdd4b792bee5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f666f6c6b652f6465766d6f6a69" alt="GitHub"&gt;&lt;/a&gt;
&lt;a href="https://github.com/folke/devmoji/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f9ff711ebd22662bec36b2e3dd24b27b0718c95662ae3a2dfaf9f828ca94fd1b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f666f6c6b652f6465766d6f6a69" alt="GitHub top language"&gt;&lt;/a&gt;
&lt;a href="https://renovatebot.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/64af9e888ea7b2949d52ef6fe776fe986d0e2466663e8e8b60776b086fe1661d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72656e6f766174652d656e61626c65642d627269676874677265656e2e737667" alt="Renovate"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Using &lt;a href="https://www.conventionalcommits.org/" rel="nofollow noopener noreferrer"&gt;Conventional Commits ⭐&lt;/a&gt; as a
standard for your commit messages, makes
&lt;a href="https://semver.org/" rel="nofollow noopener noreferrer"&gt;Semantic Versioning 🔖&lt;/a&gt; as easy as can be, with
tools like
&lt;a href="https://github.com/conventional-changelog/conventional-changelog" rel="noopener noreferrer"&gt;Conventional Changelog 📄&lt;/a&gt;
&lt;a href="https://github.com/conventional-changelog/standard-version" rel="noopener noreferrer"&gt;Standard Version 🔖&lt;/a&gt;
and
&lt;a href="https://github.com/semantic-release/semantic-release" rel="noopener noreferrer"&gt;Semantic Release 📦🚀&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Devmoji&lt;/strong&gt; is a command line tool that adds color 🌈 to conventional
commits, using emojis inspired by
&lt;a href="https://gitmoji.carloscuesta.me/" rel="nofollow noopener noreferrer"&gt;Gitmoji 😜&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some of the things &lt;strong&gt;Devmoji&lt;/strong&gt; can do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/folke/devmoji###devmoji-emojify" rel="noopener noreferrer"&gt;&lt;strong&gt;emojify:&lt;/strong&gt;&lt;/a&gt; convert input between diferent emoji
formats &lt;code&gt;unicode&lt;/code&gt;, &lt;code&gt;shortcode&lt;/code&gt; and &lt;code&gt;devmoji&lt;/code&gt;. &lt;strong&gt;devmoji&lt;/strong&gt; are easy to remember
aliases like: &lt;code&gt;:test:&lt;/code&gt;, &lt;code&gt;:refactor:&lt;/code&gt;, &lt;code&gt;:docs:&lt;/code&gt;, &lt;code&gt;:security&lt;/code&gt; instead of hard to
remember emoji codes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/folke/devmoji###devmoji---edit" rel="noopener noreferrer"&gt;&lt;strong&gt;git commit:&lt;/strong&gt;&lt;/a&gt; install a &lt;strong&gt;&lt;code&gt;prepare-commit-msg&lt;/code&gt; commit
hook&lt;/strong&gt; to ✨ automagically emojify and lints your commit message&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/folke/devmoji###devmoji---log" rel="noopener noreferrer"&gt;&lt;strong&gt;git log:&lt;/strong&gt;&lt;/a&gt; emojify and colorify the output of &lt;code&gt;git log&lt;/code&gt;
even for projects not using emojis&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What does it look like?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;see the commit messages of the Devmoji
&lt;a href="https://github.com/folke/devmoji" rel="noopener noreferrer"&gt;github repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;generated Devmoji
&lt;a href="https://github.com/folke/devmoji/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;CHANGELOG.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📦 Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Install with &lt;code&gt;npm&lt;/code&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/folke/devmoji" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This one transform your commit message into emoji.&lt;/p&gt;

&lt;p&gt;Both can allow you to enforce &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;conventional commits&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Build your own Octocat avatar, and share your creations on dev.to</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Fri, 03 May 2024 16:16:21 +0000</pubDate>
      <link>https://dev.to/ccoveille/build-your-own-octocat-avatar-and-share-your-creations-on-devto-5g3l</link>
      <guid>https://dev.to/ccoveille/build-your-own-octocat-avatar-and-share-your-creations-on-devto-5g3l</guid>
      <description>&lt;p&gt;I just wrote an introduction about GitHub's Octocat&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/ccoveille" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F906403%2F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/ccoveille/the-story-behind-github-logo-j5h" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The story behind GitHub logo&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ May 3&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#community&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#watercooler&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I made this post because I wanted to brind some fun on dev.to by suggesting something.&lt;/p&gt;

&lt;p&gt;Today, I found back &lt;a href="https://myoctocat.com/" rel="noopener noreferrer"&gt;https://myoctocat.com/&lt;/a&gt; a site made to create you own Octocat avatar&lt;/p&gt;

&lt;p&gt;I would like everyone to share their creations.&lt;/p&gt;

</description>
      <category>github</category>
      <category>watercooler</category>
      <category>discuss</category>
      <category>community</category>
    </item>
    <item>
      <title>The story behind GitHub logo</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Fri, 03 May 2024 16:12:29 +0000</pubDate>
      <link>https://dev.to/ccoveille/the-story-behind-github-logo-j5h</link>
      <guid>https://dev.to/ccoveille/the-story-behind-github-logo-j5h</guid>
      <description>&lt;p&gt;Everyone (at least among developers) knows the GitHub's logo.&lt;/p&gt;

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

&lt;p&gt;Several knows the mascot is named Octocat, it's a merge between octopuss and cat&lt;/p&gt;

&lt;p&gt;Some knows the story behind this logo creation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The idea for GitHub’s logo came from its “octopus merge” – the practice of combining three or more branches of development. Initially the logo’s designer Simon Oxley thought about calling his creation ‘Octopuss’ (combination of octopus and pussycat) to represent how complex code combines can create peculiar things. But in the end, GitHub decided to go with ‘Octocat’ (for obvious reasons).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The logo was created by Simon Oxley, who doesn't remember creating it, apparently.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.linkedin.com/pulse/original-github-octocat-designer-simon-oxley-simon-oxley/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2Fv2%2FC4D12AQFUpFAKTEEjag%2Farticle-cover_image-shrink_600_2000%2Farticle-cover_image-shrink_600_2000%2F0%2F1520177158085%3Fe%3D2147483647%26v%3Dbeta%26t%3DDgUdbNXRCoTHub58-m9ymajRspXriSWCqlnUlKp0rk4" height="auto" class="m-0"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.linkedin.com/pulse/original-github-octocat-designer-simon-oxley-simon-oxley/" rel="noopener noreferrer" class="c-link"&gt;
          Original GitHub Octocat designer Simon Oxley
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Original GitHub Octocat designer Simon Oxley on his famous creation: "I don't remember drawing it" Simon Oxley is the sort of fellow who makes dry jokes so subtle that Americans will miss them. He's not a developer, techie, or household name in Silicon Valley.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic.licdn.com%2Faero-v1%2Fsc%2Fh%2Fal2o9zrvru7aqj8e1x2rzsrca"&gt;
        linkedin.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;More information is available on &lt;a href="https://en.wikipedia.org/wiki/GitHub#Mascot" rel="noopener noreferrer"&gt;Wikipedia's page of GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>community</category>
      <category>watercooler</category>
      <category>programming</category>
    </item>
    <item>
      <title>2024-05-03 my weekly dev.to recommendation</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Fri, 03 May 2024 16:00:00 +0000</pubDate>
      <link>https://dev.to/ccoveille/2024-05-03-my-weekly-devto-recommendation-4e4j</link>
      <guid>https://dev.to/ccoveille/2024-05-03-my-weekly-devto-recommendation-4e4j</guid>
      <description>&lt;p&gt;Many articles but also topics in my weekly dev.to recommendations.&lt;/p&gt;

&lt;p&gt;These are the articles I liked and recommend you reading&lt;/p&gt;

&lt;h2&gt;
  
  
  you are your own maintainer
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/fermyon" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XnEz075w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Forganization%252Fprofile_image%252F7949%252Fd9f9e405-7e3d-4cd2-96bc-7754fe44d9b9.png" alt="Fermyon" width="150" height="150"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t9I8lqQN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F1187729%252F0d952ffe-9877-436c-ac41-4b96bc3dc624.png" alt="" width="150" height="150"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/fermyon/it-took-me-20-years-to-learn-this-lesson-about-dev-1mep" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;It Took Me 20+ Years To Learn This Lesson About Dev&lt;/h2&gt;
      &lt;h3&gt;Matt Butcher for Fermyon ・ May 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I would sum up like this: your today's code is your future legacy code.&lt;/p&gt;

&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/technosophos"&gt;@technosophos&lt;/a&gt; for sharing your thoughts on dev and work&lt;/p&gt;

&lt;p&gt;
  Here are the articles I wrote about same topics &lt;em&gt;(click to unfold)&lt;/em&gt;
  

  &lt;a href="/ccoveille"&gt;
    
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GayB75jc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F906403%252F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille" width="150" height="150"&gt;
    
  &lt;/a&gt;
  &lt;a href="/ccoveille/how-to-be-a-better-developer-for-you-and-the-others-1244"&gt;
    
      &lt;h2&gt;How to be a better developer for you and the others&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ Apr 7&lt;/h3&gt;
      
        &lt;span&gt;#programming&lt;/span&gt;
        &lt;span&gt;#devjournal&lt;/span&gt;
        &lt;span&gt;#howto&lt;/span&gt;
        &lt;span&gt;#workplace&lt;/span&gt;
      
    
  &lt;/a&gt;





  &lt;a href="/ccoveille"&gt;
    
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GayB75jc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F906403%252F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille" width="150" height="150"&gt;
    
  &lt;/a&gt;
  &lt;a href="/ccoveille/know-your-cognitive-biases-know-yourself--2iom"&gt;
    
      &lt;h2&gt;Discover your cognitive biases 🧠🤔, and how to deal with them 💪🤩 !&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ Apr 22&lt;/h3&gt;
      
        &lt;span&gt;#psychology&lt;/span&gt;
        &lt;span&gt;#workplace&lt;/span&gt;
      
    
  &lt;/a&gt;





&lt;/p&gt;

&lt;h2&gt;
  
  
  why and when automating things
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/grayside" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--32kTr1dG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F279678%252Ff5ceef7d-df32-4869-8540-05984f6b72aa.jpeg" alt="grayside"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/grayside/why-automate-1fac" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Why Automate?&lt;/h2&gt;
      &lt;h3&gt;Adam Ross ・ Apr 30&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#software&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#automation&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tooling&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/grayside"&gt;@grayside&lt;/a&gt;, I can see your passion to XKCD&lt;/p&gt;

&lt;h2&gt;
  
  
  a good article about password management
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/gearoidotreasaigh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TmpnBERD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F1408576%252Fa4ac7456-f05a-4249-a245-e13b4bdee65f.jpg" alt="gearoidotreasaigh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/gearoidotreasaigh/password-management-the-basics-4d40" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Password Management: The Basics&lt;/h2&gt;
      &lt;h3&gt;Gearoid O'Treasaigh ・ May 2&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#password&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#habits&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/gearoidotreasaigh"&gt;@gearoidotreasaigh&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An interesting and detailed article about code review.
&lt;/h2&gt;

&lt;p&gt;I approve and second author's guidelines and ideas:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/tassiofront" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K8z6h5pQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F471801%252F3019c858-7aad-4cef-8a66-fe2f7e0d3183.jpeg" alt="tassiofront"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/tassiofront/mastering-code-review-a-guide-for-reviewers-and-pr-creators-ac6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Mastering Code Review: A Guide for Reviewers and PR Creators&lt;/h2&gt;
      &lt;h3&gt;Tássio ・ Apr 27&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/tassiofront"&gt;@tassiofront&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  The story behind gzip
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/huizhou92" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AhZLA6f3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F1443590%252F7ceb5082-e444-4d3b-85ed-4ee077f2ed98.jpeg" alt="huizhou92"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/huizhou92/the-magical-algorithms-written-by-two-old-men-dominating-the-world-3h12" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Magical Algorithms Written by Two Old Men, Dominating the World&lt;/h2&gt;
      &lt;h3&gt;huizhou92 ・ Apr 26&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#computerscience&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#computerhistory&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#algorithms&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/huizhou92"&gt;@huizhou92&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  why you need a rubber duck
&lt;/h2&gt;

&lt;p&gt;The amazing rubber duck techniques I use for years now, explained and discussed in this post&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/anitaolsen" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KqJX1eaw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F1195604%252Fd237b56d-cfd4-479f-92b1-2afa1253560e.gif" alt="anitaolsen"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/anitaolsen/are-you-into-rubber-duck-debugging-3ndm" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Are you Into Rubber Duck Debugging?&lt;/h2&gt;
      &lt;h3&gt;Anita Olsen*°•.¸☆ ・ Apr 23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#coding&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/anitaolsen"&gt;@anitaolsen&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  an interesting alternative to classic Readme profile on GitHub
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/tungbq" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sdxZSykY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F746777%252F7c177fe8-af48-4eaf-9c9a-583c0457dba6.jpg" alt="tungbq"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/tungbq/github-create-your-own-repository-landscape-16i5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;GitHub: Create your own repository landscape ⭐️&lt;/h2&gt;
      &lt;h3&gt;Tung Leo ・ Apr 28&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#githubactions&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tooling&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/tungbq"&gt;@tungbq&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  a good article article about email protection behind tools, but also privacy
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/devh0us3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pOokovjy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://media.dev.to/cdn-cgi/image/width%3D150%2Cheight%3D150%2Cfit%3Dcover%2Cgravity%3Dauto%2Cformat%3Dauto/https%253A%252F%252Fdev-to-uploads.s3.amazonaws.com%252Fuploads%252Fuser%252Fprofile_image%252F1438833%252F665aac3c-ade4-4072-9130-6086362cf042.jpeg" alt="devh0us3"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devh0us3/protect-your-emails-short-note-4k4e" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Protect your emails (Short note)&lt;/h2&gt;
      &lt;h3&gt;Alex P ・ May 1&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#email&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#pgp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#privacy&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Thanks &lt;a class="mentioned-user" href="https://dev.to/devh0us3"&gt;@devh0us3&lt;/a&gt;&lt;/p&gt;

</description>
      <category>community</category>
      <category>bestofdev</category>
      <category>workplace</category>
      <category>devto</category>
    </item>
    <item>
      <title>Open source software maintenance is difficult: examples with Go math/rand/v2 and testify</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Thu, 02 May 2024 11:07:01 +0000</pubDate>
      <link>https://dev.to/ccoveille/two-recent-examples-showing-how-software-maintenance-is-difficult-mathrandv2-and-testify-2eeg</link>
      <guid>https://dev.to/ccoveille/two-recent-examples-showing-how-software-maintenance-is-difficult-mathrandv2-and-testify-2eeg</guid>
      <description>&lt;p&gt;In this article, I will use Go language as an example, but the subject can be extended to any software with a large codebase and number of users.&lt;/p&gt;

&lt;p&gt;Go development team has just published an interesting article about the need to introduce a math/rand/v2 package&lt;/p&gt;

&lt;p&gt;Please have a look:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.dev/blog/randv2" rel="noopener noreferrer"&gt;https://go.dev/blog/randv2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While it's not a breaking changes, as it's a v2. It's the first time Go is bringing a v2 package ever. So in more than 15 years!&lt;/p&gt;

&lt;p&gt;The article explains why they came to this choice. You can see the struggle they faced in the decision. How they iterated to try to fix issue, how what they did cause other problems, and finally why they had no other choice than bringing a v2.&lt;/p&gt;

&lt;p&gt;This article is good and remind me another good one.&lt;/p&gt;

&lt;p&gt;Here is a status from the last man standing developer of testify. Testify is popular test asserters library in Go. The code is 10 years old. They are working on a v2 for years, and they announced they have to abandon it.&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/stretchr/testify/issues/1089#issuecomment-1812734472" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Comment for
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#1089&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/dolmen" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F129536%3Fv%3D4" alt="dolmen avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/dolmen" rel="noopener noreferrer"&gt;dolmen&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/stretchr/testify/issues/1089#issuecomment-1812734472" rel="noopener noreferrer"&gt;&lt;time&gt;Nov 15, 2023&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;A maintainer's manifesto about Testify &lt;code&gt;v2&lt;/code&gt;
&lt;/h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;A &lt;code&gt;v2&lt;/code&gt; would please users of &lt;code&gt;v2&lt;/code&gt; because of a cleaner API.
A &lt;code&gt;v2&lt;/code&gt; would please maintainers of &lt;code&gt;v2&lt;/code&gt; who are fed-up with flaws in &lt;code&gt;v1&lt;/code&gt;'s API (traps).&lt;/p&gt;
&lt;p&gt;But &lt;code&gt;v2&lt;/code&gt; will be of no help for users of &lt;code&gt;v1&lt;/code&gt; because that will require migration (even &lt;a href="https://go.dev/blog/v2-go-modules" rel="nofollow noopener noreferrer"&gt;just adding &lt;code&gt;/v2&lt;/code&gt; to every import&lt;/a&gt; would be a significant and painful migration). With migration (changing code that works) comes a risk of regression. Testify is a set of frameworks for writing testsuites. &lt;strong&gt;A testsuite is one critical piece of a software project&lt;/strong&gt; to protect against regression. The last thing someone wants is a regression in the testsuite that is supposed to protect against regressions.&lt;/p&gt;
&lt;p&gt;So users of &lt;code&gt;v1&lt;/code&gt; who can't afford migration (rewrite cost, regression risk...) will just stay with &lt;code&gt;v1&lt;/code&gt;. If &lt;code&gt;v1&lt;/code&gt; is abandoned by Testify maintainers who moved to &lt;code&gt;v2&lt;/code&gt;, &lt;code&gt;v1&lt;/code&gt; users will just be orphaned.&lt;/p&gt;
&lt;p&gt;Testify is very old and has a ton of users that rely on it. At the time of this post (2023-11-15) pkg.go.dev &lt;a href="https://pkg.go.dev/github.com/stretchr/testify/assert?tab=importedby" rel="nofollow noopener noreferrer"&gt;counts&lt;/a&gt; 12,454 public packages dependending on it. But this is only the tip of the iceberg as this doesn't count entreprise code hidden behind walls.&lt;/p&gt;
&lt;p&gt;To not orphan users of &lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;v1&lt;/code&gt; would have to be maintained along with &lt;code&gt;v2&lt;/code&gt;. So what is the benefit for maintainers if they have to maintain both &lt;code&gt;v1&lt;/code&gt; and &lt;code&gt;v2&lt;/code&gt;? None: only more work while maintenance resources for &lt;code&gt;v1&lt;/code&gt; is already on shortage.&lt;/p&gt;
&lt;p&gt;So, &lt;strong&gt;as the current only active maintainer, I'm declaring that &lt;code&gt;v2&lt;/code&gt; will never happen&lt;/strong&gt;. Or at least a &lt;code&gt;v2&lt;/code&gt; of the &lt;code&gt;github.com/stretchr/testify&lt;/code&gt; module with such major breaking changes.&lt;/p&gt;
&lt;p&gt;Anyone is free to fork the project under a new module name, using changes proposed here or &lt;a href="https://github.com/stretchr/testify/issues?q=is%3Aopen+is%3Aissue+label%3A%22Breaking+Change%22" rel="noopener noreferrer"&gt;elsewhere&lt;/a&gt;, keeping the Testify spirit. This will let users migrate at their own pace. As a maintainer of Testify I will even gladly bless such a fork(s) by linking from testify's documentation (godoc, README). But there is no sane reason for this to happen with the &lt;code&gt;github.com/stretchr/testify&lt;/code&gt; module name (the only reason would be branding, but I reject it as a &lt;em&gt;sane&lt;/em&gt; reason). Anyway, with &lt;a href="https://go.dev/blog/v2-go-modules" rel="nofollow noopener noreferrer"&gt;how Go modules work&lt;/a&gt;, a &lt;code&gt;v2&lt;/code&gt; would already be a module name change. So proponents of breaking changes must just recognize this and just use a fully separate module name.&lt;/p&gt;
&lt;p&gt;In this repo we will just continue to maintain &lt;code&gt;v1&lt;/code&gt;.
Forever.&lt;/p&gt;
&lt;p&gt;Olivier Mengué (&lt;a class="mentioned-user" href="https://dev.to/dolmen"&gt;@dolmen&lt;/a&gt;), current only active maintainer of Testify.&lt;/p&gt;
&lt;p&gt;PS: @Antonboom is doing an amazing work with &lt;a href="https://github.com/Antonboom/testifylint" rel="noopener noreferrer"&gt;&lt;code&gt;testifylint&lt;/code&gt;&lt;/a&gt;. That is a major tool that helps Testify users to avoid &lt;code&gt;v1&lt;/code&gt;'s traps. More than a &lt;code&gt;v2&lt;/code&gt;.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/stretchr/testify/issues/1089#issuecomment-1812734472" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You can see how difficult it is to maintain a software that is old, that have a huge number of users.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>opensource</category>
      <category>news</category>
    </item>
    <item>
      <title>Go: the future encoding/json/v2 module</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Thu, 02 May 2024 10:57:41 +0000</pubDate>
      <link>https://dev.to/ccoveille/go-the-future-encodingjsonv2-module-4o3n</link>
      <guid>https://dev.to/ccoveille/go-the-future-encodingjsonv2-module-4o3n</guid>
      <description>&lt;p&gt;Here is a current implementation of the future encoding/json/v2 in Go&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/go-json-experiment" rel="noopener noreferrer"&gt;
        go-json-experiment
      &lt;/a&gt; / &lt;a href="https://github.com/go-json-experiment/json" rel="noopener noreferrer"&gt;
        json
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Experimental implementation of a proposed v2 encoding/json package
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;JSON Serialization (v2)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://pkg.go.dev/github.com/go-json-experiment/json" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bf42c9a3adc3eb74e1547b19a7e041fe15da84c62d62b6bae9af0d7d6971f266/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d676f646576266d6573736167653d7265666572656e636526636f6c6f723d303061646438" alt="GoDev"&gt;&lt;/a&gt;
&lt;a href="https://github.com/go-json-experiment/json/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/go-json-experiment/json/actions/workflows/test.yml/badge.svg?branch=master" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This module hosts an experimental implementation of v2 &lt;code&gt;encoding/json&lt;/code&gt;
The API is unstable and breaking changes will regularly be made
Do not depend on this in publicly available modules.&lt;/p&gt;
&lt;p&gt;Any commits that make breaking API or behavior changes will be marked
with the string "WARNING: " near the top of the commit message.
It is your responsibility to inspect the list of commit changes
when upgrading the module. Not all breaking changes will lead to build failures.&lt;/p&gt;
&lt;p&gt;A &lt;a href="https://github.com/golang/go/discussions/63397" rel="noopener noreferrer"&gt;Discussion about including this package in Go as &lt;code&gt;encoding/json/v2&lt;/code&gt;&lt;/a&gt; has been started on the Go Github project on 2023-10-05. Please provide your feedback there.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goals and objectives&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mostly backwards compatible:&lt;/strong&gt; If possible, v2 should aim to be &lt;em&gt;mostly&lt;/em&gt;
compatible with v1 in terms of both API and default behavior to ease migration
For example, the &lt;code&gt;Marshal&lt;/code&gt; and &lt;code&gt;Unmarshal&lt;/code&gt; functions are the most widely used
declarations in the v1…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/go-json-experiment/json" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This project is not only a proof of concept, but also an idea of the future implementation that will help sorting out many issues with current encoding/json&lt;/p&gt;

&lt;p&gt;You get some information in this GitHub issue&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/discussions/63397" rel="noopener noreferrer"&gt;https://github.com/golang/go/discussions/63397&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>news</category>
    </item>
    <item>
      <title>📸🔒GitHub: protect your email from spammers with this GitHub privacy setting</title>
      <dc:creator>Christophe Colombier</dc:creator>
      <pubDate>Sun, 28 Apr 2024 13:00:00 +0000</pubDate>
      <link>https://dev.to/ccoveille/github-protect-your-email-from-spammers-with-this-github-privacy-setting-14j4</link>
      <guid>https://dev.to/ccoveille/github-protect-your-email-from-spammers-with-this-github-privacy-setting-14j4</guid>
      <description>&lt;p&gt;First thing to understand, &lt;code&gt;git&lt;/code&gt; is not &lt;code&gt;GitHub&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;git is a tool, GitHub is somehow an hosting provider. There are many other hosting providers: GitLab, BitBuckets…&lt;/p&gt;

&lt;p&gt;A part of git commit is your email.&lt;/p&gt;

&lt;p&gt;
  side note about the email identifier &lt;em&gt;(click to unfold)&lt;/em&gt;
  &lt;br&gt;
You can learn more about it in my previous article



  &lt;a href="/ccoveille"&gt;
    
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F906403%2F5d65e31f-d570-43e7-82f3-ab6a05b2ca45.jpg" alt="ccoveille"&gt;
    
  &lt;/a&gt;
  &lt;a href="/ccoveille/why-and-not-only-how-signing-your-commits-4nja"&gt;
    
      &lt;h2&gt;Why you should sign your commits, and not only how.&lt;/h2&gt;
      &lt;h3&gt;Christophe Colombier ・ Apr 26&lt;/h3&gt;
      
        &lt;span&gt;#github&lt;/span&gt;
        &lt;span&gt;#git&lt;/span&gt;
        &lt;span&gt;#security&lt;/span&gt;
        &lt;span&gt;#privacy&lt;/span&gt;
      
    
  &lt;/a&gt;





&lt;/p&gt;

&lt;p&gt;Many git tutorials start by the basics:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email you@domain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;For example this article made by &lt;a class="mentioned-user" href="https://dev.to/federicotrotta"&gt;@federicotrotta&lt;/a&gt; (hi Frederico 👋)&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/federicotrotta" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1395272%2F24a440c7-0b73-466f-94e2-0bfc644bea2a.png" alt="federicotrotta"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/federicotrotta/how-to-create-a-repository-in-github-kd6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How To Create a Repository in GitHub&lt;/h2&gt;
      &lt;h3&gt;Federico Trotta ・ Apr 24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#git&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;It's OK, but here comes GitHub then.&lt;/p&gt;

&lt;p&gt;Because having your email configured in your local git is OK. But commits are made to be pushed.&lt;/p&gt;

&lt;p&gt;Here I will only talk about GitHub because it's somehow the reference.&lt;/p&gt;

&lt;p&gt;GitHub is public, and it's great, but &lt;strong&gt;your email will be publicly available on every of your commit you push on GitHub. ⚠️⚠️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know what? Evil spammers hidden in the darkness are looking for emails in commits.&lt;/p&gt;

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

&lt;p&gt;Here is how setting everything clean to avoid issues.&lt;/p&gt;

&lt;p&gt;Please note, it would only work for new commits, commits you pushed with your real email are already there.&lt;/p&gt;

&lt;p&gt;To set up and keep your email private on GitHub, follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open your GitHub profile settings by clicking your profile photo in the upper-right corner of any page, then click "Settings", then "Emails" section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set Your Primary Email Address (normally you had set up this when you created your GitHub account): &lt;br&gt;
In the "Primary email address" dropdown menu, select the email address you'd like to associate with your web-based Git operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;select "Keep my email addresses private". This will provide a no-reply email address (e.g., &lt;a href="mailto:username@users.noreply.github.com"&gt;username@users.noreply.github.com&lt;/a&gt;) for your commits.&lt;br&gt;
&lt;strong&gt;copy paste it as we will need it in a few steps&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Block Command Line Pushes That Expose Your Email (Optional):&lt;br&gt;
If you want to prevent command line pushes that might expose your personal email address, select "Block command line pushes that expose my email". This setting checks the most recent commit's author email and blocks the push if it matches a private email on your GitHub account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure your git settings:&lt;br&gt;
You can do this by running:&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"whatever@users.noreply.github.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace "&lt;a href="mailto:whatever@users.noreply.github.com"&gt;whatever@users.noreply.github.com&lt;/a&gt;" with your actual no-reply email address provided by GitHub.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By following these steps, you can ensure that your email address remains private for both web-based and command line Git operations on GitHub&lt;/p&gt;

&lt;p&gt;
  GitHub official documentation about it &lt;em&gt;(click to unfold)&lt;/em&gt;
  &lt;p&gt;&lt;a href="https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#setting-your-commit-email-address-on-github" rel="noopener noreferrer"&gt;https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#setting-your-commit-email-address-on-github&lt;/a&gt;&lt;/p&gt;



&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>tutorial</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
