<?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: Abanoub Hanna</title>
    <description>The latest articles on DEV Community by Abanoub Hanna (@abanoubha).</description>
    <link>https://dev.to/abanoubha</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%2F56402%2F35419b3c-79b2-471d-9528-454cef014974.jpeg</url>
      <title>DEV Community: Abanoub Hanna</title>
      <link>https://dev.to/abanoubha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abanoubha"/>
    <language>en</language>
    <item>
      <title>Links on the web: blind click vs. transparency</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Wed, 18 Mar 2026 09:54:55 +0000</pubDate>
      <link>https://dev.to/abanoubha/links-on-the-web-blind-click-vs-transparency-37ke</link>
      <guid>https://dev.to/abanoubha/links-on-the-web-blind-click-vs-transparency-37ke</guid>
      <description>&lt;p&gt;The "Blind Click" is one of the most significant, yet overlooked, security gaps in the modern mobile experience. While we have spent decades training desktop users to "hover before they click", the transition to smartphones has effectively stripped away this essential safety habit.&lt;/p&gt;

&lt;p&gt;Here is an exploration of why this matters, the security risks involved, and how a simple UI change can restore user trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Luxury of the "Hover"
&lt;/h2&gt;

&lt;p&gt;On a desktop or laptop, the web browser acts as a silent guardian. Whenever your cursor moves over a link or a button, a small strip of text appears in the bottom-left corner of the window. This is the &lt;strong&gt;URL preview&lt;/strong&gt;. It allows you to verify that a button labeled "Login to Bank" actually leads to &lt;code&gt;bank.com&lt;/code&gt; and not shady &lt;code&gt;secure-login-verify-72.xyz&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On a smartphone, this layer of transparency vanishes. There is no cursor, and therefore, no "hover" state. To see where a link goes, a mobile user typically has to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Long-press the link.&lt;/li&gt;
&lt;li&gt;Wait for a context menu.&lt;/li&gt;
&lt;li&gt;Read the URL in small print.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In reality, almost no one does this. We simply tap and hope for the best.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the "Blind Click" is a Security Nightmare
&lt;/h2&gt;

&lt;p&gt;The lack of URL visibility on mobile isn't just a minor inconvenience; it is a primary vector for &lt;strong&gt;Phishing&lt;/strong&gt; and &lt;strong&gt;Social Engineering&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Cybercriminals rely on the fact that mobile users are often distracted and unable to verify destinations easily. According to security research, mobile users are significantly more likely to fall for phishing attacks than desktop users, largely because the technical cues we rely on to spot fraud are hidden behind the glass.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The mobile interface inherently prioritizes aesthetics and screen real estate over technical transparency. This "clean" design often comes at the cost of user security, as it masks the underlying architecture of the web."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By hiding the URL, the interface forces the user to trust the &lt;strong&gt;Link Text&lt;/strong&gt; (what the button says) rather than the &lt;strong&gt;Link Destination&lt;/strong&gt; (where the button actually goes).&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Explicit Transparency
&lt;/h2&gt;

&lt;p&gt;The fix is logically simple but rarely implemented: &lt;strong&gt;Show the URL directly under the button text&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By displaying the destination domain—or at least the verified handle—directly in the UI, we remove the guesswork. This approach turns a "leap of faith" into an informed decision. &lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Visible URLs:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant Verification&lt;/strong&gt;: Users can see immediately if a "Facebook" button leads to &lt;code&gt;facebook.com&lt;/code&gt; or a malicious clone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Cognitive Load&lt;/strong&gt;: Users don’t have to wonder or "long-press" to feel safe; the information is already there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building Brand Authority&lt;/strong&gt;: For legitimate businesses, showing your official domain reinforces that you have nothing to hide.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Setting a New Standard: KartBusiness.com
&lt;/h2&gt;

&lt;p&gt;This philosophy of "Security through Transparency" is exactly why &lt;strong&gt;KartBusiness.com&lt;/strong&gt; has integrated visible URLs into its digital business cards. &lt;/p&gt;

&lt;p&gt;Every social media link and external contact button on a KartBusiness profile is designed to show the underlying destination. When a client or lead views your digital card, they don't just see a "LinkedIn" icon; they see the direct path to your professional profile.&lt;/p&gt;

&lt;p&gt;In an era where digital identity theft is at an all-time high, this feature serves as a digital "seal of authenticity", ensuring that every interaction on the platform is grounded in trust and technical honesty.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Transparency is the Best Policy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Design should never come at the expense of safety&lt;/strong&gt;. As we move toward an increasingly mobile-first world, the responsibility falls on developers and platform owners to provide users with the tools they need to stay safe. Showing the URL isn't just a design choice—it’s a commitment to user security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Take Control of Your Digital Identity
&lt;/h3&gt;

&lt;p&gt;Don't leave your professional links to chance. Provide your clients with a secure, transparent, and professional way to connect with you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create and publish your FREE digital business card now at &lt;a href="https://kartbusiness.com" rel="noopener noreferrer"&gt;KartBusiness.com&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>web</category>
      <category>navigation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>RegExp vs String Manipulation in Go language</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Fri, 19 Dec 2025 13:47:15 +0000</pubDate>
      <link>https://dev.to/abanoubha/regexp-vs-string-manipulation-in-go-language-c4k</link>
      <guid>https://dev.to/abanoubha/regexp-vs-string-manipulation-in-go-language-c4k</guid>
      <description>&lt;p&gt;I wrote a tool to abstract all package managers such as apt, snap, and flatpak, so I can use it as the interface instead of dealing with the specific package manager of the Linux distribution currently in use.&lt;/p&gt;

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

&lt;p&gt;In &lt;a href="https://github.com/abanoubha/i" rel="noopener noreferrer"&gt;i&lt;/a&gt;, the tool, I wrote this function to replace the letter x from a command (if it has) with the package the user specified.&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;func&lt;/span&gt; &lt;span class="n"&gt;executeCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pkgName&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&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;template&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&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="s"&gt;"Command not defined for this package manager."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;re&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;regexp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MustCompile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;`\bx\b`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cmdStr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReplaceAllStringFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pkgName&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;verbose&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Executing: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmdStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmdStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parts&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;args&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdin&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&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;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;verbose&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error executing command: %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&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;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But using &lt;em&gt;regular expressions&lt;/em&gt; for a simple task like this is a horrible choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  getting rid of regular expression
&lt;/h2&gt;

&lt;p&gt;The task is to remove the letter x from the command and put the package name instead.&lt;/p&gt;

&lt;p&gt;The commands always had that x letter at the end which made it a good case to use &lt;code&gt;strings.TrimSuffic()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;x
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove x
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--only-upgrade&lt;/span&gt; x
apt search x
apt show x
brew &lt;span class="nb"&gt;install &lt;/span&gt;x
brew uninstall x
brew upgrade x
brew search x
brew info x
&lt;span class="nb"&gt;sudo &lt;/span&gt;port &lt;span class="nb"&gt;install &lt;/span&gt;x
&lt;span class="nb"&gt;sudo &lt;/span&gt;port uninstall x
&lt;span class="nb"&gt;sudo &lt;/span&gt;port upgrade x
port search x
port info x
&lt;span class="nb"&gt;sudo &lt;/span&gt;flatpak &lt;span class="nb"&gt;install &lt;/span&gt;x
&lt;span class="nb"&gt;sudo &lt;/span&gt;flatpak uninstall x
&lt;span class="nb"&gt;sudo &lt;/span&gt;flatpak update x
flatpak search x
flatpak info x
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--classic&lt;/span&gt; x
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap remove x
&lt;span class="nb"&gt;sudo &lt;/span&gt;snap refresh x
snap find x
snap info x
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; x
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf remove &lt;span class="nt"&gt;-y&lt;/span&gt; x
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade &lt;span class="nt"&gt;-y&lt;/span&gt; x
dnf search x
dnf info x
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nt"&gt;--noconfirm&lt;/span&gt; x
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-Rs&lt;/span&gt; &lt;span class="nt"&gt;--noconfirm&lt;/span&gt; x
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-Syu&lt;/span&gt; &lt;span class="nt"&gt;--noconfirm&lt;/span&gt; x
pacman &lt;span class="nt"&gt;-Ss&lt;/span&gt; x
pacman &lt;span class="nt"&gt;-Qi&lt;/span&gt; x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there is a case that the command ends with x as a part of the package manager's name (guix), I don't want to replace this x.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;guix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, I can use a letter preceded with a space like this " x". But nix package manager has dot before the package name like this &lt;code&gt;nix-env -iA nixpkgs.x&lt;/code&gt;, so, I need to handle this case too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix-env &lt;span class="nt"&gt;-iA&lt;/span&gt; nixpkgs.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After taking all of these cases into consideration, If the command ends with ".x" or " x", I will remove the end x and put the package name.&lt;/p&gt;

&lt;p&gt;Here is the function after using string manipulation instead of RegExp:&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;func&lt;/span&gt; &lt;span class="n"&gt;executeCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pkgName&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&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;template&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&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="s"&gt;"Command not defined for this package manager."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;cmdStr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;
    &lt;span class="c"&gt;// if template ends with ".x" or " x" remove "x" and add pkgName&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;".x"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HasSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" x"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cmdStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimSuffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pkgName&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;verbose&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Executing: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmdStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmdStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parts&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;args&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdin&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&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;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;verbose&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;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error executing command: %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&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;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I was wondering how much speed this will make!&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarking RegExp vs string replacement
&lt;/h2&gt;

&lt;p&gt;I &lt;a href="https://github.com/abanoubha/i/blob/main/performance_test.go" rel="noopener noreferrer"&gt;wrote a benchmark&lt;/a&gt; to test the performance and it turns out it is super faaaaaaaaaaaaast!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-bench&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-run&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NONE &lt;span class="nt"&gt;-benchmem&lt;/span&gt;
goos: linux
goarch: amd64
pkg: github.com/abanoubha/i
cpu: Intel&lt;span class="o"&gt;(&lt;/span&gt;R&lt;span class="o"&gt;)&lt;/span&gt; Core&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; i5-1035G1 CPU @ 1.00GHz
BenchmarkRegexpReplacement-8             541910    2207 ns/op    1609 B/op  21 allocs/op
BenchmarkRegexpPrecompiledReplacement-8  1986163   609.2 ns/op   88 B/op    4 allocs/op
BenchmarkStringReplacement-8             23621672  50.48 ns/op   24 B/op    1 allocs/op
PASS
ok      github.com/abanoubha/i  3.608s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;String Manipulation&lt;/strong&gt;: ~50 ns/op&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regexp (Pre-compiled)&lt;/strong&gt;: ~609 ns/op (~12x slower)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regexp (Compiled on-the-fly)&lt;/strong&gt;: ~2207 ns/op (~44x slower)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are curious to see the performance benchmark code, I left it &lt;a href="https://github.com/abanoubha/i/blob/main/performance_test.go" rel="noopener noreferrer"&gt;on github inside the i project codebase&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  takeaways
&lt;/h2&gt;

&lt;p&gt;Use string functions whenever and wherever you can. Keep your code free of&lt;br&gt;
regular expression as much as you can. Using &lt;a href="https://pkg.go.dev/strings" rel="noopener noreferrer"&gt;strings functions&lt;/a&gt; in Go programming language is &lt;em&gt;simpler&lt;/em&gt; and &lt;em&gt;easier to understand and reason about&lt;/em&gt; and &lt;em&gt;performs better&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>regex</category>
      <category>performance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Predictions for the Future of Programming Future in 2030</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Tue, 08 Apr 2025 15:18:44 +0000</pubDate>
      <link>https://dev.to/abanoubha/predictions-for-the-future-of-programming-future-in-2030-23k9</link>
      <guid>https://dev.to/abanoubha/predictions-for-the-future-of-programming-future-in-2030-23k9</guid>
      <description>&lt;p&gt;On May 2019, I wrote &lt;a href="https://abanoubhanna.com/ar/posts/future-programming-languages/" rel="noopener noreferrer"&gt;my predictions for the future of programming in 2025&lt;/a&gt;. Let's evaluate my predictions now before talking about my predictions for programming in 2030.&lt;/p&gt;

&lt;h2&gt;
  
  
  evaluation of my 2025 predictions for programming
&lt;/h2&gt;

&lt;p&gt;Today is the last day of 2024, and tomorrow is the 1st day of the year 2025, Happy New Year to you ALL. I know, there is almost a year for my predictions to become true but I choose not to wait. I'd like to add a paragraph update to show my state of my predictions at the end of year 2025 too.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted the increase of Go language usage as an alternative to NodeJS
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;I predict that software developers will use Go language instead of Node JS for backend engineering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This prediction came true. You'll watch too many companies and popular tech youtubers using Go and talking about it. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Theo : &lt;a href="https://youtu.be/N8fjU_hlwDI" rel="noopener noreferrer"&gt;I am coming around to Go&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;web dev cody: &lt;a href="https://youtu.be/dKdxAubU4Fk" rel="noopener noreferrer"&gt;why I'm learning Go&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PrimeAgen: &lt;a href="https://youtu.be/6gwF8mG3UUY" rel="noopener noreferrer"&gt;why I use Golang in 2024&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/qUUaBh4ii-g" rel="noopener noreferrer"&gt;we switched from Python to Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Too many reasons why Go language is getting popular in the backend space. For example, Go is winning in popular benchmarks like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go winning against Python : &lt;a href="https://www.youtube.com/watch?v=vJsqDqq1R0Y" rel="noopener noreferrer"&gt;Go (Golang) vs Python Performance Benchmark&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go winning against FastAPI (a Python web framework) : &lt;a href="https://youtu.be/CdkAMceuoBg" rel="noopener noreferrer"&gt;Python (FastAPI) vs Go (Golang) Performance Benchmark&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go wins despite the optimizations to the FastAPI application codebase: &lt;a href="https://youtu.be/sxdpKG-6HSY" rel="noopener noreferrer"&gt;Python (FastAPI) vs Go (Golang) (Round 2) Performance Benchmark&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Go wins against Django (a Python framework) : &lt;a href="https://youtu.be/caNsPpRuBcw" rel="noopener noreferrer"&gt;Django (Python) vs Go (Golang)&lt;/a&gt; : Performance (Latency - Throughput - Saturation - Availability)&lt;/li&gt;
&lt;li&gt;Go wins against Node JS : &lt;a href="https://youtu.be/ZslbMp_T90k" rel="noopener noreferrer"&gt;Node.js vs Go (Golang)&lt;/a&gt; : Performance (Latency - Throughput - Saturation - Availability)&lt;/li&gt;
&lt;li&gt;Go wins despite the optimization in the Node app code : &lt;a href="https://youtu.be/h2pCxj_Fkdc" rel="noopener noreferrer"&gt;Go (Golang) vs Node.js: Performance (Latency - Throughput - Saturation - Availability)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fiber (a Go web framework) wins against C# .NET : &lt;a href="https://youtu.be/56TUfwejKfo" rel="noopener noreferrer"&gt;.NET (C#) vs. Fiber (Go)&lt;/a&gt; : Performance (Latency - Throughput - Saturation - Availability)&lt;/li&gt;
&lt;li&gt;Go does NOT win against Bun JS (a JS runtime written in Zig) : &lt;a href="https://youtu.be/ECnlX00YcPI" rel="noopener noreferrer"&gt;Go (Golang) vs. Bun: Performance (Latency - Throughput - Saturation - Availability)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  predicted that PHP will still be used in small projects and blogs
&lt;/h3&gt;

&lt;p&gt;Yes. &lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;Laravel&lt;/strong&gt; the web framework, and &lt;strong&gt;WordPress&lt;/strong&gt; the CMS are being used vastly by small to medium projects, and especially for blogs. But other CMSes and SSGs are increasing in popularity especially among software engineers. For example, many tech blogs are written in Hugo the famous static site generator.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted the use of design after automatically being converted into code
&lt;/h3&gt;

&lt;p&gt;No. Frontend developers still need to write the webpages in frontend technologies such as React JS and Vue JS. No mass use of automatic conversion of UI design into code reached till now (Dec 31, 2024). But there are some plugins/extensions for Figma to export the design as webpage code. I think it needs more time to get good enough for mass/public use to be the common practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted that Flutter will compete against PHP in web space
&lt;/h3&gt;

&lt;p&gt;No. Flutter framework usage to create web apps is too little. It does not reach the level of competition of PHP web world. PHP has Laravel and WordPress, and they're huge.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted the presence of many complex web apps using WebAssembly like Photoshop
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;In the near future, We'll see web apps that are strong and complex like Photoshop run as a web app by leveraging WebAssembly (WAsm), likely using languages like Go or Rust.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes. Many web apps are created leveraging WebAssembly. Here are some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.photopea.com/" rel="noopener noreferrer"&gt;photopea&lt;/a&gt;: the alternative to Photoshop.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jakearchibald.github.io/svgomg/" rel="noopener noreferrer"&gt;SVG OMG&lt;/a&gt;: SVG image editor and compressor.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://squoosh.app/" rel="noopener noreferrer"&gt;Squoosh app&lt;/a&gt;: the image converter and compressor created by Google.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://photoshop.adobe.com/" rel="noopener noreferrer"&gt;photoshop&lt;/a&gt;: the Photoshop itself.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;: the famous UI / UX designing tool.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://silvia-odwyer.github.io/photon/" rel="noopener noreferrer"&gt;Photon&lt;/a&gt; is a high-performance image processing library in WebAssembly that runs both natively and on the web.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.discourse.org/2021/07/faster-user-uploads-on-discourse-with-rust-webassembly-and-mozjpeg/" rel="noopener noreferrer"&gt;Discourse&lt;/a&gt;: Faster (and smaller) uploads in Discourse with Rust, WebAssembly and MozJPEG.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.infoq.com/news/2020/08/zoom-web-chrome-apis/" rel="noopener noreferrer"&gt;Zoom on Web&lt;/a&gt; : WebAssembly SIMD, WebTransport, and WebCodecs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://research.google/blog/background-features-in-google-meet-powered-by-web-ml/" rel="noopener noreferrer"&gt;Google Meet&lt;/a&gt;: Background Features in Google Meet, Powered by Web ML.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.scottlogic.com/2020/11/23/ffmpeg-webassembly.html" rel="noopener noreferrer"&gt;In-browser transcoding of video files with FFmpeg and WebAssembly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mastershot.app/" rel="noopener noreferrer"&gt;MasterShot&lt;/a&gt;: in-browser video editor.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jordaneldredge.com/blog/speeding-up-winamps-music-visualizer-with-webassembly/" rel="noopener noreferrer"&gt;Speeding Up Webamp's Music Visualizer with WebAssembly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cprimozic.net/blog/speeding-up-webcola-with-webassembly/" rel="noopener noreferrer"&gt;Speeding Up the Webcola Graph Viz Library with Rust + WebAssembly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://demo.scichart.com/javascript/audio-analyzer-fft-example" rel="noopener noreferrer"&gt;Realtime Audio Analyzer Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find an up-to-date list of web apps leveraing WebAssembly in &lt;a href="https://github.com/mcuking/Awesome-WebAssembly-Applications" rel="noopener noreferrer"&gt;this awesome list on Github&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted that Rust will be used instead of C++ for device drivers
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Software engineers will use Rust language instead of C++ to write device drivers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes. Many popular projects switched from C++ to Rust, or written in Rust instead of C++ programming language. These projects prefered Rust for its ownership model which ensure no data races.&lt;/p&gt;

&lt;p&gt;Examples of projects using Rust instead of C++ :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://fishshell.com/blog/rustport/" rel="noopener noreferrer"&gt;fish shell&lt;/a&gt;: from 100% C++ into 100% Rust.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://trustwallet.com/blog/a-huge-step-forward-wallet-cores-migration-to-rust" rel="noopener noreferrer"&gt;WalletCore's Migration from C++ to Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dropbox.tech/infrastructure/rewriting-the-heart-of-our-sync-engine" rel="noopener noreferrer"&gt;DropBox: Rewriting our sync engine in Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.kernel.org/rust/index.html" rel="noopener noreferrer"&gt;Rust in Linux kernel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;.. and many more projects, but above them all the contribution in building device drivers in the Linux kernel.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted the increase of Flutter usage in mobile app development
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Mobile app developers will build their apps in Flutter using Dart language instead of the native languages. But the complex apps will be written in native languages which are Kotlin for Android, and Swift for iOS and iPadOS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes. That is happening. 28% of the iOS apps in the app store is written in Flutter according to &lt;a href="https://youtu.be/AEXIrThTgb0?t=325" rel="noopener noreferrer"&gt;this FlutterInProduction Live stream&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  predicted that most programming languages to develop for AI / ML
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Most programming languages will contribute and develop for AI / ML as a means to develop and contribute to the AI evolution and increase of capabilities and merits of the language, but Python will stand as the defacto standard for AI / ML development. Python will face a competition against languages such as Go and Swift, but will stand as the top language for artificial intelligence and machine learning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That didn't happen. Most programming languages integrated the tools and platforms of AI / ML for consuming not development.&lt;/p&gt;

&lt;p&gt;Go language did not compete in AI / ML development &lt;strong&gt;yet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the contrary, Swift language support in Tensorflow project is deprecated. Currently, tensorflow supports Python, in addition to bindings to C, Java, and Go languages according to &lt;a href="https://www.tensorflow.org/install" rel="noopener noreferrer"&gt;the official website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;An unexpected thing happened. New programming languages targeting Python lovers, Rust enthusiasts, and AI/ML at the same time. Mojo language is written in Pythonic syntax, with a backend better optimized than LLVM, by LLVM creators, with techniques to eliminate data races similar to Rust, as a superset of Python. It seems too good to be true, and it is. There is a catch, of course, but I am not interested enough to try and find it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My predictions for programming in 2030
&lt;/h2&gt;

&lt;p&gt;Predicting the future is one of the hardest things in life. But I am trying my best, relying on two basic heuristics to maintain sane predictions. Here are the two heuristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Laws of nature, and common heuristics&lt;/strong&gt;: for example; the easiest will be popular among people because &lt;em&gt;humans are lazy by heuristic nature&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happened will happen again&lt;/strong&gt;: assume that nothing will radically change, because the change is hard for people.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I try to predict the future because that will help me decide which way I'll go in work. Predicting the future makes your decisions easier to make. If the predictions are right, your decisions will be beneficial. That's why I spend some time to follow up with tech events and analyze the scientific laws that rule these changes in the software development field. This helps me understand the potential of each new idea, concept, and technology. Detecting the vision and direction of evolution in the tech space is a great asset in your predictions and decision making. This is me trying to analyze and predict the future, to help myself make better decisions.&lt;/p&gt;

&lt;p&gt;Here is what I predict will happen in the software development in 2030.&lt;/p&gt;

&lt;h3&gt;
  
  
  Go will be as fast as C and Rust in code execution time
&lt;/h3&gt;

&lt;p&gt;There are two indicators which help me predict that the code written in Go will be as fast as C and Rust in execution. They are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go development team is focusing on evolving the standard library into a better v2.&lt;/li&gt;
&lt;li&gt;Google developed V8 engine for Chrome browser that made javascript run faster then ever; which made javascript a viable language for server-side / backend later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thinking of those 2 indicators made me predict that Go code will execute faster in the near future, as the Go team perfecting the codebase of Go and its stdlib. Go is already fast enough, but that push will make its performance greater.&lt;/p&gt;

&lt;h3&gt;
  
  
  Go will be the defacto standard in backend development in entreprise and medium-size companies
&lt;/h3&gt;

&lt;p&gt;After all the enhancements and evolution that will occur in the next few years, Go will reach a level that makes it the defacto standard to develop backend, cloud, and server-side projects in medium and large companies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Android apps will be written in Flutter more than Kotlin or Java
&lt;/h3&gt;

&lt;p&gt;I predict that Flutter will be used significantly more than Kotlin and Java to develop Android apps in 2030. That's because Flutter development team is focusing on perfecting the framework. They announced that they'll experiment with making it possible to use Android native ABIs directly from Dart code in &lt;a href="https://www.youtube.com/live/AEXIrThTgb0?t=3182s" rel="noopener noreferrer"&gt;this FlutterInProduction live stream&lt;/a&gt;. After they already developed Impeller engine which is used instead of Skia rendering engine on iOS and Vulkan enabled Android devices (modern Android phones). Impeller makes apps run smoother and faster.&lt;/p&gt;

&lt;p&gt;If the experiment of calling Android native ABIs directly from Flutter succeed or not, it still is a good thing as it is the vision and direction of the Flutter leaders. Their vision is great and will make Flutter live and prosper more and more. Fixing the common pain points in Flutter will guide its success. I see Flutter as defacto standard in Android app development thanks to the vision of the Flutter team I see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use UI design after automatic conversion into code
&lt;/h3&gt;

&lt;p&gt;This prediction is one of my 2025 predictions which were not come true. I predict it again for 2030 but with a fundamental difference. I am not predicting a Figma plugin/extension to convert design into code. I predict a system similar to low-code solutions that has two-way transparent abstraction over code. &lt;em&gt;I may try to accomplish this myself&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web apps built on WebAssembly will increase more
&lt;/h3&gt;

&lt;p&gt;Building complex web apps on WebAssembly instead of creating for Windows, Mac, or Linux will be the direction for big software companies. The web will have useful creative complex apps instead of just landing pages, posts, videos, and images.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zig language will get more popular and usage more than Rust
&lt;/h3&gt;

&lt;p&gt;Zig language will compete against Rust in developing device drivers; which is the place Rust got in the Linux kernel. Zig will succeed in the performance critical areas and security critical areas.&lt;/p&gt;

&lt;p&gt;In fact, I predicted that Zig will succeed, in general, without specifying a date. I predicted that on June 17th 2022 in a post titled "&lt;a href="https://dev.to/posts/zig-will-succeed/"&gt;Zig will succeed&lt;/a&gt;".&lt;/p&gt;

&lt;h3&gt;
  
  
  Rust will continue to get more popular despite the hot competition
&lt;/h3&gt;

&lt;p&gt;Rust will continue to rise and be used because of its ability to stimulate the mind, show programmer's ego, get developers excited to work and show off.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Why I created Deeper Dark Color Theme for VS Code ?</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Wed, 12 Mar 2025 20:09:41 +0000</pubDate>
      <link>https://dev.to/abanoubha/why-i-created-deeper-dark-color-theme-for-vs-code--3f0m</link>
      <guid>https://dev.to/abanoubha/why-i-created-deeper-dark-color-theme-for-vs-code--3f0m</guid>
      <description>&lt;p&gt;I am using Visual Studio Code as one of my most used source code editors on MacOS, Ubuntu Linux, and Windows. I love dark mode with good contrast colors, so, I tried several color themes but not satisfied with anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Color themes I tried
&lt;/h2&gt;

&lt;p&gt;I tried some popular dark themes, but they did not fit for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual Studio Dark Theme
&lt;/h3&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fh3fwntf2vk7c0jmmy0fy.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fh3fwntf2vk7c0jmmy0fy.jpg" alt="Visual Studio dark color theme" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the default dark color theme for VS Code. This color theme is great but I need more contrast between background and text colors. I'd like for the lighter gray colors of the background of the left menu, and the colorful status bar to go away and only get deep dark background.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dark High Contrast color theme
&lt;/h3&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fio6mk99hwm7ppzalvmrp.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fio6mk99hwm7ppzalvmrp.jpg" alt="Dark High Contrast color theme" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I tried this high contrast dark color theme. I thought it would be great to have extreme contrasty colors, but it is actually horrible. I can not use VS Code comfortably with these popping borders and contrasty outlines. So, I switched right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Default Dark Modern color theme
&lt;/h3&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fhkgfqfu5euqpi9jmphu6.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fhkgfqfu5euqpi9jmphu6.jpg" alt="Default Dark Modern color theme" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I thought, what about another dark theme with a darker backgrounds. So, Default Dark Modern came handy, but it was switched around! the editor's background is lighter and the sidebar's background.. this is horrible for me! I moved away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Material Theme Darker High Contrast color theme
&lt;/h3&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fdepjkxhzan3rjol656jj.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fdepjkxhzan3rjol656jj.jpg" alt="Material Theme Darker High Contrast color theme" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I thought of Material Design as I am an Android app developer, so, the Material Theme High Contrast caught my eyes. But when I installed it, it was not that bad, but not great. It is dimmer and less contrasty! the editor's background is not DARK enough for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision to create my own color theme
&lt;/h2&gt;

&lt;p&gt;After testing all these popular dark color themes, I decided to create my own dark color theme with my criteria to fit my needs. Here are the rules I thought of.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backgrounds are absolutely DARK!&lt;/li&gt;
&lt;li&gt;text colors are light more than enough to be sharp and contrasty.&lt;/li&gt;
&lt;li&gt;dim colors for borders and outlines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, the theme is just the default dark theme with no colorful backgrounds, or it is just the Default Dark Modern theme with deeper dark backgrounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deeper Dark color theme
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fczbc7dlwqbza6n0daxxf.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fczbc7dlwqbza6n0daxxf.jpg" alt="Deeper Dark color theme" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is my color theme. &lt;strong&gt;Deeper Dark&lt;/strong&gt; is the name I chose for the color theme as the most important job for it is changing the backgrounds to be the absolute dark color. That's it. It is similar to &lt;em&gt;Default Dark Modern&lt;/em&gt; and &lt;em&gt;Material Theme Darker High Contrast&lt;/em&gt; but not close enough. So, I created this simple theme that fits my needs and shared it on &lt;a href="https://github.com/abanoubha/deeper-dark-vscode" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you'd like to try it, here is how to.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install it on your VS Code
&lt;/h2&gt;

&lt;p&gt;Search for &lt;code&gt;deeper dark&lt;/code&gt; in Visual Studio Code extensions sidebar, choose the extension that provided by &lt;code&gt;Abanoub Hanna&lt;/code&gt;, and install it.&lt;/p&gt;

&lt;p&gt;Or install it via commandline, using this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code ext &lt;span class="nb"&gt;install &lt;/span&gt;abanoubha.deeper-dark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or find the extension on VS Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=abanoubha.deeper-dark" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=abanoubha.deeper-dark&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>themes</category>
    </item>
    <item>
      <title>The Siren Song of Representative Samples: Why Telemetry Still Reigns Supreme in Software Development</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Wed, 12 Mar 2025 20:02:39 +0000</pubDate>
      <link>https://dev.to/abanoubha/the-siren-song-of-representative-samples-why-telemetry-still-reigns-supreme-in-software-development-2h83</link>
      <guid>https://dev.to/abanoubha/the-siren-song-of-representative-samples-why-telemetry-still-reigns-supreme-in-software-development-2h83</guid>
      <description>&lt;p&gt;The idea is seductive: if you could perfectly capture the essence of your user base with a meticulously crafted representative sample, wouldn't that eliminate the need for vast, intrusive telemetry? After all, why track every single user action when a smaller, carefully selected group could provide the same insights? While compelling in theory, this notion falls apart under the harsh realities of software development in the modern era.&lt;/p&gt;

&lt;p&gt;Let's dissect why, across programming languages, operating systems, mobile apps, desktop apps, and the broader software ecosystem, telemetry remains indispensable, even when representative samples are theoretically possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Illusion of Perfect Representation
&lt;/h2&gt;

&lt;p&gt;The core problem lies in the inherent difficulty of creating a truly "representative" sample. Human behavior is complex, nuanced, and often unpredictable. Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Diverse User Demographics&lt;/strong&gt;: Software caters to a global audience with varying demographics, technical proficiencies, and usage patterns. Accurately reflecting this diversity in a manageable sample is a Herculean task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Cases and Unforeseen Scenarios&lt;/strong&gt;: Even with the most comprehensive sampling strategy, rare but critical edge cases can be missed. These edge cases, often triggered by specific hardware configurations, network conditions, or user workflows, can have a disproportionate impact on software stability and user experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evolving User Behavior&lt;/strong&gt;: User behavior is not static. It evolves with new software releases, emerging technologies, and changing market trends. A sample that was representative yesterday might be obsolete tomorrow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Unknown Unknowns"&lt;/strong&gt;: The most dangerous issues are the ones you don't know to look for. A pre-defined sample, no matter how well-crafted, can't anticipate unforeseen problems that emerge in the wild.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Limitations of Sample-Based Insights
&lt;/h2&gt;

&lt;p&gt;Even if a near-perfect sample could be created, the insights derived from it would still be limited compared to telemetry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale and Statistical Significance&lt;/strong&gt;: Telemetry provides data on a massive scale, enabling statistically significant conclusions. Sample-based insights, while valuable, may lack the statistical power to detect subtle but important trends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Granularity and Context&lt;/strong&gt;: Telemetry can capture granular data on user interactions, performance metrics, and system events. This level of detail is crucial for diagnosing complex issues and optimizing software performance. Samples often lack the depth of this contextual data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Monitoring and Alerting&lt;/strong&gt;: Telemetry enables real-time monitoring of software performance and user behavior. This allows developers to quickly identify and address critical issues before they impact a large number of users. Samples, by their nature, provide a snapshot in time, not a continuous stream of data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A/B Testing and Feature Experimentation&lt;/strong&gt;: Telemetry is essential for A/B testing and feature experimentation. It allows developers to measure the impact of different software variations on user behavior and performance. Samples can be used for initial user studies, but they lack the scale and granularity required for robust A/B testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Specific Examples Across Software Domains
&lt;/h2&gt;

&lt;p&gt;Let's illustrate these points with concrete examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Programming Languages&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;While surveys can gauge general language popularity, telemetry from package managers or IDEs reveals actual usage patterns, library dependencies, and performance bottlenecks across diverse projects.&lt;/li&gt;
&lt;li&gt;Edge case compiler issues that only appear on specific hardware configurations or with complex code structures are almost impossible to catch without widespread telemetry.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Operating Systems&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Driver compatibility issues, hardware conflicts, and performance regressions across a vast array of hardware configurations are only detectable through comprehensive telemetry.&lt;/li&gt;
&lt;li&gt;User behavior patterns, such as application usage and system settings, are essential for optimizing OS features and resource management.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Mobile Apps&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Network latency, battery drain, and app crashes across a multitude of devices and network conditions require detailed telemetry.&lt;/li&gt;
&lt;li&gt;User engagement metrics, such as screen time, feature usage, and in-app purchases, are crucial for optimizing app design and monetization strategies.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Web Applications&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Browser compatibility issues, performance bottlenecks, and security vulnerabilities across a wide range of browsers and devices necessitate robust telemetry.&lt;/li&gt;
&lt;li&gt;User flow analysis, and funnel analysis are critical to understand where users are having issues, or leaving the site.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cloud Services&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Monitoring the health and performance of distributed systems, and detecting outages across globally distributed data centers is impossible without telemetry.&lt;/li&gt;
&lt;li&gt;Security threat detection, and anomaly detection relies on massive amounts of telemetry data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Ethical Considerations of Telemetry
&lt;/h2&gt;

&lt;p&gt;It's crucial to acknowledge the ethical considerations surrounding telemetry. User privacy must be paramount. Developers should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be transparent about the data they collect and how it's used.&lt;/li&gt;
&lt;li&gt;Provide users with clear and easy-to-use controls over their data.&lt;/li&gt;
&lt;li&gt;Anonymize and aggregate data whenever possible.&lt;/li&gt;
&lt;li&gt;Comply with all relevant data privacy regulations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Good example of telemetry and representative samples
&lt;/h2&gt;

&lt;p&gt;Go toolchain telemetry is entirely voluntary, and disabled by default. Go toolchain telemetry is only in Go toolchain programs, not yours. To enable it, you should run &lt;code&gt;go telemetry on&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Watch the keynote of Russ Cox about "Go Telemetry Wins" &lt;a href="https://youtu.be/3QL062vGbjQ" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Go language ecosystem effectively utilizes opt-in OpenTelemetry instrumentation, earching a representative sampling number of opted-in developers, to enhance its toolchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Telemetry as a Necessary Evil (or a Necessary Good?)
&lt;/h2&gt;

&lt;p&gt;While the allure of representative samples is undeniable, the realities of software development demand comprehensive telemetry. It's the only way to gain the deep, granular, and real-time insights needed to build robust, reliable, and user-friendly software. By prioritizing user privacy and implementing responsible data collection practices, we can harness the power of telemetry to create a better software ecosystem for everyone. In short, while sampling has it's place, it does not replace the need for good telemetry.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>How to set Win+V shortcut for Clipboard History in Ubuntu Linux ?</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Wed, 12 Mar 2025 19:55:21 +0000</pubDate>
      <link>https://dev.to/abanoubha/how-to-set-winv-shortcut-for-clipboard-history-in-ubuntu-linux--3d5c</link>
      <guid>https://dev.to/abanoubha/how-to-set-winv-shortcut-for-clipboard-history-in-ubuntu-linux--3d5c</guid>
      <description>&lt;p&gt;I liked the new-ish Windows 10 and 11 style of clipboard management. It has a shortcut to copy (CTRL+C) and to paste (CTRL+V), but they added another incredible one, which is Windows Key + V. This shortcut will show a list of the last 10 copied items (or so ..).&lt;/p&gt;

&lt;p&gt;There are many clipboard managers for Linux operating systems but they does not have that seamless elegant user experience. So, I'll try to re-create a similar workflow for my convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing a clipboard manager
&lt;/h2&gt;

&lt;p&gt;I installed &lt;a href="https://github.com/diodon-dev/diodon" rel="noopener noreferrer"&gt;Diodon&lt;/a&gt; clipboard manager using these commands on my Ubuntu Linux laptop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;add-apt-repository ppa:diodon-team/stable
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; diodon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that I will use a custom shortcut to trigger the paste menu to show up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom shortcut to show clipboard history
&lt;/h2&gt;

&lt;p&gt;I am using Ubuntu 24.04.1 LTS which comes with GNOME desktop environment, so I can customize keyboard shortcuts using the settings app.&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;settings&lt;/strong&gt; app, then select &lt;strong&gt;keyboard&lt;/strong&gt; from the side panel, then click on &lt;strong&gt;view and customize shortcuts&lt;/strong&gt; at the end of the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fqgcgd3bjwjz7p5hugrpy.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fqgcgd3bjwjz7p5hugrpy.jpg" alt="view and customize shortcuts" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keyboard shortcuts will show up. Click on &lt;strong&gt;custom shortcuts&lt;/strong&gt; at the end of the page/screen/window.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fevbn8a638ja7mvudl7dr.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fevbn8a638ja7mvudl7dr.jpg" alt="keyboard shortcuts" width="722" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Custom Shortcuts window will appear. Click on the button that has a plus sign.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F2950ah54moc12gsybfbg.jpg" class="article-body-image-wrapper"&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%2Farticles%2F2950ah54moc12gsybfbg.jpg" alt="show all custom shortcuts" width="722" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write a name as you like.&lt;/p&gt;

&lt;p&gt;Write this specific path for the Diodon executable &lt;code&gt;/usr/bin/diodon&lt;/code&gt; which I got from Diodon program in its tab HotKeys.&lt;/p&gt;

&lt;p&gt;Click on the button next to &lt;strong&gt;shortcut&lt;/strong&gt; and click the shortcut which is &lt;strong&gt;Windows key&lt;/strong&gt; and &lt;strong&gt;V&lt;/strong&gt; (also known generally as &lt;strong&gt;Super key&lt;/strong&gt; + &lt;strong&gt;V&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;After doing all of that, click on the orange button that says &lt;strong&gt;Replace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fzs67n8wcrtla1dkp145l.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fzs67n8wcrtla1dkp145l.jpg" alt="add super v shortcut" width="677" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing Diodon clipboard manager
&lt;/h2&gt;

&lt;p&gt;I enable these settings in the preferences of Diodon app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use clipboard (CTRL+C)&lt;/li&gt;
&lt;li&gt;add images to clipboard history&lt;/li&gt;
&lt;li&gt;keep clipboard content&lt;/li&gt;
&lt;li&gt;synchronize clipboards&lt;/li&gt;
&lt;li&gt;automatically paste selected item&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I increase the number of recent items to 30 which makes Diodon save the latest 30 copied items.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2F3qnoggl7zq8foqgxynh1.jpg" class="article-body-image-wrapper"&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%2Farticles%2F3qnoggl7zq8foqgxynh1.jpg" alt="Diodon clipboard manager preferences" width="566" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Super+V experience with Diodon
&lt;/h2&gt;

&lt;p&gt;Here is the dropdown menu that shows up when I click the shortcut Super + V in any input field.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fv6vz5njtwzqgdzurq5nf.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fv6vz5njtwzqgdzurq5nf.jpg" alt="super v experience with Diodon" width="800" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The menu has two main sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a list of the last 30 copied items.&lt;/li&gt;
&lt;li&gt;clear (to clear all saved clipboard history)&lt;/li&gt;
&lt;li&gt;preferences (to open preferences of Diodon app)&lt;/li&gt;
&lt;li&gt;quit (to close this dropdown menu)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>Linux awareness, Distrohopping, Ricing, and Growing up</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Wed, 12 Mar 2025 18:49:51 +0000</pubDate>
      <link>https://dev.to/abanoubha/linux-awareness-distrohopping-ricing-and-growing-up-2ikl</link>
      <guid>https://dev.to/abanoubha/linux-awareness-distrohopping-ricing-and-growing-up-2ikl</guid>
      <description>&lt;p&gt;I have a rich long history with Linux distributions, and I wanna share that history and the evolution of my thought process of operating systems with you all in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux awareness
&lt;/h2&gt;

&lt;p&gt;I was using Windows 7 on my HP 250 laptop. I was happy with the operating system I have. Sometimes I face a problem with WiFi connection, or bluetooth, and I search Google and YouTube and fix it myself. I was satisfied with Windows 7 in a general sense.&lt;/p&gt;

&lt;p&gt;I started to learn Visual Basic 6 on Visual Studio on Windows 7 and it was a fun experience with graphical user interface that uses forms and drag-n-drop widgets (I don't recall the exact name of them).&lt;/p&gt;

&lt;p&gt;After learning Visual Basic 6.0 for a few months, I decided to learn web development. I started to learn front end web technologies and languages starting with the obvious HTML, then CSS, then CSS3. I was learning from W3schools and some other forum I can't recall right now. I used Notepad, Atom code editor, and Notepad++. I prefered Atom editor at that time.&lt;/p&gt;

&lt;p&gt;I learned Javascript and focused on the DOM manipulation as I was thinking of the browser and frontend. My thinking was graphically, client-side, visually oriented. I have not been able to grasp the concept of backend yet.&lt;/p&gt;

&lt;p&gt;Android's shiny apps caught my eyes and made me pivot my learning path into Android app development in Java. I started to learn Java and it was a hard (almost horrible) experience but I passed it successfully. Java was the first programming language I learned deeply. I downloaded Android Studio on my humble laptop and it sucked big time.&lt;/p&gt;

&lt;p&gt;I used my big enough skills in googling and I learned how to decide what are the problems in the computer which affects its performance, and what is the bottlenick. I used Task Manager to watch my laptop performance while I code, save, and run Android app on emulator. It was my hard disk drive. my HDD read/write speed is the bottlenick as it is almost always at 100%. I replaced my DVD with another storage unit with proper housing, so, my laptop then had 2 storage disks; one is SSD with faster writing and reading speed, and the older one is HDD.&lt;/p&gt;

&lt;p&gt;My laptop became usable after fixing its bottlenick. So, I could continue to learn and build Android apps for businesses and myself.&lt;/p&gt;

&lt;p&gt;I faced too much viruses, trojans, shortcut worms/viruses, .. etc, and I was searching too much about these things on Google. I was reading too many articles, forum posts, and documentation on viruses, security, and hacking (offensive and defensive security).&lt;/p&gt;

&lt;h3&gt;
  
  
  Kali Linux
&lt;/h3&gt;

&lt;p&gt;I saw security experts using Linux operating systems such as Kali Linux when they talk about hacking, pentesting, cracking hashes, .. etc. I started to search with related words, my search keywords became more informed. After a while I decided to try Kali Linux in Virtualbox.&lt;/p&gt;

&lt;p&gt;It was a horrible experience on my poor laptop. But I learned too much about the terminal, security, and simple hacking programs and tools.&lt;/p&gt;

&lt;p&gt;After that, I started to read about Linux, open source, libre software, and operating systems in general starting with UNIX and MINIX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ubuntu
&lt;/h3&gt;

&lt;p&gt;After a while, I decided to dualboot Windows 7 and Ubuntu for better performance and to gain more hands-on experience. I loved Ubuntu Linux.&lt;/p&gt;

&lt;p&gt;After getting mature in software development in general and gaining more knowledge about Linux and opensource, I decided to go all in.&lt;/p&gt;

&lt;p&gt;I moved all my personal files and other important files on a USB pendrive and some uploaded to Google Drive and some other files are kept on the hard disk inside my laptop. I wiped everything on the SSD and installed Ubuntu. I was so happy I could achieve that.&lt;/p&gt;

&lt;h2&gt;
  
  
  distrohopping
&lt;/h2&gt;

&lt;p&gt;I faced issues from time to time on Ubuntu, so I started to think about better Linux distributions. I installed Kali Linux on bare metal instead of Ubuntu, and it was a horrible 2 day experience, so I reinstalled Ubuntu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux Mint
&lt;/h3&gt;

&lt;p&gt;After a few days, I was reading about Linux mint. I started to think of trying it. I installed it on the weekend. It was good enough, but it was sluggish and laggy compared to Ubuntu. I didn't know why at that time.&lt;/p&gt;

&lt;h3&gt;
  
  
  I use Arch btw
&lt;/h3&gt;

&lt;p&gt;After about a week, I decided to try another distribution that everyone talks about. So I decided to install Arch itself!&lt;/p&gt;

&lt;p&gt;On my 15-day long holiday, I started it with installing Arch. It was the most stressful learning experience. I consumed days and nights to install and figure out things. searching, doing, and re-searching. More than a week later, I decided it was enough. No more time for Arch. I gained more knowledge in various low-level software architecture and apps, but it is enough. Let's go back to business.&lt;/p&gt;

&lt;h3&gt;
  
  
  Back to Ubuntu
&lt;/h3&gt;

&lt;p&gt;I installed Ubuntu again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kubuntu : Ubuntu with KDE Plasma
&lt;/h3&gt;

&lt;p&gt;After about a month, the experience of hopping from distro to distro was giving me suspense, amusement, satisfaction, .. some fealing of fear and success, like trying to explore a wild new world. So, I kept thinking of trying KDE (later named Plasma desktop). I installed Kubuntu which is Ubuntu with KDE desktop environment. I had too much choices and customization options, but I was lost. It was a vast crowded wild world.&lt;/p&gt;

&lt;p&gt;I kept customizing, changing things around, hiding, adding, installing apps, and even redesigning the desktop look and feel to be like Ubuntu, then to be like Windows 7 interface, then I stumbled up on a video that showing how to customize KDE to be like MacOS (OS X) interface, so I did it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Back to Ubuntu, again
&lt;/h3&gt;

&lt;p&gt;After 10 nights of geeking around, I quit this redesign loop. And I went back to Ubuntu with GNOME desktop environment. I kept Ubuntu for a while as I was focusing on software development (web and mobile).&lt;/p&gt;

&lt;h3&gt;
  
  
  Clear Linux OS
&lt;/h3&gt;

&lt;p&gt;One night, I was reading some article about a performance beast created and maintained by Intel, specially optimized for Intel CPUs. So, I was hooked. On the next weekend, I installed Clear Linux OS on my laptop. I was thrilled with its performance. It felt like a breeze of fresh air with its performance and GNOME DE. Clear Linux OS has a package manager that has too few packages but it includes Flathub, so, it has popular Linux programs there. It was a quiet experience with little worries and issues at first. But after about I month, I faced an issue, and almost all webpages I read on Google search says update via &lt;code&gt;swupd&lt;/code&gt; (its package manager), so I did. It broke! There were some issues in updating too. After a long night I figured out how to fix the problem. It was a horrible rolling release issue with packages older than expected for its "smart" package manager.&lt;/p&gt;

&lt;h3&gt;
  
  
  Back to my beloved Ubuntu
&lt;/h3&gt;

&lt;p&gt;I went back to Ubuntu with my mind full of gratefulness and satisfaction. I saw Ubuntu as valuable, stable, productive as it can be.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elementary OS
&lt;/h3&gt;

&lt;p&gt;But someday, I watched a YouTube video about a new Linux distribution that has a MacOS look and feel with a focus on user experience. I thought it was a novelty thing.. a shiny broken glass.. but too many youtubers tried it and recommended it! I started to think and search about Elementry OS. I knew it is based on Ubuntu with a new Pantheon desktop environment and a back-to-basics app store with a great pay-what-you-can policy. I loved the concept and bought the premise.&lt;/p&gt;

&lt;p&gt;I downloaded the ISO file. A few busy days in my college passed, and I forgot about Elementary OS. I watched more youtubers talking about Elementary OS, so I came back to it, and installed it.&lt;/p&gt;

&lt;p&gt;My out of the box experience of it was good. It was somewhat slower than Ubuntu and Clear Linux OS. But it gave me a clean user interface with good user experience. Installing apps was not bad for me as I was used to the terminal. But for everyone else, it was horrible as it has dozen apps in its innovative app store (called "App Center").&lt;/p&gt;

&lt;p&gt;I tried its code editor, it was basic but good. I saw it was a promising distribution but I face too many errors and issues down the road with updates and installed programs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debian
&lt;/h3&gt;

&lt;p&gt;So, I thought I should come back to my belove Ubuntu. But another thing caught my attention. Ubuntu is based on Debian. Why not Debian?&lt;/p&gt;

&lt;p&gt;So I installed Debian. It was not good enough as it started with issues with device drivers, then with playing videos and proprietary codecs, and its performance was worse than Ubuntu. It broke my heart as I see it as the wise grandfather of Linux distribution. At that time, I appreciated Ubuntu more and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pop!_OS
&lt;/h3&gt;

&lt;p&gt;Should I go back to Ubuntu? but I need more than Ubuntu ? What about the new distribution that is based on Ubuntu and maintained by System76 (a Linux-powered hardware company). It'd be it. I installed Pop!_OS (that weird name).&lt;/p&gt;

&lt;p&gt;It was a stable distribution for the most part, but after a few days of usage its user interface started to freeze randomly. A program interface freezes, and at the same time the whole system and other programs works fine. The dock/panel freezes, but all other things and programs work properly. It was a chaos experience of great experience and horrible experience. I love the concept, but I hated the product. Their vision is good though. I follow their progress until now while they're creating COSMOS desktop environment in Rust. COSMOS DE is in alpha stage right now (the time of writing).&lt;/p&gt;

&lt;h3&gt;
  
  
  Manjaro
&lt;/h3&gt;

&lt;p&gt;I thought I should visit other friends to get my hands-on experience to make an informed decision about my Linux distribution of choice. So, I tried Manjaro. I liked its user interface, especially its colors and the prompt theme of the terminal. But it was deeply horrible distro with ducktaped parts which fail all the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fedora
&lt;/h3&gt;

&lt;p&gt;I tried Fedora. People are talking high about Fedora, but it was not that good. I faced too many device drivers' issues and more issues with updating and installing programs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zorin OS
&lt;/h3&gt;

&lt;p&gt;I tried Zorin OS, that shiny thing. It was not that good as a daily driver. It has the look and feel but not much in the functionality and stability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parrot OS
&lt;/h3&gt;

&lt;p&gt;I tried Parrot OS, that security focused distro, similar to Kali Linux. It was not good at all. I thought of the next distro after less than 2 days.&lt;/p&gt;

&lt;h3&gt;
  
  
  Settle on Ubuntu
&lt;/h3&gt;

&lt;p&gt;After trying all these Linux distros, I decided to settle on Ubuntu once and for all. I installed the good old friend on my laptop. I started to use it as usual. That stability and quitting distrohopping helped me focusing on my college and software development career.&lt;/p&gt;

&lt;p&gt;But another behavior came along. I started to see a better user experience for every behavior in Ubuntu w/ GNOME.&lt;/p&gt;

&lt;h2&gt;
  
  
  the ricer
&lt;/h2&gt;

&lt;p&gt;So, I started to customize GNOME with extensions. I did too many customization. I redesign its user interface to be similar to Pantheon interface but with a left side mounted dock. I added the menu to the left top corner like Elementary OS and Mate (good old Unity desktop environment). I redesign it to look like MacOS. I even changed program icons. The day after that day, I redesigned it to look minimal with less clutter and more of a tiling window manager.&lt;/p&gt;

&lt;p&gt;I was constantly trying to optimize the user experience and my workflow, but I was literally lost in customization and ricing.&lt;/p&gt;

&lt;p&gt;I was always ricing. I installed too many desktop environments on the same Ubuntu distribution. It was too much ricing.. too much customization.. too much change.. too much issues including "not booting to Ubuntu"!&lt;/p&gt;

&lt;p&gt;After a crazy 2 month, I came to realize what I want! and I thought why?&lt;/p&gt;

&lt;p&gt;That's the great word. WHY?&lt;/p&gt;

&lt;p&gt;Why should I customize that much?&lt;/p&gt;

&lt;p&gt;why all of these changes?&lt;/p&gt;

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

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

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

&lt;p&gt;What I want? What is the purpose? Why I choose this or that?&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovering and growing up
&lt;/h2&gt;

&lt;p&gt;I started to think more clear utilizing my rich experience with different Linux distros. I put some rules, guidelines, goals, specifications, or points that should be in my chosen Linux distro.&lt;/p&gt;

&lt;p&gt;I wrote this list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;passed the test of time with at least 10 years.&lt;/li&gt;
&lt;li&gt;used by millions of people to make sure it is tested on various PC / laptop configurations.&lt;/li&gt;
&lt;li&gt;left mounted dock of apps.&lt;/li&gt;
&lt;li&gt;top bar.&lt;/li&gt;
&lt;li&gt;touchpad gestures like MacOS, Elementary OS, and Pop!_OS.&lt;/li&gt;
&lt;li&gt;performant and efficient as a daily driver not in synthetic benchmarks.&lt;/li&gt;
&lt;li&gt;preferably has APT package manager (Debian based, or Ubuntu based).&lt;/li&gt;
&lt;li&gt;not a rolling release, not cutting edge, I need stability more.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, I decided to go with GNOME as a desktop environment as I need too minimal customization. I just need to put the app dock on the left. Then I compared Elementary OS, Pop!_OS, Ubuntu, NixOS. I landing on the orange Ubuntu land. I still using Ubuntu and I love it. I am writing this post on Ubuntu 24.04.1 LTS operating system of choice.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fhpk1xvpivj1u2w41xgs0.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fhpk1xvpivj1u2w41xgs0.jpg" alt="Ubuntu with GNOME desktop environment" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was the chosen operating system for me. Ubuntu is great with its default GNOME desktop environment. Ubuntu passed the test of time, and used by millions of users around the world. Its performance and efficiency is great for me. GNOME DE has a topbar, and an apps dock which Ubuntu left mounted it for me. Its package manager is APT with their new Snap package manager. It has a famous long-term support release every two years (LTS). I daily drive Ubuntu and it is great and familiar and easy to use for me.&lt;/p&gt;

&lt;p&gt;I now focus on programs I run, software tools I create, my time management, .. etc. I am feeling I grown up. I learnt more than enough about GNU Linux and its distros.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>Why Microsoft is porting Typescript Compiler into Go ?</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Wed, 12 Mar 2025 18:44:01 +0000</pubDate>
      <link>https://dev.to/abanoubha/why-microsoft-is-porting-typescript-compiler-into-go--4o6f</link>
      <guid>https://dev.to/abanoubha/why-microsoft-is-porting-typescript-compiler-into-go--4o6f</guid>
      <description>&lt;p&gt;On March 11, 2025 Anders Hejlsberg, technical fellow at Microsoft, &lt;a href="https://www.youtube.com/watch?v=pNlq-EVld70" rel="noopener noreferrer"&gt;announced&lt;/a&gt; porting Typescript Compiler in Go programming language on the official YouTube channel of Microsoft Developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why moving to another language? Why not self-hosting?
&lt;/h2&gt;

&lt;p&gt;Self-hosting is writing the language compiler it the language itself. The TSC is self-hosted right now, but the team is porting it into Go.&lt;/p&gt;

&lt;p&gt;The Typescript team saw an increase of latency with the grow of the codebases in Microsoft, so, they think tsc needs to get faster and scalable. So, it needs to be more concurrent for better scalability, and more native to get as much performance from the hardware as possible.&lt;/p&gt;

&lt;p&gt;They thought of Go, Rust, C#, .. and other languages.&lt;/p&gt;

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

&lt;p&gt;Anders said Go is similar to Typescript in syntax so tsc can be ported (rewritten in exact same way) not rewritten from scratch reasoning from first principles in a new language.&lt;/p&gt;

&lt;p&gt;Typescript team members can pick Go language in a week or so, because Go is an easy to learn programming language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not C# ?
&lt;/h2&gt;

&lt;p&gt;Typescript Compiler codebase relies heavily on functions and structs not OOP, so it is easier to port the codebase into Go than porting it into C# as C sharp is more object oriented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not Rust ?
&lt;/h2&gt;

&lt;p&gt;Rust language is too different than Typescript, so it needs a complete rewrite reasoning from first principles using "the Rust way". It is a multi-year job with too much complexity.&lt;/p&gt;

&lt;p&gt;Developers and engineers working on the Typescript compiler team need months to learn Rust.&lt;/p&gt;

&lt;p&gt;the codebase is written on a way that is relying on a garbage collector. So, if we rewrite it in Rust, its code layout will be so different. It will be a harder to get done in a timely manner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gains of porting tsc into Go
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;10X more speed&lt;/li&gt;
&lt;li&gt;half memory usage&lt;/li&gt;
&lt;li&gt;more scalable as a benefit of Go concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My opinion on porting tsc into Go
&lt;/h2&gt;

&lt;p&gt;I see it as a mature decision that weighs the benefits and moves forward into a better performant efficient yet easily maintainable future.&lt;/p&gt;

&lt;p&gt;The faster compile time of Go language is beneficial as it helps developers focus on iterating in their code not waiting for compiling or testing. It is similar to dynamic typed language in its compile time, yet it is static typed and native. It is the best of both worlds.&lt;/p&gt;

&lt;p&gt;Cross platform compatibility of Go language made it a better choice for tsc as it needs to be available on Linux operating systems, Windows (of course), and MacOS.&lt;/p&gt;

&lt;p&gt;As Anders put it on his &lt;a href="https://youtu.be/10qowKUW82U" rel="noopener noreferrer"&gt;interview&lt;/a&gt; on Michigan Typescript channel: "Go is the lowest level language we can get to and still have automatic garbage collector, it's the most native-first language we can get to and still have automatic GC". (at 19:29 time mark).&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Choosing my distro: Ubuntu, NixOS, Elementary OS or Pop!_OS</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Mon, 23 Sep 2024 14:29:35 +0000</pubDate>
      <link>https://dev.to/abanoubha/choosing-my-distro-ubuntu-nixos-elementary-os-or-popos-37d2</link>
      <guid>https://dev.to/abanoubha/choosing-my-distro-ubuntu-nixos-elementary-os-or-popos-37d2</guid>
      <description>&lt;p&gt;I used Ubuntu for more than 8 years now. I tried Elementary OS, Pop!_OS, Kali Linux, Parrot OS, Linux Mint, Manjaro, .. and too many other distros. But today, I wanna decide what to use in my journey as a software developer and tech geek.&lt;/p&gt;

&lt;p&gt;I eliminated all other Linux distributions, and the list of choice is as follows with my reasons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu&lt;/strong&gt;: wholesome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elementary OS&lt;/strong&gt;: the great user experience (UX) of Pantheon desktop environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pop!_OS&lt;/strong&gt;: The new efficient desktop environment called COSMIC desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nix OS&lt;/strong&gt;: the declarative approach, immutability and reproducibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can try cosmic desktop once it reaches production (now, in early alpha) on Nix OS. So, no real need to use Pop!_OS (for me).&lt;/p&gt;

&lt;p&gt;I can try Pantheon desktop on Nix OS, too. So, no real need (for me) to install Elementary OS.&lt;/p&gt;

&lt;p&gt;So the distro list is now became.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;Nix OS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, I use Ubuntu as my daily driver Linux distribution of choice. So, I will install Nix OS besides Ubuntu as a dual boot.&lt;/p&gt;

&lt;p&gt;But for now, I will try Nix OS in GNOME boxes first. After getting more familiar with it, I will install it besides Ubuntu.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; , &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt; , &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; , and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ubuntu</category>
      <category>nixos</category>
    </item>
    <item>
      <title>How to improve OCR accuracy ? | my 5-year experience</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Fri, 12 Jul 2024 09:06:48 +0000</pubDate>
      <link>https://dev.to/abanoubha/how-to-improve-ocr-accuracy-my-5-year-experience-1ig5</link>
      <guid>https://dev.to/abanoubha/how-to-improve-ocr-accuracy-my-5-year-experience-1ig5</guid>
      <description>&lt;h2&gt;
  
  
  my experience with OCR technologies
&lt;/h2&gt;

&lt;p&gt;I created my 1st image to text converting app on Oct 6th 2018, so it was 5+ years ago. I have been improving, learning, rewriting, iterating, experimenting on OCR technology since then.&lt;/p&gt;

&lt;p&gt;I created all of these apps to extract text from images/photos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.softwarepharaoh.img2txt" rel="noopener noreferrer"&gt;IMG2TXT: Image To Text OCR&lt;/a&gt; (&lt;a href="https://github.com/abanoubha/img2txt_app" rel="noopener noreferrer"&gt;opensource&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.softwarepharaoh.img2txt.latin" rel="noopener noreferrer"&gt;IMG2TXT OCR App&lt;/a&gt; (discontinued)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.softwarepharaoh.img2txt.hindi" rel="noopener noreferrer"&gt;IMG2TXT Hindi / Indian OCR App&lt;/a&gt; (will be discontinued after the 1st app supports Hindi/Indian)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.softwarepharaoh.img2txt.persian" rel="noopener noreferrer"&gt;IMG2TXT : Persian OCR App&lt;/a&gt; (will be discontinued after the 1st app supports Persian)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After all these years, I have a simple thing to say "What is measured, improves". This quote is from "The Effective Executive" book by Peter F. Drucker.&lt;/p&gt;

&lt;h2&gt;
  
  
  ideas to improve OCR accuracy
&lt;/h2&gt;

&lt;p&gt;Improving OCR accuracy of extracted text is not a small task. The obvious answer to how to improve text extraction from images is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;improve "traineddata" models&lt;/li&gt;
&lt;li&gt;use auto correct; for example correct &lt;code&gt;boxmg&lt;/code&gt; into &lt;code&gt;boxing&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;use High DPI photo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used to focus on all of these bullet points and more of them, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pre-processing images/photo with

&lt;ul&gt;
&lt;li&gt;black and white filter&lt;/li&gt;
&lt;li&gt;binarization with adaptive threshold&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;increase the DPI of the image artificially to be around 300 dpi&lt;/li&gt;

&lt;li&gt;use the best models from tesseract OCR despite their large size&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;These ideas led me to improve performance and text accuracy to certain extent. Don't get me wrong! these tips and tricks me my apps run fast enough with good enough accuracy. But I see more accurate apps! for example, Google ML kit produces almost 99% accuracy in text extraction from clear images.&lt;/p&gt;

&lt;h2&gt;
  
  
  how to measure OCR accuracy improvement/progress ?
&lt;/h2&gt;

&lt;p&gt;My measurements are not good enough. I need to follow "What is measured, improves" concept. I need to have a set of photos of papers to measure my app's accuracy against. I need a sample of photos that represents the real world use cases. Then I need to refactor and enhance the text extraction accuracy against this sample of images. So, people get the improvements in their daily tasks of typing a paper into digital document.&lt;/p&gt;

&lt;h2&gt;
  
  
  specifications of the image sample
&lt;/h2&gt;

&lt;p&gt;I need to collect that image sample with the real world use cases in mind. So I need these images.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a photo of an old book, the paper is perfectly laid out on an even surface&lt;/li&gt;
&lt;li&gt;a photo of an old book, the paper is warped as the book is open&lt;/li&gt;
&lt;li&gt;a photo of a modern book with clear white background&lt;/li&gt;
&lt;li&gt;a photo of a modern book with some image/illustration between paragraphs&lt;/li&gt;
&lt;li&gt;a photo of an article written in Arabic with some words in English&lt;/li&gt;
&lt;li&gt;a photo of an old yellowish book paper with a cursive font&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the initial set of image specification of the collected photos. If you have a specific use case, send some photo samples to me on &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt; or &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ocr</category>
      <category>opensource</category>
      <category>android</category>
    </item>
    <item>
      <title>Go or Python ? Which language is used more in production software?</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Mon, 01 Jul 2024 06:36:04 +0000</pubDate>
      <link>https://dev.to/abanoubha/go-or-python-which-language-is-used-more-in-production-software-e0l</link>
      <guid>https://dev.to/abanoubha/go-or-python-which-language-is-used-more-in-production-software-e0l</guid>
      <description>&lt;p&gt;I think that Go is better than Python. And that's my own opinion. But I was wondering if people are using Go or Python for their production software in the real world. I want to get statistics of production software to compare and understand the real world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source of statistics
&lt;/h2&gt;

&lt;p&gt;In a &lt;a href="https://abanoubhanna.com/posts/go-vs-rust-use-production/"&gt;previous post&lt;/a&gt;, I used Homebrew as the source of statistics about apps written in each programming language. Homebrew is a package manager for MacOS and Linux distros.&lt;/p&gt;

&lt;p&gt;Homebrew provides a &lt;a href="https://formulae.brew.sh/api/formula.json"&gt;json file&lt;/a&gt; of the index of all packages and apps in Homebrew Core Formulae.&lt;/p&gt;

&lt;p&gt;So I created a &lt;a href="https://github.com/abanoubha/gobrew"&gt;simple CLI application&lt;/a&gt; written in Go to use that updated JSON file to count the apps using a specific programming language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Statistics by gobrew
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;language&lt;/th&gt;
&lt;th&gt;June 2&lt;/th&gt;
&lt;th&gt;July 1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;988&lt;/td&gt;
&lt;td&gt;998&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;777&lt;/td&gt;
&lt;td&gt;783&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cython&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;According to statistics, Go is used for more production software than Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Go is used more than Python ?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;comparison&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;Python / Cython&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;compilation speed&lt;/td&gt;
&lt;td&gt;very fast&lt;/td&gt;
&lt;td&gt;Python: not compiled, Cython: very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;runtime performance&lt;/td&gt;
&lt;td&gt;very fast&lt;/td&gt;
&lt;td&gt;Python: slow, Cython: good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;concurrency support&lt;/td&gt;
&lt;td&gt;great&lt;/td&gt;
&lt;td&gt;bad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;libraries &amp;amp; frameworks&lt;/td&gt;
&lt;td&gt;good enough&lt;/td&gt;
&lt;td&gt;huge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;readability&lt;/td&gt;
&lt;td&gt;good&lt;/td&gt;
&lt;td&gt;good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As you can see, Go checks all factors mentioned, but Python is great at things and bad at other things. Programming languages are just tools, so, overall, I personally choose Go every time as the better tool to get the job done. Most software developers choose Go over Python as you can conclude from the statistics above.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@AbanoubHA?sub_confirmation=1"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/abanoubha"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>python</category>
    </item>
    <item>
      <title>Is Go Used in Production more than Rust ?</title>
      <dc:creator>Abanoub Hanna</dc:creator>
      <pubDate>Fri, 26 Apr 2024 08:37:16 +0000</pubDate>
      <link>https://dev.to/abanoubha/is-go-used-in-production-more-than-rust--2def</link>
      <guid>https://dev.to/abanoubha/is-go-used-in-production-more-than-rust--2def</guid>
      <description>&lt;p&gt;I was wondering if programs used in the real world are mostly written/built in Rust or Go? How to create a real world statistic to compare ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Homebrew package manager
&lt;/h2&gt;

&lt;p&gt;I found that Homebrew lists the dependencies of the package like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;brew info eza
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; eza: stable 0.18.13 &lt;span class="o"&gt;(&lt;/span&gt;bottled&lt;span class="o"&gt;)&lt;/span&gt;
Modern, maintained replacement &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;ls
&lt;/span&gt;https://github.com/eza-community/eza
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/e/eza.rb
License: MIT
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Dependencies
Build: pandoc ✘, pkg-config ✔, rust ✘
Required: libgit2 ✘
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Analytics
&lt;span class="nb"&gt;install&lt;/span&gt;: 12,792 &lt;span class="o"&gt;(&lt;/span&gt;30 days&lt;span class="o"&gt;)&lt;/span&gt;, 38,295 &lt;span class="o"&gt;(&lt;/span&gt;90 days&lt;span class="o"&gt;)&lt;/span&gt;, 68,375 &lt;span class="o"&gt;(&lt;/span&gt;365 days&lt;span class="o"&gt;)&lt;/span&gt;
install-on-request: 12,790 &lt;span class="o"&gt;(&lt;/span&gt;30 days&lt;span class="o"&gt;)&lt;/span&gt;, 38,293 &lt;span class="o"&gt;(&lt;/span&gt;90 days&lt;span class="o"&gt;)&lt;/span&gt;, 68,375 &lt;span class="o"&gt;(&lt;/span&gt;365 days&lt;span class="o"&gt;)&lt;/span&gt;
build-error: 0 &lt;span class="o"&gt;(&lt;/span&gt;30 days&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dependencies of eza to build are pandoc, pkg-config and Rust. So, I can get all software packages in Homebrew and query every package to get its dependencies, then calculate the number of packages which depends on Go and others on Rust.&lt;/p&gt;

&lt;p&gt;I was wondering if I should execute system commands of &lt;code&gt;brew list&lt;/code&gt; and &lt;code&gt;brew info &amp;lt;pkg-name&amp;gt;&lt;/code&gt;, but fortunately, Homebrew has a &lt;a href="https://formulae.brew.sh/api/formula.json" rel="noopener noreferrer"&gt;json file&lt;/a&gt; containing all Homebrew Core Formulae.&lt;/p&gt;

&lt;h2&gt;
  
  
  gobrew
&lt;/h2&gt;

&lt;p&gt;So, I created a &lt;a href="https://github.com/abanoubha/gobrew" rel="noopener noreferrer"&gt;simple Go program named it "gobrew"&lt;/a&gt; to get the JSON API, then parse it, and count all Go-based software packages.&lt;/p&gt;

&lt;p&gt;I made &lt;strong&gt;gobrew&lt;/strong&gt; more general, so, you can use it to get the number of packages written in Ruby by this command &lt;code&gt;gobrew -l ruby&lt;/code&gt;. You can specify any programming language or library or build system or runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Statistics on April 26, 2024
&lt;/h2&gt;

&lt;p&gt;The number of packages written in &lt;strong&gt;Go&lt;/strong&gt; is &lt;strong&gt;957&lt;/strong&gt;. The number of packages written in &lt;strong&gt;Rust&lt;/strong&gt; is &lt;strong&gt;524&lt;/strong&gt;. That means Go is the most used in software distributed by Homebrew package manager for production by far.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./gobrew &lt;span class="nt"&gt;-l&lt;/span&gt; go
957

&lt;span class="nv"&gt;$ &lt;/span&gt;./gobrew &lt;span class="nt"&gt;-l&lt;/span&gt; rust
524
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can try it yourself via &lt;a href="https://github.com/abanoubha/gobrew" rel="noopener noreferrer"&gt;gobrew on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is a chart to help distinguish the difference in the count of packages.&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%2Fabanoubhanna.com%2Fimg%2Fhomebrew-core-formula-go-rust.svg" 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%2Fabanoubhanna.com%2Fimg%2Fhomebrew-core-formula-go-rust.svg" title="# of Homebrew Core formulae written in Go vs Rust" alt="# of Homebrew Core formulae written in Go vs Rust"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  other programming languages
&lt;/h2&gt;

&lt;p&gt;I used this command to count packages written in these programming languages for me.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./gobrew &lt;span class="nt"&gt;-l&lt;/span&gt; zig
6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a table of programming languages (I thought of) and their packages count.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;pkg count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;python\@3.12&lt;/td&gt;
&lt;td&gt;718&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;python\@3.11&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lua&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ruby&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ocaml&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;perl&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;php&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cython&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zig&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  build systems &amp;amp; libraries &amp;amp; runtimes
&lt;/h2&gt;

&lt;p&gt;I used the following command to count packages which use the build system or runtime to get build or run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./gobrew &lt;span class="nt"&gt;-l&lt;/span&gt; cmake
1011
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a table of build systems, libraries and runtimes (I thought of) and their packages count.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;build system or runtime&lt;/th&gt;
&lt;th&gt;pkg count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pkg-config&lt;/td&gt;
&lt;td&gt;1447&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cmake&lt;/td&gt;
&lt;td&gt;1011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autoconf&lt;/td&gt;
&lt;td&gt;455&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;automake&lt;/td&gt;
&lt;td&gt;435&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;libtool&lt;/td&gt;
&lt;td&gt;366&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ninja&lt;/td&gt;
&lt;td&gt;253&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;meson&lt;/td&gt;
&lt;td&gt;213&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node&lt;/td&gt;
&lt;td&gt;189&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gcc&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;python-setuptools&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llvm&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;luajit&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  my opinion
&lt;/h2&gt;

&lt;p&gt;I think of Rust as a great language for low level programming such as operating system modules and device drivers. And I think of Go as the perfect backend programming language and CLI apps. I think that's why Go is almost 2x more used to create apps distributed via Homebrew compared to Rust.&lt;/p&gt;

&lt;p&gt;I think Go is more useful for most cases, but there are other specific cases suitable more for Rust and Zig (which I think &lt;a href="https://abanoubhanna.com/posts/zig-will-succeed/" rel="noopener noreferrer"&gt;will succeed and get popular&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I hope you enjoyed reading this post as much as I enjoyed writing it. If you know a person who can benefit from this information, send them a link of this post. If you want to get notified about new posts, follow me on &lt;a href="https://www.youtube.com/@LetsFixThatError?sub_confirmation=1" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;, &lt;a href="https://x.com/abanoubha" rel="noopener noreferrer"&gt;Twitter (x)&lt;/a&gt;, &lt;a href="https://linkedin.com/in/abanoub-hanna/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://www.facebook.com/EgyptianCodingGeeks" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;, &lt;a href="https://t.me/EgyptianCodingGeeks" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt; and &lt;a href="https://github.com/abanoubha" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
