<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on Mamadou Babaei</title>
    <link>https://www.babaei.net/tags/linux/</link>
    <description>Recent content in Linux on Mamadou Babaei</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 08 Jun 2025 10:07:00 +0200</lastBuildDate><atom:link href="https://www.babaei.net/tags/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Building Unreal Engine 5.6 From the GitHub Source Code on GNU/Linux With Android Support</title>
      <link>https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-gnu-linux-with-android-support/</link>
      <pubDate>Sun, 08 Jun 2025 10:07:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-gnu-linux-with-android-support/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-gnu-linux-with-android-support/build-unreal-engine-from-github-source-code-gnu-linux-with-android-support.webp&#34; alt=&#34;Building Unreal Engine 5.6 from the GitHub Source Code With Android Support&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-gnu-linux-with-android-support/build-unreal-engine-from-github-source-code-gnu-linux-with-android-support.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Building Unreal Engine 5.6 from the GitHub Source Code With Android Support&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Alright, I’m back with another video.&lt;/p&gt;
&lt;p&gt;If you caught the &lt;a href=&#34;https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-microsof-windows/&#34;&gt;last one on building Unreal Engine 5.6 from source on Windows&lt;/a&gt;, you already know the drill. As promised—this is the GNU/Linux edition.&lt;/p&gt;
&lt;p&gt;We’re doing it the Linux way this time: clean, efficient, and just a bit different. Let’s dive in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE [2025/07/04]&lt;/strong&gt;: &lt;em&gt;The original &lt;code&gt;NDK_ROOT&lt;/code&gt; and &lt;code&gt;NDKROOT&lt;/code&gt; environment variables values used during the video shoot were misconfigured. That has now been corrected.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Building Unreal Engine 5.6 From the GitHub Source Code on Microsoft Windows</title>
      <link>https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-microsof-windows/</link>
      <pubDate>Mon, 05 May 2025 23:00:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-microsof-windows/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-microsof-windows/build-unreal-engine-from-github-source-code-microsof-windows.webp&#34; alt=&#34;Building Unreal Engine 5.6 from the GitHub Source Code&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/build-unreal-engine-from-github-source-code-microsof-windows/build-unreal-engine-from-github-source-code-microsof-windows.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Building Unreal Engine 5.6 from the GitHub Source Code&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Alright&amp;hellip; I’m back.
Yes, I know—I vanished for a while. But just like the upcoming Unreal Engine &lt;code&gt;5.6&lt;/code&gt; release, I’ve been quietly cooking in the shadows. And now… we’re both making a comeback.&lt;/p&gt;
&lt;p&gt;Today’s tutorial is all about how to build Unreal Engine &lt;code&gt;5.6&lt;/code&gt; from source—on Windows. That’s right, &lt;code&gt;5.6&lt;/code&gt; isn’t officially out yet, but we’re not waiting around. If you’re impatient like me—or just curious to see what Epic’s brewing before the rest of the world—this video is for you.&lt;/p&gt;
&lt;p&gt;Now, some of you patient folks out there might be thinking:
“Why bother? Can’t I just wait for the release?”
Fair question. But here’s the deal—I work for a company that publishes Unreal Engine plugins on the Fab Store. And they want their plugin ready on day zero when the new engine drops. The catch? Epic only allows you to submit plugins once the final version is officially released. So to stay ahead of the curve, we grab the source early, build it, test it, and make sure everything works before the launch day.&lt;/p&gt;
&lt;p&gt;And hey, if you’re a Linux user—don’t worry—I’ve got a separate video coming soon. Just not today. Because building on Linux is like dating in your forties… not complicated, exactly—just different.&lt;/p&gt;
&lt;p&gt;We’ll be diving into more Unreal Engine &lt;code&gt;5.6&lt;/code&gt; goodness over the coming months, so buckle up, hit that subscribe button, and let’s get nerdy.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>WebRTC IP Leak Demonstration</title>
      <link>https://www.babaei.net/blog/webrtc-ip-leak-demonstration/</link>
      <pubDate>Mon, 25 Nov 2024 00:49:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/webrtc-ip-leak-demonstration/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/webrtc-ip-leak-demonstration/webrtc-ip-leak-demonstration-rust-javascript.webp&#34; alt=&#34;WebRTC IP Leak Demonstration using Rust and JavaScript&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/webrtc-ip-leak-demonstration/webrtc-ip-leak-demonstration-rust-javascript.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;WebRTC IP Leak Demonstration using Rust and JavaScript&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Deep in the vast jungle of the internet, an elusive predator lies in wait: the &lt;strong&gt;WebRTC IP leak&lt;/strong&gt;. This invisible hunter slithers through the dense digital undergrowth, silent and unseen, ready to strike its next target. The IP addresses of its unsuspecting victims are exposed in an instant. But its danger isn&amp;rsquo;t merely technical; if you&amp;rsquo;re a political activist in a repressive regime, leaking your IP could jeopardize your very life. Today, we embark on an expedition to track this hidden predator, uncover its secrets, and learn how to protect ourselves before it strikes.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>How to disable HP Proliant ML350p Gen8 P420i RAID controller, enable HBA mode (a.k.a. pass-through), and perform a FreeBSD root on ZFS installation</title>
      <link>https://www.babaei.net/blog/disable-hp-proliant-ml350p-gen8-p420i-raid-controller-enable-hba-mode-pass-through-perform-freebsd-root-zfs-installation/</link>
      <pubDate>Wed, 10 Nov 2021 18:33:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/disable-hp-proliant-ml350p-gen8-p420i-raid-controller-enable-hba-mode-pass-through-perform-freebsd-root-zfs-installation/</guid>
      <description>&lt;p&gt;I recently purchased a second-hand HP Proliant ML350p Gen8 in order to be used as a home server and to my disappointment realized I won&amp;rsquo;t be able to disable the hardware RAID that comes with this model, at least at first glance. Well, there is a way to do that, which is supported by HP themselves. And, this is how to do it the easy way!&lt;/p&gt;
&lt;p&gt;But, before we proceed any further, you might ask why do I need to disable the hardware RAID? The answer is because I need to install ZFS. There is already plenty of documentation why installing ZFS on a hardware RAID is a terrible idea. Thus, I won&amp;rsquo;t go over that since it&amp;rsquo;s not the focus of this article.&lt;/p&gt;
&lt;p&gt;Again, before we go any further there&amp;rsquo;s a catch you should know about. If you&amp;rsquo;d enable HBA-mode, the server won&amp;rsquo;t be able to boot from any disk connected in HBA mode to the controller! You should consider this before converting to HBA mode. In case you need to perform a FreeBSD/Linux root on ZFS installation through this controller there are two solutions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Installing in hardware RAID mode, but making each disk a &lt;code&gt;RAID-0&lt;/code&gt; array consisting of only one disk. For example, if you&amp;rsquo;ve got &lt;code&gt;8&lt;/code&gt; disks, you&amp;rsquo;ll end up with &lt;code&gt;8&lt;/code&gt; &lt;code&gt;RAID-0&lt;/code&gt; arrays. Then you&amp;rsquo;d perform a ZFS installation and your operating system boots as expected. Though this is not recommended and if you&amp;rsquo;d proceed with this approach, it renders the rest of this post useless.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; HP Proliant ML350p provides an SD-Card slot, which can be used to install a full system, which is not recommended due to the wear and tear effect of SDCards with each write-operation on them. In addition to that, this storage type is costly and slow. For example, a &lt;code&gt;SanDisk SDXC Extreme Pro 256GB&lt;/code&gt;, which provides a write speed of &lt;code&gt;90MB/s&lt;/code&gt; and read speed of &lt;code&gt;170MB/s&lt;/code&gt;, costs around &lt;code&gt;€99,99&lt;/code&gt; where I live. With today&amp;rsquo;s standards, this is not fast at all or even good enough, especially on a server. I was also able to find a &lt;code&gt;Sandisk CF Express Extreme Pro 512GB type B&lt;/code&gt;, with a write speed of &lt;code&gt;800MB/s&lt;/code&gt; and a read speed of &lt;code&gt;1500MB/s&lt;/code&gt;. It only costs &lt;code&gt;€629,-&lt;/code&gt;, which costs an arm and leg to buy!&lt;/p&gt;
&lt;p&gt;So, then! What&amp;rsquo;s the solution one might ask? We are going to install only &lt;code&gt;/boot&lt;/code&gt; partition on the internal SD Card. Note, that placing only a bootloader such as GRUB, rEFInd or other similar tools won&amp;rsquo;t work as they won&amp;rsquo;t be able to see the boot drive anyway! So, the only solution is to put the boot partition on the SDCard. This way, the system only reads it one time at boot and it does not even have to be an expensive SD-Card.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s begin!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A quick workaround for Unreal Engine Modeling Tools Editor Mode plugin not showing up on Linux and macOS</title>
      <link>https://www.babaei.net/blog/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos-workaround/</link>
      <pubDate>Mon, 08 Nov 2021 01:10:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos-workaround/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE [2021/11/08]&lt;/strong&gt;: &lt;em&gt;For whitelisting macOS, one could simply add &lt;code&gt;Mac&lt;/code&gt; to &lt;code&gt;PlatformAllowList&lt;/code&gt; inside the &lt;code&gt;.uplugin&lt;/code&gt; file. e.g.&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;Whitelisting Linux inside ModelingToolsEditorMode.uplugin&lt;/span&gt;
    
    
    
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Modules&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ModelingToolsEditorMode&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Editor&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;LoadingPhase&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Default&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PlatformAllowList&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Win64&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Linux&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Mac&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    
&lt;/div&gt;

&lt;hr /&gt;
&lt;p&gt;I&amp;rsquo;ve been trying to enable and make use of &lt;a href=&#34;https://www.unrealengine.com/en-US/tech-blog/unreal-engine-5-s-modeling-mode-takes-shape&#34;&gt;UE5&amp;rsquo;s Modeling Tools Editor Mode Plugin&lt;/a&gt; inside the editor built from &lt;code&gt;ue5-main&lt;/code&gt; and &lt;code&gt;5.0&lt;/code&gt; and struggled to some extent. According to Epic Games, this should suffice:&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;If you are starting up a new project, the modeling mode plugin may need to be turned on. From the Plugins window, enable the Modeling Tools Editor Mode Plugin and restart Unreal Engine.&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;Russell Paul from Unreal Engine&amp;#39;s blog&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://www.unrealengine.com/en-US/tech-blog/unreal-engine-5-s-modeling-mode-takes-shape&#34; title=&#34;https://www.unrealengine.com/en-US/tech-blog/unreal-engine-5-s-modeling-mode-takes-shape&#34;&gt;Unreal Engine 5’s modeling mode takes shape&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, I did enable the plugin from inside the editor:&lt;/p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos-workaround/enabling-unreal-engine-modeling-tools-editor-mode-plugin.webp&#34; alt=&#34;Enabling Unreal Engine Modeling Tools Editor Mode plugin&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos-workaround/enabling-unreal-engine-modeling-tools-editor-mode-plugin.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Enabling Unreal Engine Modeling Tools Editor Mode Plugin&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;To no avail and I was never able to find it inside the UE5 editor:&lt;/p&gt;


&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos-workaround/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos.webp&#34; alt=&#34;Unreal Engine Modeling Tools Editor Mode plugin not showing up after being enabled&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos-workaround/unreal-engine-modeling-tools-editor-mode-plugin-not-showing-up-linux-macos.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Unreal Engine Modeling Tools Editor Mode plugin not showing up after being enabled&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Despite that, I was able to figure out what&amp;rsquo;s wrong. Here&amp;rsquo;s how I fixed it on Linux and it&amp;rsquo;s an easy fix. It probably works on macOS, too. Though I have no idea why Epic Games has disabled it on non-Windows platforms in spite of the fact that it works just fine.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Host Unreal Engine 4 projects on Microsoft Azure DevOPS with unlimited cost-free Git LFS quota</title>
      <link>https://www.babaei.net/blog/host-unreal-engine-projects-microsoft-azure-devops-unlimited-cost-free-git-lfs-quota/</link>
      <pubDate>Sat, 17 Jul 2021 16:12:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/host-unreal-engine-projects-microsoft-azure-devops-unlimited-cost-free-git-lfs-quota/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/host-unreal-engine-projects-microsoft-azure-devops-unlimited-cost-free-git-lfs-quota/unreal-engine-microsoft-azure-devops-git-lfs.webp&#34; alt=&#34;Host Unreal Engine 4 projects on Microsoft Azure DevOPS with unlimited cost free Git LFS quota&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/host-unreal-engine-projects-microsoft-azure-devops-unlimited-cost-free-git-lfs-quota/unreal-engine-microsoft-azure-devops-git-lfs.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Host Unreal Engine 4 projects on Microsoft Azure DevOPS with unlimited cost free Git LFS quota&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;UPDATE 1 [2021/07/25]&lt;/strong&gt;: &lt;em&gt;It seems that Git LFS is able to resume your pushes after a network failure. At least it&amp;rsquo;s like that on Microsoft Azure DevOPS. So, it should be totally redundant to divide huge commits into smaller ones. How have I noticed this? Today, I pushed a huge single commit (around 53GBs) and it failed at 39GB due to a connection error without me noticing it for some time. A few hours later, when I made another attempt by issuing the push command again, it picked up and resumed the push at 39GB, which was really exciting.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 2 [2021/07/25]&lt;/strong&gt;: &lt;em&gt;After pushing the repository to Azure DevOPS, if you find your self stuck in git pull without doing anything, the following command will fix the consecutive pulls:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git pull origin master&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Or, alternatively&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git fetch origin master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git reset --hard FETCH_HEAD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 3 [2021/07/28]&lt;/strong&gt;: &lt;em&gt;I&amp;rsquo;ve noticed due to the fact that the files modification times affect how Rsync and Git work by default, my approach in writing the original script was totally wrong, which in turn caused a bug where on each update it committed all tracked files over again causing huge bloat in the repository, despite the fact that the content of the files was unchanged. Thus, it led me to completely rewrite the script. Hopefully, the new script has been extensively tested with two repositories/projects and works as expected. In addition to that, the script now shows progress for every step, which is a nice addition in order to keep you informed and give an estimation of the time it is going to take to get the job done. And, last but not least, I have edited and improved the blog post a bit.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 4 [2021/08/04]&lt;/strong&gt;: &lt;em&gt;Due to nested &lt;code&gt;.gitignore&lt;/code&gt; files inside the Unreal Engine dependencies, I noticed tiny bits of dependencies for building UE4/UE5 on Microsoft Windows are not getting copied over to the repository. As a result, I fixed the script in order to also take care of that.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 5 [2021/11/30]&lt;/strong&gt;: &lt;em&gt;Sometimes it&amp;rsquo;s possible that the amount of renamed Unreal Engine files surpass the Git&amp;rsquo;s optimal rename limit inside the Sync repository (the intermediary local git repository that we are going to use for syncing the engine source code with upstream):&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warning: exhaustive rename detection was skipped due to too many files.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;warning: you may want to set your diff.renameLimit variable to at least &lt;span style=&#34;color:#ae81ff&#34;&gt;13453&lt;/span&gt; and retry the command.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;So, you could set that to a really large number in order to keep track of file renames:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd ~/dev/MamadouArchives-Sync
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git config diff.renameLimit &lt;span style=&#34;color:#ae81ff&#34;&gt;999999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git config merge.renameLimit &lt;span style=&#34;color:#ae81ff&#34;&gt;999999&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;em&gt;You will get this warning only when the Git option &lt;code&gt;diff.renames&lt;/code&gt; is set to &lt;code&gt;true&lt;/code&gt; (default behavior). Likewise, the above settings does not have any effects when the copy/rename detection is turned off. Nonetheless, you can always check your settings with:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git config -l&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 6 [2021/12/18]&lt;/strong&gt;: &lt;em&gt;I&amp;rsquo;ve added a step regarding &lt;code&gt;EngineAssociation&lt;/code&gt; in the project&amp;rsquo;s &lt;code&gt;.uproject&lt;/code&gt; file, which I forgot to mention in the original post.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 7 [2023/03/03]&lt;/strong&gt;: &lt;em&gt;In UE5 &lt;code&gt;UE4Games.uprojectdirs&lt;/code&gt; file shas been renamed to &lt;code&gt;Default.uprojectdirs&lt;/code&gt;. Though the syntax and the contents of the file has remained the same.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 8 [2023/03/04]&lt;/strong&gt;: &lt;em&gt;After upgrading my project to Unreal Engin 5.1 despite the fact that I&amp;rsquo;ve already set the git configuration &lt;code&gt;http.version&lt;/code&gt; to &lt;code&gt;HTTP/1.1&lt;/code&gt; as instructed in this article, despite the commit size of no bigger than &lt;code&gt;166.30 MB&lt;/code&gt; and the acceptable upload bandwidth I&amp;rsquo;ve got, I was getting &lt;code&gt;HTTP 413 Request Entity Too Large&lt;/code&gt; error:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enumerating objects: 190058, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Counting objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;164439/164439&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Delta compression using up to &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; threads
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compressing objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;113439/113439&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Writing objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;138834/138834&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, 166.30 MiB | 47.32 MiB/s, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total &lt;span style=&#34;color:#ae81ff&#34;&gt;138834&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;delta 35613&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, reused &lt;span style=&#34;color:#ae81ff&#34;&gt;121343&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;delta 22206&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, pack-reused &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;error: RPC failed; HTTP &lt;span style=&#34;color:#ae81ff&#34;&gt;413&lt;/span&gt; curl &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt; The requested URL returned error: &lt;span style=&#34;color:#ae81ff&#34;&gt;413&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;send-pack: unexpected disconnect &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; reading sideband packet
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fatal: the remote end hung up unexpectedly
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Everything up-to-date&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;I tried every suggestion that I came across in order to debug and resolve the issue to no avail. Including enabling git verbose logging:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ export GIT_TRACE_PACKET&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;                      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ export GIT_TRACE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ export GIT_CURL_VERBOSE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;And then maxing out on all the size limits, buffer, packet sizes, and other hints:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;core&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	compression &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    packedGitLimit &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 512m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    packedGitWindowSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 512m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;http&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    postBuffer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2147483648&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;https&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    postBuffer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2147483648&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;init&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    defaultBranch &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;pack&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    deltaCacheSize &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2047m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    packSizeLimit &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2047m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	window &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    windowMemory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2047m&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Then I tried to change the origin URL to SSH:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;remote &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;origin&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; https://SOME-ORGANIZATION@dev.azure.com/SOME-ORGANIZATION/MamadouArchives/_git/MamadouArchives
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;#url = git@ssh.dev.azure.com:v3/SOME-ORGANIZATION/MamadouArchives/MamadouArchives&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;And then pushing without LFS:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git push --set-upstream origin 5.1 --no-verify&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;This attempt was futile as well, that made me revert back to https. Then I tried to push commit by commit since I had made a few commits using (&lt;code&gt;5.1&lt;/code&gt; which has been repeated twice in the following command, is the name of the new local branch intended to be pushed):&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git rev-list --reverse 5.1 | ruby -ne &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;i ||= 0; i += 1; puts $_ if i % 1 == 0&amp;#39;&lt;/span&gt; | xargs -I&lt;span style=&#34;color:#f92672&#34;&gt;{}&lt;/span&gt; git push origin +&lt;span style=&#34;color:#f92672&#34;&gt;{}&lt;/span&gt;:refs/heads/5.1 --no-verify&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;And sadly, the approach of pushing one commit at a time was frutiless as well :/&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thus, for the time being I&amp;rsquo;m stuck pushing the updated project from my Linux machine and pulling it from my Windows machine. I&amp;rsquo;ll do another updated once I&amp;rsquo;ve figured what&amp;rsquo;s going wrong.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 9 [2023/03/04]&lt;/strong&gt;: &lt;em&gt;As an experiment, I did create a new organiation and a new repository inside it. Then prior to changing the origin URL, I fetched all LFS objects issuing:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git lfs fetch --all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fetch: &lt;span style=&#34;color:#ae81ff&#34;&gt;78618&lt;/span&gt; objects found, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.                                                                      
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fetch: Fetching all references...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then, I decided to first push the Git comnmits without the LFS objects, so after updating the origin URL inside the &lt;code&gt;.git/config&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git push --set-upstream origin 5.1 --no-verify
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enumerating objects: 296578, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Counting objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;296578/296578&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Delta compression using up to &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt; threads
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compressing objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;210384/210384&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Writing objects: 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;296578/296578&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, 360.11 MiB | 5.78 MiB/s, &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Total &lt;span style=&#34;color:#ae81ff&#34;&gt;296578&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;delta 78143&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, reused &lt;span style=&#34;color:#ae81ff&#34;&gt;296578&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;delta 78143&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;, pack-reused &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Analyzing objects... &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;296578/296578&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;77738&lt;/span&gt; ms&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Storing packfile... &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10303&lt;/span&gt; ms&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;remote: Storing index... &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3740&lt;/span&gt; ms&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To https://dev.azure.com/SOME-ORGANIZATION/MamadouArchives/_git/MamadouArchives
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; * &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;new branch&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;            5.1 -&amp;gt; 5.1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;branch &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;5.1&amp;#39;&lt;/span&gt; set up to track &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;origin/5.1&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;¯\_(ツ)&lt;/em&gt;/¯ as unexpected as it seems, it worked! As you can see my actual Git objects without the LFS objects on this repository are in no way near the &lt;code&gt;10 GB&lt;/code&gt; size limit:_&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git count-objects -vH                         
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;count: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;               
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;size: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; bytes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;in-pack: &lt;span style=&#34;color:#ae81ff&#34;&gt;296583&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;packs: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;size-pack: 366.76 MiB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prune-packable: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;garbage: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;size-garbage: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; bytes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;The issue might be that I&amp;rsquo;ve reached some kind of limit on the main organization that I&amp;rsquo;m not aware of.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyways, then I pushed the master and checked out back the new brnach for continuation on the upgrade:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git push origin master --no-verify
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git checkout 5.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;And, then proceeded to pushing all LFS objects:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git lfs push origin --all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 10 [2023/03/05]&lt;/strong&gt;: &lt;em&gt;Yesterday, I removed a large redundant repository from the previous organization, in order to see if I could still push my updates and the error I am getting was not due to hitting some kind of ceiling limit. It didn&amp;rsquo;t work. I did also cleanup the limit hacks I&amp;rsquo;ve added to my &lt;code&gt;~/.gitconfig&lt;/code&gt; in UPDATE 8. Then, after successfully pushing to the new organization/repository, I&amp;rsquo;ve decided to revert back the URL section for the orgin inside my &lt;code&gt;.git/config&lt;/code&gt; inside the local repository and try to push once more to the old repository and guess what? It worked! Weird Microsoft/Azure! Not sure what fixed the issue. It could be even I had to wait for Microsoft to clean up the repository&amp;rsquo;s space I&amp;rsquo;ve deleted if the organization size limit was the issue. Don&amp;rsquo;t really know.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Among the gamedev industry, it&amp;rsquo;s a well-known fact that Unreal Engine projects sizes have always been huge and a pain to manage properly. And it becomes more painful by the day as your project moves forward and grows in size. Some even keep the Engine source and its monstrous binary dependencies inside their source control management software. In case you are a AAA game development company or you are working for one, there&amp;rsquo;s probably some system in place with an unlimited quota to take care of that. But, for most of us indie devs, or individual hobbyists, it seems there are not lots of affordable options, especially that your team is scattered across the globe.&lt;/p&gt;
&lt;p&gt;There are plenty of costly solutions to keep UE4 projects under source control; ranging from maintaining a local physical server or renting a VPS with plenty of space on the cloud, equipped with a self-hosted Git, SVN, or Perforce, to use cloud SCM providers such as GitHub, GitLab, BitBucket, or Perforce. Since I prefer cloud SCM providers and Git + Git LFS (which also supports file locking), let&amp;rsquo;s take a look at some popular ones such as GitHub and GitLab.&lt;/p&gt;
&lt;p&gt;GitHub for one, provides data packs, but the free offering is far from enough for collaborative UE4 projects:&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;&lt;p&gt;Every account using Git Large File Storage receives 1 GB of free storage and 1 GB a month of free bandwidth. If the bandwidth and storage quotas are not enough, you can choose to purchase an additional quota for Git LFS. Unused bandwidth doesn&amp;rsquo;t roll over month-to-month.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;Additional storage and bandwidth is offered in a single data pack. One data pack costs $5 per month, and provides a monthly quota of 50 GB for bandwidth and 50 GB for storage. You can purchase as many data packs as you need. For example, if you need 150 GB of storage, you&amp;rsquo;d buy three data packs.&lt;/p&gt;
&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;github.com&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://docs.github.com/en/billing/managing-billing-for-git-large-file-storage/about-billing-for-git-large-file-storage&#34; title=&#34;https://docs.github.com/en/billing/managing-billing-for-git-large-file-storage/about-billing-for-git-large-file-storage&#34;&gt;About billing for Git Large File Storage&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;For GitLab, although the initial generous &lt;code&gt;10GB&lt;/code&gt; repository size is way beyond the &lt;code&gt;1GB&lt;/code&gt; repository size offer by GitHub, the LFS pricing is insanely high:&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Additional repository storage for a namespace (group or personal) is sold in annual subscriptions of $60 USD/year in increments of 10GB. This storage accounts for the size calculated from Repositories, which includes the git repository itself and any LFS objects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When adding storage to an existing subscription, you will be charged the prorated amount for the remaining term of your subscription. (ex. If your subscription ends in 6 months and you buy storage, you will be charge for 6 months of the storage subscription, i.e. $30 USD)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;gilab.com&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://about.gitlab.com/pricing/licensing-faq/#about-supplemental-storage&#34; title=&#34;https://about.gitlab.com/pricing/licensing-faq/#about-supplemental-storage&#34;&gt;Licensing and subscription FAQ, About Supplemental Storage&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, before this all get you disappointed, let&amp;rsquo;s hear the good news from the Microsoft Azure DevOPS team:&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;In uncommon circumstances, repositories may be larger than 10GB. For instance, the Windows repository is at least 300GB. For that reason, we do not have a hard block in place. If your repository grows beyond 10GB, consider using Git-LFS, Scalar, or Azure Artifacts to refactor your development artifacts.&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;microsoft.com&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/repos/git/limits?view=azure-devops&#34; title=&#34;https://docs.microsoft.com/en-us/azure/devops/repos/git/limits?view=azure-devops&#34;&gt;Git limits&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before we proceed any further, there are some catches to consider about Microsoft Azure DevOPS:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt;. The maximum Git repository size is &lt;code&gt;10GB&lt;/code&gt;, which considering that we keep binary assets and huge files in LFS, is way beyond any project&amp;rsquo;s actual needs. For Git LFS it seems that &lt;a href=&#34;https://devblogs.microsoft.com/devops/announcing-git-lfs-on-all-vso-git-repos/&#34;&gt;Microsoft since at least 2015 has been providing unlimited free storage&lt;/a&gt;. For comparison, the engine source code for &lt;code&gt;4.27&lt;/code&gt; is &lt;code&gt;1.4GB&lt;/code&gt;, which in turn when it&amp;rsquo;s getting committed to the git repo becomes less than &lt;code&gt;230MB&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd /path/to/ue4.27/source
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ du -h
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;1.4G	.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;add unreal engine 4.27 source code&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git count-objects -vH
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;count: &lt;span style=&#34;color:#ae81ff&#34;&gt;97545&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;size: 900.25 MiB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;in-pack: &lt;span style=&#34;color:#ae81ff&#34;&gt;110815&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;packs: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;size-pack: 227.80 MiB
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prune-packable: &lt;span style=&#34;color:#ae81ff&#34;&gt;97545&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;garbage: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;size-garbage: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; bytes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;. The maximum push size is limited to &lt;code&gt;5GB&lt;/code&gt; at a time. The &lt;code&gt;5GB&lt;/code&gt; limit is only for files in the actual repository and it won&amp;rsquo;t affect LFS objects. Thus, there are no limits for LFS objects&amp;rsquo; pushes. Despite that, if your internet connection is not stable, you could divide your files into multiple commits and push them separately. For example, the initial git dependencies for UE &lt;code&gt;4.27&lt;/code&gt; is around &lt;code&gt;40GB&lt;/code&gt; spanned across &lt;code&gt;~70,000&lt;/code&gt; files. Instead of committing and pushing a &lt;code&gt;40GB&lt;/code&gt; chunk all at once, one could divide that into multiple commits and push those commits one by one using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git rev-list --reverse master &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    | ruby -ne &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;i ||= 0; i += 1; puts $_ if i % 1 == 0&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    | xargs -I&lt;span style=&#34;color:#f92672&#34;&gt;{}&lt;/span&gt; git push origin +&lt;span style=&#34;color:#f92672&#34;&gt;{}&lt;/span&gt;:refs/heads/master&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;. Sadly, at the moment Azure DevOPS does not support LFS over SSH. So, you are bound to git push/pull over https, which for some might be annoying. Especially, that it keeps asking for the https token &lt;code&gt;3&lt;/code&gt; consecutive times on any push or pull!&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;&lt;p&gt;Q: I&amp;rsquo;m using Git LFS with Azure DevOps Services and I get errors when pulling files tracked by Git LFS.&lt;/p&gt;
&lt;p&gt;A: Azure DevOps Services currently doesn&amp;rsquo;t support LFS over SSH. Use HTTPS to connect to repos with Git LFS tracked files.&lt;/p&gt;
&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;microsoft.com&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=azure-devops&#34; title=&#34;https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=azure-devops&#34;&gt;Use SSH key authentication&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;. Last but not least, there is an issue with the Microsoft implementation of LFS, which rejects large LFS objects and spits out a bunch of HTTP &lt;code&gt;413&lt;/code&gt; and &lt;code&gt;503&lt;/code&gt; errors at the end of your &lt;code&gt;git push&lt;/code&gt;. It happened to me when I was pushing &lt;code&gt;40GB&lt;/code&gt; of UE4 binary dependencies. The weird thing was I tried twice and both times it took a few good hours till the end of the push operation and based on measuring the bandwidth usage, the LFS upload size appeared to be more than the actual upload size. According to some answers on &lt;a href=&#34;https://github.com/MicrosoftDocs/azure-devops-docs/issues/4179&#34;&gt;this GitHub issue&lt;/a&gt; and &lt;a href=&#34;https://developercommunity.visualstudio.com/t/git-lfs-push-got-413-error/867488&#34;&gt;this Microsoft developer community question&lt;/a&gt;, it seems the solution is running the following command inside the root of your local repository, before any git pull/push operations:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git config http.version HTTP/1.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Well, not only it did the trick and worked like a charm, but also the push time on the following git push dropped dramatically to &lt;code&gt;30&lt;/code&gt; minutes for that hefty &lt;code&gt;40GB&lt;/code&gt; UE4 binary dependencies.&lt;/p&gt;
&lt;p&gt;OK, after getting ourselves familiarized with all the limits, if you deem this solution a worthy one for managing UE4 projects along with the engine source in the same repository, in the rest of this blog post I&amp;rsquo;m going to share my experiences and a script to keep the engine updated with ease using a Git + LFS setup.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Gregorian / Jalali (a.k.a. Persian Calendar) Date Conversion in C&#43;&#43; using boost::locale</title>
      <link>https://www.babaei.net/blog/gregorian-jalali-persian-calendar-date-conversion-cpp-boost-locale/</link>
      <pubDate>Tue, 25 Feb 2020 00:27:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/gregorian-jalali-persian-calendar-date-conversion-cpp-boost-locale/</guid>
      <description>&lt;p&gt;Well, anyone who has ever developed a C++ game or application with Gregorian to Jalali date conversion (or, vice versa) requirement is well aware of the hurdles of doing such a task. I, for one,  have been maintaining my own cross-platform C++ library for almost two decades now, with occasional bugs coming up from time to time.&lt;/p&gt;
&lt;p&gt;Recently, I have been playing with &lt;a href=&#34;https://www.boost.org/doc/libs/1_72_0/libs/locale/doc/html/index.html&#34;&gt;boost::locale&lt;/a&gt; (developed by &lt;a href=&#34;http://cppcms.com/cv.pdf&#34;&gt;Artyom Beilis&lt;/a&gt; and contributed to &lt;a href=&#34;https://www.boost.org/&#34;&gt;Boost project&lt;/a&gt;) a bit more in order to utilize it in a personal project called &lt;a href=&#34;https://twitter.com/Barandazstorm&#34;&gt;Barandazstorm&lt;/a&gt;, a home-grown social media analysis tool. Browsing &lt;a href=&#34;https://www.boost.org/doc/libs/1_72_0/libs/locale/doc/html/dates_times_timezones.html&#34;&gt;the docs&lt;/a&gt;, I noticed the following example which does not even compile on my compiler:&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;boost::locale Gregorian to Hebrew date conversion example&lt;/span&gt;
    
    
    
    &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;generator gen;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Create locales with Hebrew and Gregorian (default) calendars.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale l_hebrew&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;gen(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en_US.UTF-8@calendar=hebrew&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale l_gregorian&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;gen(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en_US.UTF-8&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Create a Gregorian date from fields
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;date_time &lt;span style=&#34;color:#a6e22e&#34;&gt;greg&lt;/span&gt;(year(&lt;span style=&#34;color:#ae81ff&#34;&gt;2010&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; february() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; day(&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;),l_gregorian);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Assign a time point taken from the Gregorian date to date_time with
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// the Hebrew calendar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;date_time &lt;span style=&#34;color:#a6e22e&#34;&gt;heb&lt;/span&gt;(greg.time(),l_hebrew);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Now we can query the year.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hebrew year is &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; heb &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; year &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;endl;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
    
    
&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;So, I tried to make a guess and replaced the &lt;code&gt;en_US.UTF-8@calendar=hebrew&lt;/code&gt; part with &lt;code&gt;en_US.UTF-8@calendar=jalali&lt;/code&gt; which didn&amp;rsquo;t work. But, on the second try replacing that with &lt;code&gt;en_US.UTF-8@calendar=persian&lt;/code&gt; actually worked! Which is sheer delight; due to the fact that now I found a solution to convert dates between both calendars as efortless as techonologies such as .NET in C++:&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;Two-way Gregorian / Jalali date conversion using boost::locale&lt;/span&gt;
    
    
    
    &lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;52
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;53
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;54
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;55
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;56
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;57
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;58
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;59
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;60
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;61
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;62
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;63
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;64
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;65
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;66
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;67
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;68
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;69
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;70
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;71
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;72
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;73
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;74
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;75
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;76
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;77
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;78
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;79
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;80
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;81
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;82
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;83
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;84
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;85
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;86
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;87
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;88
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;89
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;90
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;91
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;92
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* @file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* @author  Mamadou Babaei &amp;lt;info@babaei.net&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* @version 0.1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* @section LICENSE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* (The MIT License)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* Copyright (c) 2020 Mamadou Babaei
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* Permission is hereby granted, free of charge, to any person obtaining a copy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* of this software and associated documentation files (the &amp;#34;Software&amp;#34;), to deal
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* in the Software without restriction, including without limitation the rights
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* copies of the Software, and to permit persons to whom the Software is
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* furnished to do so, subject to the following conditions:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* The above copyright notice and this permission notice shall be included in
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* all copies or substantial portions of the Software.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* THE SOFTWARE IS PROVIDED &amp;#34;AS IS&amp;#34;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* THE SOFTWARE.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* @section DESCRIPTION
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;* Two-way Gregorian / Jalali date conversion using boost::locale example
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;iomanip&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;cstdlib&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;boost/locale.hpp&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from_gregorian_to_jalali&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;generator generator;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale locale_gregorian &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; generator(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en_US.UTF-8&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale locale_jalali &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; generator(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en_US.UTF-8@calendar=persian&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;date_time gregorian(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;year(&lt;span style=&#34;color:#ae81ff&#34;&gt;2020&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;february()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;day(&lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            locale_gregorian);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;date_time jalali(gregorian.time(), locale_jalali);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Persian date is &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; jalali &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;year()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setfill(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setw(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; (jalali &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;month()) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setfill(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setw(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; jalali &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;day()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;from_jalali_to_gregorian&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;generator generator;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale locale_gregorian &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; generator(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en_US.UTF-8&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale locale_jalali &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; generator(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;en_US.UTF-8@calendar=persian&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;date_time jalali(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;year(&lt;span style=&#34;color:#ae81ff&#34;&gt;1398&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;month(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;day(&lt;span style=&#34;color:#ae81ff&#34;&gt;06&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            locale_jalali);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;date_time gregorian(jalali.time(), locale_gregorian);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;cout &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Gregorian date is &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; gregorian &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;year()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setfill(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setw(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; (gregorian &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;month()) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setfill(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;setw(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; gregorian &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; boost&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;locale&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;period&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;day()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt;endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from_gregorian_to_jalali();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    from_jalali_to_gregorian();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; EXIT_SUCCESS;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
    
    
&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;On a side note, for the above code to work your boost::locale libraries has to be built with &lt;a href=&#34;http://site.icu-project.org/&#34;&gt;ICU&lt;/a&gt; support; otherwise boost::locale throws an exception. On most Linux or BSD distros this is the default when you install Boost libraries from your distro&amp;rsquo;s package manager. On Windows, it requires a bit of effort if you are trying to build Boost binaries yourself, which is another story for another time.&lt;/p&gt;
&lt;p&gt;I did test the above code on FreeBSD, Linux, and Microsoft Windows, using MSVC, GCC, LLVM/Clang, and MinGW, and it&amp;rsquo;s working as expected on all of these platforms.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>A workaround for udevd 100% CPU usage and blank screen freeze on Gentoo GNU/Linux with recent NVIDIA drivers</title>
      <link>https://www.babaei.net/blog/gentoo-nvidia-udevd-x-blank-screen-freeze-100-percent-cpu-usage/</link>
      <pubDate>Mon, 19 Aug 2019 02:37:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/gentoo-nvidia-udevd-x-blank-screen-freeze-100-percent-cpu-usage/</guid>
      <description>&lt;p&gt;A few months back due to various changes in how &lt;a href=&#34;https://www.funtoo.org/&#34;&gt;Funtoo&lt;/a&gt; is being managed, I migrated back from Funtoo to &lt;a href=&#34;https://www.gentoo.org/&#34;&gt;Gentoo&lt;/a&gt; after almost a decade. After some time I realized my laptop randomly gets stuck on a blank screen and freezes just right before my login manager (&lt;a href=&#34;https://github.com/sddm/sddm&#34;&gt;SDDM&lt;/a&gt;) starts. I noticed the hard-disk LED is blinking and the system is actually not freezed and probably is working and stuck on something. Checking the system or Xorg logs did not reveal anything unusual.&lt;/p&gt;
&lt;p&gt;I even &lt;a href=&#34;https://forums.gentoo.org/viewtopic-t-1096286-start-0.html&#34;&gt;posted my issue&lt;/a&gt; on the &lt;a href=&#34;https://forums.gentoo.org/&#34;&gt;Gentoo Forums&lt;/a&gt; and when I thought the issue is gone I marked it as &lt;code&gt;SOLVED&lt;/code&gt; (well, I don&amp;rsquo;t turn off this laptop or reboot too much). But, the problem came back and hunted me over again.&lt;/p&gt;
&lt;p&gt;Finally, I decided to install &lt;a href=&#34;https://juicessh.com/&#34;&gt;JuiceSSH&lt;/a&gt; on my phone since I do not have access to another PC for the time being. When it did freeze, I did &lt;code&gt;ssh&lt;/code&gt; into my Gentoo installation and noticed &lt;code&gt;udevd&lt;/code&gt;&amp;rsquo;s CPU usage is at &lt;code&gt;100%&lt;/code&gt;. I looked up the forums to see if someone else having this issue or not. I cannot recall where on the forums I saw it, but it seems this was a known issue to some users with recent &lt;a href=&#34;https://www.nvidia.com/Download/index.aspx&#34;&gt;NVIDIA drivers&lt;/a&gt; and someone suggested blacklisting the NVIDIA drivers, so the kernel won&amp;rsquo;t load them at boot time as it is going to be loaded by X later on.&lt;/p&gt;
&lt;p&gt;Well, I did the following changes in order to blacklist the NVIDIA modules, so the kernel won&amp;rsquo;t load them at boot itme:&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;/etc/modprobe.d/blacklist.conf&lt;/span&gt;
    
    
    
    
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;blacklist nvidia
blacklist nvidia_drm
blacklist nvidia_modeset
blacklist nvidia_uvm&lt;/code&gt;&lt;/pre&gt;
    
    
    
&lt;/div&gt;

&lt;p&gt;And, viola! It has been a month without any issues so far. It did solve the issue for me, once and for all. Hope it helps someone with a similar issue until this bug is officially fixed.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>My Reddit Wallpaper Downloader Script</title>
      <link>https://www.babaei.net/blog/my-reddit-wallpaper-downloader-script/</link>
      <pubDate>Wed, 08 May 2019 01:01:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/my-reddit-wallpaper-downloader-script/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/my-reddit-wallpaper-downloader-script/i3wm-gruvbox-color-scheme-reddit-wallpaper.webp&#34; alt=&#34;My i3wm setup with amazing gruvbox color scheme and a wallpaper from Reddit&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/my-reddit-wallpaper-downloader-script/i3wm-gruvbox-color-scheme-reddit-wallpaper.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;i3wm setup with amazing gruvbox color scheme and a wallpaper from Reddit&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Update [2019/05/08]&lt;/strong&gt;: Many people have been asking for the wallpaper in the above screenshot. It is from &lt;a href=&#34;https://www.reddit.com/r/Art/comments/aqeq16/system_failure_ii_oil_on_canvas_31x43/&#34;&gt;System Failure II, oil on canvas, 31x43” on r/Art&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Well, I am really fascinated by &lt;a href=&#34;https://www.reddit.com/&#34;&gt;Reddit&lt;/a&gt; art and &lt;a href=&#34;https://scrolller.com/art&#34;&gt;genuine creative ideas such as Scrolller&lt;/a&gt; which &lt;a href=&#34;https://www.reddit.com/r/web_design/comments/6eoa78/i_made_a_simple_website_filled_with_random_nsfw/&#34;&gt;was made possible thanks to gazillions of art pieces scattered throughout various art subreddits&lt;/a&gt;. I am also fascinated by &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_philosophy&#34;&gt;Unix philosophy&lt;/a&gt; and have been a *nix enthusiast for as long as I can remember. In addition to all this, the discovery of &lt;a href=&#34;https://www.reddit.com/r/unixporn/&#34;&gt;r/unixporn&lt;/a&gt; - realizing I am not the only one who cares about aesthetics of their Unix box - was a huge blow for me; to the point that studying the GitHub dotfiles posted along the screenshots on r/unixporn by fellow nix-enthusiast redditors felt like a day to day hubby for me.&lt;/p&gt;
&lt;p&gt;All the while, I had a successful experiment with writing &lt;a href=&#34;https://github.com/NuLL3rr0r/omnibackup&#34;&gt;a complex piece of real-world software in pure Bash with an amazingly wide range of features for around 3.5K lines of code&lt;/a&gt;. The real excitement came when it made to &lt;a href=&#34;https://www.freebsd.org/cgi/ports.cgi?query=omnibackup&amp;amp;stype=name&amp;amp;sektion=all&#34;&gt;the official FreeBSD Ports Tree&lt;/a&gt;. In spite of the fact that many people find Bash syntax annoyingly ugly and unmaintainable and &lt;a href=&#34;https://www.quora.com/Why-do-people-still-write-shell-scripts&#34;&gt;often wonder why do people still write shell scripts by asking it on Quora&lt;/a&gt;, since MS-DOS 6.22 era, I did develop a certain love–hate relationship with shell scripting languages such as Batch Files, Bash, etc. Thus, still &lt;a href=&#34;https://gitlab.com/SeditiousGames/GodsOfDeceit/tree/master/Scripts&#34;&gt;I do automate almost everything with these ancient technologies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, here is my &lt;a href=&#34;https://github.com/NuLL3rr0r/reddit-wallpaper&#34;&gt;fully-configurable wallpaper changer software written in bash which automagically fetches and display wallpapers from your favorite subs&lt;/a&gt;. It has been powering and brightening up my i3wm setup for the past eight months which led me to the conclusion that it deserves a proper introduction.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>How to Run Multiplayer Call of Duty 4: Modern Warfare (Promod LIVE) using Wine on GNU/Linux</title>
      <link>https://www.babaei.net/blog/how-to-run-multiplayer-call-of-duty-modern-warfare-promod-live-using-wine-on-gnu-linux/</link>
      <pubDate>Sun, 29 Jul 2018 18:39:00 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/how-to-run-multiplayer-call-of-duty-modern-warfare-promod-live-using-wine-on-gnu-linux/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/how-to-run-multiplayer-call-of-duty-modern-warfare-promod-live-using-wine-on-gnu-linux/call-of-duty-modern-warfare.webp&#34; alt=&#34;Call of Duty 4: Modern Warfare&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/how-to-run-multiplayer-call-of-duty-modern-warfare-promod-live-using-wine-on-gnu-linux/call-of-duty-modern-warfare.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Call of Duty 4: Modern Warfare&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Well, I haven&amp;rsquo;t played a multiplayer game in ages until recently, when my cool boss announced regular playtimes for all the employees in our company as a group activity in order to put the fun back into work. Since I&amp;rsquo;m a die-hard &lt;a href=&#34;https://www.callofduty.com/&#34;&gt;COD4&lt;/a&gt; fan and I used to play &lt;a href=&#34;https://promod.github.io/&#34;&gt;Promod LIVE&lt;/a&gt; heavily with colleagues and friends, I proposed Call of Duty 4: Promod LIVE 220 which happened to be favored by everybody; except there was one issue: everyone uses Microsoft Windows while I&amp;rsquo;m developing &lt;a href=&#34;https://unrealengine.com/&#34;&gt;UE4&lt;/a&gt; games on a single-boot &lt;a href=&#34;https://funtoo.org/&#34;&gt;Funtoo Linux&lt;/a&gt; system.&lt;/p&gt;
&lt;p&gt;Naturally, my first attempt was running it inside a Windows 7 virtual machine under &lt;a href=&#34;https://www.vmware.com/products/workstation-pro.html&#34;&gt;VMWare Workstation for Linux&lt;/a&gt; which supports up to Direct3D 10 (the exact API used by COD4). Sadly, the experience was very poor and painful with lots of unbearable stuttering on my decent hardware. Thus, the last resort was running it under &lt;a href=&#34;https://www.winehq.org/&#34;&gt;Wine&lt;/a&gt;, which I used to happily run many Windows applications and games under it for many years. Though, throughout those years I replaced almost every Windows application with an equivalent or an alternative Linux application until I gradually stopped using it. In the meanwhile, I also distanced myself from traditional desktop environments such as &lt;a href=&#34;https://www.gnome.org/&#34;&gt;GNOME&lt;/a&gt;, &lt;a href=&#34;https://www.kde.org/&#34;&gt;KDE&lt;/a&gt;, &lt;a href=&#34;https://xfce.org/&#34;&gt;Xfce&lt;/a&gt;, and &lt;a href=&#34;https://lxde.org/&#34;&gt;LXDE&lt;/a&gt;, while experimenting with various window managers specially &lt;a href=&#34;https://i3wm.org/&#34;&gt;i3wm&lt;/a&gt;, which caught my attention for many good reasons. So, in the end I made up my mind and alienated myself from desktop environments once and for all.&lt;/p&gt;
&lt;p&gt;Running a fully-fledged game engine such as &lt;a href=&#34;https://unrealengine.com/&#34;&gt;Unreal Engine 4&lt;/a&gt;, I expected COD4, Wine, and i3 combination to work fine out of the box as it would under any other DE. Well, it turned out that I was too simple-minded about running a fullscreen game such as COD4 under Wine/i3wm. Hopefully, &lt;a href=&#34;https://wiki.winehq.org/FAQ#How_do_I_get_Wine_to_launch_an_application_in_a_virtual_desktop.3F&#34;&gt;as the Wine FAQ states the workaround is super easy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is the full guide on running COD4 v1.7 with Promod LIVE 2.20 on GNU/Linux.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Discourse as a Blog Comment Service on FreeBSD without Docker</title>
      <link>https://www.babaei.net/blog/discourse-as-a-blog-comment-service-on-freebsd-without-docker/</link>
      <pubDate>Fri, 29 Apr 2016 06:49:31 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/discourse-as-a-blog-comment-service-on-freebsd-without-docker/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 1 [2016/09/30]:&lt;/strong&gt; &lt;em&gt;A section has been added to the end of the article for dealing with major FreeBSD upgrades.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2 [2016/09/30]:&lt;/strong&gt; &lt;em&gt;A section has been added to the end of the article for upgrading current installation of Discourse to newer versions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 3 [2016/09/30]:&lt;/strong&gt; &lt;em&gt;A section has been added to the end of the article for installing Discourse under Ruby version managers which is required for dealing with newer versions of Discourse since the current system-wide version of Ruby on FreeBSD is &lt;code&gt;2.2.5p319&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 4 [2016/10/06]:&lt;/strong&gt; &lt;em&gt;I decided to get rid of Discourse on this blog for various reasons including negative feedback from my readers, performance issues, being a memory hog and not so easy on memory, difficult maintenance, dealing with building Ruby Gems which is a tedious task in case they fail to build and a bug that duplicates my posts and creates a new thread for each post which means it won&amp;rsquo;t show previous comments. Last but not least, in my estimation it&amp;rsquo;s too heavy for such a small task such as a comment system.&lt;/em&gt; &lt;strong&gt;&lt;em&gt;As a result, this guide won&amp;rsquo;t be maintained anymore.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/discourse-as-a-blog-comment-service-on-freebsd-without-docker/discourse-logo.webp&#34; alt=&#34;Figure 1. Discourse Logo&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/discourse-as-a-blog-comment-service-on-freebsd-without-docker/discourse-logo.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Figure 1. Discourse Logo&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Well, when it comes to blog comment hosting services for static blogs, you will have a plethora of options such as &lt;a href=&#34;http://solidopinion.com/&#34;&gt;SolidOpinion&lt;/a&gt;, &lt;a href=&#34;https://disqus.com/&#34;&gt;Disqus&lt;/a&gt;, &lt;a href=&#34;http://web.livefyre.com/&#34;&gt;Livefyre&lt;/a&gt;, Google+ or Facebook comments, and many more. Unfortunately, such services has never been an option for me and I resisted them like forever. Yes, I&amp;rsquo;ve got one million reasons to believe and do so which demands another post of its own. So, I&amp;rsquo;ll avoid that argument for now.&lt;/p&gt;
&lt;p&gt;This left me with two choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operate my blogs without the comment section as I did for years&lt;/li&gt;
&lt;li&gt;Running an open source self-host blog comment system such as &lt;a href=&#34;https://github.com/jacobwb/hashover&#34;&gt;HashOver&lt;/a&gt;, &lt;a href=&#34;https://github.com/posativ/isso&#34;&gt;Isso&lt;/a&gt;, &lt;a href=&#34;https://github.com/phusion/juvia&#34;&gt;Juvia&lt;/a&gt; and &lt;a href=&#34;https://github.com/talkatv/talkatv&#34;&gt;talkatv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since people asked me for a way to discuss their feedback on the website, this made the former choice a no go, anymore. So, in a search for the promised commenting system, I spent hours installing and trying every single FLOSS commenting system on GitHub. And everyone of them has had a big flaw that I could not tolerate. Finally, I came to the conclusion that I&amp;rsquo;m out of luck with that. Of course, I always had the option to write my own commenting system according to my own needs. As, I did with &lt;a href=&#34;https://github.com/NuLL3rr0r/blog-subscription-service/&#34;&gt;my own blog subscription system&lt;/a&gt;. But, due to the lack of time that was not an option either.&lt;/p&gt;
&lt;p&gt;It happens that I randomly visit &lt;a href=&#34;http://blog.codinghorror.com/&#34;&gt;Coding Horror by Jeff Atwood&lt;/a&gt; the co-founder of &lt;a href=&#34;https://stackoverflow.com/&#34;&gt;Stack Overflow&lt;/a&gt; and &lt;a href=&#34;http://stackexchange.com/&#34;&gt;Stack Exchange Network&lt;/a&gt;. I&amp;rsquo;ve always read the comments on Coding Horror but never had an urge to write a comment their. Since I&amp;rsquo;ve been desperately looking for a commenting system, this time the different look of its comment system catched my attention. Bingo! He wrote an open source discussion platform software named &lt;a href=&#34;http://www.discourse.org/&#34;&gt;Discourse&lt;/a&gt;. Not necessarily a blog comment system, but &lt;a href=&#34;https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963&#34;&gt;could be used as one&lt;/a&gt;. It even supports &lt;a href=&#34;https://meta.discourse.org/t/rtl-support/1784/82&#34;&gt;the Farsi language and RTL out of the box&lt;/a&gt; which allows me to use it on &lt;a href=&#34;http://fa.babaei.net&#34;&gt;my Farsi blog&lt;/a&gt;, too. In addition to that it supports multi-site which means I have to only run one instance for all my blogs. Just perfect!&lt;/p&gt;
&lt;p&gt;Despite many nice feature it provides, it has a few rough edges, too. I was able to conquer some and some couldn&amp;rsquo;t, yet. But it did not stop me from integrating it into my &lt;a href=&#34;https://hexo.io/&#34;&gt;Hexo&lt;/a&gt;-based blogs after two weeks of testing it. So, there it is, from now on both &lt;a href=&#34;http://www.babaei.net/&#34;&gt;this blog&lt;/a&gt; and &lt;a href=&#34;http://fa.babaei.net/&#34;&gt;my Farsi blog&lt;/a&gt; are discussion aware :).&lt;/p&gt;
&lt;p&gt;OK, the main issue that many people face when they want to install Discourse in a platform other than GNU/Linux, is they get hit in the face by the reading this line in the official documentation:&lt;/p&gt;











  
  
  
  





      
      
      
    
     
      
    
    

    
    
         
         
         

         
        
        
        
        
        
        
      
      
    
  


&lt;blockquote&gt;
  &lt;p&gt;&lt;p&gt;Why do you only officially support Docker?&lt;/p&gt;
&lt;p&gt;Hosting Rails applications is complicated. Even if you already have Postgres, Redis and Ruby installed on your server, you still need to worry about running and monitoring your Sidekiq and Rails processes. Additionally, our Docker install comes bundled with a web-based GUI that makes upgrading to new versions of Discourse as easy as clicking a button.&lt;/p&gt;
&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;How Do I Install Discourse?&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://github.com/discourse/discourse/blob/master/docs/INSTALL.md&#34; title=&#34;https://github.com/discourse/discourse/blob/master/docs/INSTALL.md&#34;&gt;github.com/discourse/discourse/...&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, I know Ruby and Rails are crap and deploying Ruby on Rails apps are pain in the Butt. Do not worry! This was &lt;a href=&#34;https://forums.freebsd.org/threads/55965/&#34;&gt;the first struggle with Discourse that I had&lt;/a&gt; since this blog runs on FreeBSD. And, &lt;a href=&#34;https://wiki.freebsd.org/Docker&#34;&gt;FreeBSD support for Docker&lt;/a&gt; is experimental, yet. Fortunately, I used to deploy &lt;a href=&#34;https://github.com/gitlabhq/gitlabhq&#34;&gt;GitLab&lt;/a&gt; instances on FreeBSD for three years which was also RoR before I migrated to &lt;a href=&#34;https://github.com/gogits/gogs&#34;&gt;Gogs&lt;/a&gt; which kicks butt, anyway! That made it easy to figure out a simple way to deploy Discourse without Docker on FreeBSD.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Happy 24th Birthday: A Linux Kernel Panic At Hometown</title>
      <link>https://www.babaei.net/blog/happy-24th-birthday-a-linux-kernel-panic-at-hometown/</link>
      <pubDate>Tue, 25 Aug 2015 21:00:00 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/happy-24th-birthday-a-linux-kernel-panic-at-hometown/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/happy-24th-birthday-a-linux-kernel-panic-at-hometown/happy-24th-birthday-a-linux-kernel-panic-at-hometown.webp&#34; alt=&#34;A Linux kernel panic on tram 7B at its hometown, Helsinki (Click to enlarge)&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/happy-24th-birthday-a-linux-kernel-panic-at-hometown/happy-24th-birthday-a-linux-kernel-panic-at-hometown-hq.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;A Linux kernel panic on tram 7B at its hometown, Helsinki (Click to enlarge)&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Undeniably, flaming has been around since the dawn of the Internet age. And even worse, it has been on the rise ever since. Gazillions of flame wars on websites such as &lt;a href=&#34;http://slashdot.org&#34;&gt;Slashdot&lt;/a&gt; or &lt;a href=&#34;https://www.reddit.com/&#34;&gt;Reddit&lt;/a&gt; surely is enough proof, the greatest of which is the perennial debates between users of competing operating systems.&lt;/p&gt;
&lt;p&gt;No doubt I&amp;rsquo;m a &lt;a href=&#34;https://en.wikipedia.org/wiki/Free_and_open-source_software&#34;&gt;FLOSS&lt;/a&gt; enthusiast and advocate who considers free/libre/azad software superior to the proprietary ones, by all means possible. But like all software, the FLOSS ones have some shortcomings, too. So, the point is no one-hundred percent reliable software exists on this planet which means open source software may also suffer from bugs or security flaws as proprietary software do.&lt;/p&gt;
&lt;p&gt;Today is &lt;a href=&#34;https://www.kernel.org/&#34;&gt;Linux kernel&lt;/a&gt; birthday and many FLOSS enthusiast and advocates around the globe are going to celebrate it. I&amp;rsquo;m a diehard &lt;a href=&#34;https://www.freebsd.org/&#34;&gt;FreeBSD&lt;/a&gt; fan, but it won&amp;rsquo;t stop me from celebrating Linux birthday. In fact, I still use &lt;a href=&#34;https://www.gnu.org/home.en.html&#34;&gt;GNU&lt;/a&gt;/Linux for building native C/C++ libraries using &lt;a href=&#34;https://developer.android.com/tools/sdk/ndk/&#34;&gt;Android NDK&lt;/a&gt; on a &lt;a href=&#34;http://www.slackware.com/&#34;&gt;Slackware&lt;/a&gt; machine. In addition to that, I used to be a heavy &lt;a href=&#34;http://www.funtoo.org/&#34;&gt;Funtoo&lt;/a&gt; / &lt;a href=&#34;https://www.gentoo.org/&#34;&gt;Gentoo&lt;/a&gt; user. The thing is, I appreciate the tools I use, no matter what. So, I&amp;rsquo;m going to celebrate Linux birthday by telling you a story. A story that made an unforgettable trip even more memorable. Here&amp;rsquo;s the story of a GNU/Linux system in production which crashed in its hometown, Helsinki, Finland.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>OmniBackup: One Script to back them all up</title>
      <link>https://www.babaei.net/blog/omnibackup-one-script-to-back-them-all-up/</link>
      <pubDate>Sat, 08 Aug 2015 03:23:23 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/omnibackup-one-script-to-back-them-all-up/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 1 [2016/09/23]:&lt;/strong&gt; &lt;em&gt;OmniBackup now officially supports GNU/Linux. &lt;a href=&#34;https://github.com/NuLL3rr0r/omnibackup#Requirements&#34;&gt;More info&lt;/a&gt;&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2 [2016/09/23]:&lt;/strong&gt; &lt;em&gt;&lt;a href=&#34;https://github.com/NuLL3rr0r/omnibackup&#34;&gt;Official documentation&lt;/a&gt; moved to GitHub which means this guide won&amp;rsquo;t be maintained anymore and maybe out of date or inaccurate.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A week ago was &lt;em&gt;&lt;a href=&#34;http://sysadminday.com/&#34;&gt;System Administrator Appreciation Day&lt;/a&gt;&lt;/em&gt;. It is celebrated on the last &lt;em&gt;Friday&lt;/em&gt; in &lt;em&gt;July&lt;/em&gt; and it has been celebrated since &lt;em&gt;July 28, 2000&lt;/em&gt;. But, system administrators know not all days are like that day. They face many hard times and struggles during their careers and the worse of them all is either a &lt;a href=&#34;https://www.babaei.net/blog/freebsd-block-brute-force-attacks-using-sshguard-and-ipfw-firewall/&#34;&gt;security breech&lt;/a&gt; or data loss.&lt;/p&gt;
&lt;p&gt;For so many years I&amp;rsquo;ve been writing and maintaining backup scripts on and on, for every single database I added, for every single directory with critical data, or any other service I was running on every new server I got my hands on. In the end, I found myself ended up in a pile of backup scripts and multitudinous cron entries which was a nightmare to keep track of. I even had to manage the schedule so that two backup scripts do not run at the same time. Even more, I had to manually track the backups to see whether they were successful or not. Also, someone has to manually delete the old ones to make rooms for the next ones.&lt;/p&gt;
&lt;p&gt;Therefore, I came up with an elegant solution to replace the old process which I found exceptionally error-prone. An end to all my hardships which I call &lt;a href=&#34;https://gitlab.com/NuLL3rr0r/omnibackup/&#34;&gt;OmniBackup&lt;/a&gt;. At last, I&amp;rsquo;m able to confidently keep abreast of all the ever-growing data that I have to keep safe.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;So, what exactly is OmniBackup?&amp;rdquo; you may ask. &amp;ldquo;A fair question,&amp;rdquo; I would say. OmniBackup is a &lt;a href=&#34;http://opensource.org/licenses/MIT&#34;&gt;MIT licensed&lt;/a&gt; &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;Bash&lt;/a&gt; script which delivers the following set of features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuration and customization of backup mechanism through &lt;a href=&#34;http://json.org/&#34;&gt;JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&#34;http://www.openldap.org/&#34;&gt;OpenLDAP&lt;/a&gt; backups&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&#34;http://www.postgresql.org/&#34;&gt;PostgreSQL&lt;/a&gt; backups as a whole or per database&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&#34;https://mariadb.org/&#34;&gt;MariaDB&lt;/a&gt; and &lt;a href=&#34;https://www.mysql.com/&#34;&gt;MySQL&lt;/a&gt; backups as a whole or per database&lt;/li&gt;
&lt;li&gt;Support for filesystem backups with optional ability to follow symbolic links&lt;/li&gt;
&lt;li&gt;Support for pluggable customized scripts to extend OmniBackup functionality beyond its original design which allows support for many different backup scenarios that has not been built into OmniBackup, yet&lt;/li&gt;
&lt;li&gt;Backup file name tagging which allows including date or host name in the archive name&lt;/li&gt;
&lt;li&gt;Online backup without a prerequisite to suspend any service&lt;/li&gt;
&lt;li&gt;Support for customized backup tasks priority order&lt;/li&gt;
&lt;li&gt;Support for multiple backup servers&lt;/li&gt;
&lt;li&gt;Ability to always keep a copy of backups offline&lt;/li&gt;
&lt;li&gt;Ability to keep a copy of backups offline if no backup server is available, or in case of an error such as a file transfer error&lt;/li&gt;
&lt;li&gt;Secure file transfer through SSH / SCP protocol&lt;/li&gt;
&lt;li&gt;LZMA2, &lt;a href=&#34;http://www.gzip.org/&#34;&gt;gzip&lt;/a&gt; and &lt;a href=&#34;http://www.bzip.org/&#34;&gt;bzip2&lt;/a&gt; compression algorithms along with different compression levels to maintain a balance between speed and file size&lt;/li&gt;
&lt;li&gt;Ability to preserve permissions inside backup files&lt;/li&gt;
&lt;li&gt;Support for symmetric cryptography algorithms AES-128, AES-192 and AES-256 (a.k.a Rijndael or Advanced Encryption Standard)&lt;/li&gt;
&lt;li&gt;Random passphrase generation for encrypted backups with variable length and patterns or a unique passphrase for all backups&lt;/li&gt;
&lt;li&gt;Support for RSA signatures to verify the backup origin and integrity&lt;/li&gt;
&lt;li&gt;Passphrase encryption using RSA public keys for individual backup servers&lt;/li&gt;
&lt;li&gt;Backup integrity verification by offering hash algorithms such as MD4, MD5, MDC-2, RIPEMD160, SHA, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 and WHIRLPOOL&lt;/li&gt;
&lt;li&gt;Optional Base64 encoding&lt;/li&gt;
&lt;li&gt;System logs and a standalone log file including all details&lt;/li&gt;
&lt;li&gt;Reporting through email to a list of recipients with ability to include passphrases&lt;/li&gt;
&lt;li&gt;Customized mail subject for successful and failed backup operations&lt;/li&gt;
&lt;li&gt;Customized support message for reports&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://crontab.org/&#34;&gt;Crontab&lt;/a&gt; integration&lt;/li&gt;
&lt;li&gt;Custom temporary / working directory&lt;/li&gt;
&lt;li&gt;Automatic and smart clean-up ability&lt;/li&gt;
&lt;li&gt;One instance only policy which avoids running multiple instances by mistake at the same time, therefore avoids system slow-down&lt;/li&gt;
&lt;li&gt;An example configuration file in JSON format to get you up and running&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is also a list of planned features and TODOs which did not make it into &lt;code&gt;0.1.0&lt;/code&gt; release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Restore script&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.gnupg.org/&#34;&gt;GnuPG&lt;/a&gt; integration&lt;/li&gt;
&lt;li&gt;SFTP and FTP support&lt;/li&gt;
&lt;li&gt;Refactoring and code clean-up&lt;/li&gt;
&lt;li&gt;Any potential bug fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Disclaimer:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;Please be wary of the fact that this script has approximately &lt;code&gt;3.5 K&lt;/code&gt; lines of Bash code and devoured hell of a time from me to write and debug. You should also consider that this is my first heavy Bash experiment and I may not write quality code in the language since I&amp;rsquo;m a newcomer to Bash. I do not claim that OmniBackup is production ready, that&amp;rsquo;s why I did version the first release at &lt;code&gt;0.1.0&lt;/code&gt;. Also keep in mind that OmniBackup heavily relies on 3rd-party software which increases the chance for fatal bugs, therefore losing data. So, I provide OmniBackup without any warranties, guarantees or conditions, of any kind and I accept no liability or responsibility for any misuse or damage. Please use it at your own risk and remember you are solely responsible for any resulting damage or data loss.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Credits:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;Many thanks go to my fellow and long-time friend, &lt;strong&gt;Morteza Sabetraftar&lt;/strong&gt; for his help and ideas without whom OmniBackup lacked features or quality. Another kudos goes to my brother &lt;strong&gt;Amir&lt;/strong&gt; by releasing me from shopping, cooking and house-cleaning without even mentioning it, an invaluable and priceless assistance that encouraged me even more to use my best endeavours to get this task done.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Please, feel free to clone and modify it as you wish. Pull requests for new features, improvements or bug fixes are also very welcome.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/NuLL3rr0r/omnibackup/&#34;&gt;OmniBackup on GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/NuLL3rr0r/omnibackup/&#34;&gt;OmniBackup on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest of this post serves as a comprehensive guide on how to setup OmniBackup in order to backup and restore all your critical data in a production environment.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>FreeBSD: Block Brute-force Attacks Using Sshguard and IPFW Firewall</title>
      <link>https://www.babaei.net/blog/freebsd-block-brute-force-attacks-using-sshguard-and-ipfw-firewall/</link>
      <pubDate>Thu, 30 Jul 2015 19:56:00 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/freebsd-block-brute-force-attacks-using-sshguard-and-ipfw-firewall/</guid>
      <description>&lt;p&gt;There is an old saying that the only safe computer is one that&amp;rsquo;s disconnected from the network, turned off, and locked in an underground bunker—and even then you can&amp;rsquo;t be sure!&lt;/p&gt;
&lt;p&gt;Since most of us can&amp;rsquo;t afford to keep our servers in an underground bunker, the least little thing that could have been done in order to keep their threat exposure at rock-bottom is protecting them by running a combination of a firewall and an intrusion prevention system or IPS (a.k.a intrusion detection and prevention systems or IDPS). Surely, that alone proved insufficient and other security measures and best practices should also be considered.&lt;/p&gt;
&lt;p&gt;This blog post covers setting up a basic secure and stateful &lt;a href=&#34;https://www.freebsd.org/doc/handbook/firewalls-ipfw.html&#34;&gt;IPFW&lt;/a&gt; firewall on &lt;a href=&#34;https://www.freebsd.org/&#34;&gt;FreeBSD&lt;/a&gt; along with &lt;a href=&#34;http://www.sshguard.net/&#34;&gt;Sshguard&lt;/a&gt; by &lt;a href=&#34;https://www.ixsystems.com/&#34;&gt;iXsystems Inc&lt;/a&gt; as intrusion prevention system.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>The Proper Way of Adding a Cron Job</title>
      <link>https://www.babaei.net/blog/the-proper-way-of-adding-a-cron-job/</link>
      <pubDate>Thu, 11 Jun 2015 16:37:18 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/the-proper-way-of-adding-a-cron-job/</guid>
      <description>&lt;p&gt;Until not so long ago, to add my own cron jobs I always had the habit of modifying &lt;code&gt;/etc/crontab&lt;/code&gt; on my &lt;a href=&#34;https://www.freebsd.org/&#34;&gt;FreeBSD&lt;/a&gt; system &lt;a href=&#34;https://www.freebsd.org/doc/handbook/configtuning-cron.html&#34;&gt;which turned out to be wrong&lt;/a&gt;. In simple words, there are two types of crontab files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System crontab&lt;/strong&gt; which should not be altered due to the troubles it cause during FreeBSD upgrades&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User crontab&lt;/strong&gt; which has one less column than the system crontab file&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Book Review: Application Development with Qt Creator - Second Edition</title>
      <link>https://www.babaei.net/blog/book-review-application-development-with-qt-creator-second-edition/</link>
      <pubDate>Mon, 29 Dec 2014 04:27:20 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/book-review-application-development-with-qt-creator-second-edition/</guid>
      <description>&lt;p&gt;Almost three weeks ago I received a review request from one of the &lt;em&gt;&lt;a href=&#34;http://www.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt;&lt;/em&gt; staffs to review &lt;em&gt;&lt;a href=&#34;http://www.packtpub.com/application-development/application-development-qt-creator-2nd-edition&#34;&gt;Application Development with Qt Creator, 2nd Edition&lt;/a&gt;&lt;/em&gt; written by &lt;em&gt;&lt;a href=&#34;http://www.lothlorien.com/dove/&#34;&gt;Ray Rischpater&lt;/a&gt;&lt;/em&gt; which has been recently published by Packt Publishing. Since I&amp;rsquo;ve been developing cross platform &lt;a href=&#34;http://qt-project.org/&#34;&gt;Qt&lt;/a&gt; (cute, often mispronounced as Q-T cue-tee) applications from Qt 4 era back in 2008 &amp;ndash; when Qt Creator was not around yet and the project was running by Trolltech at the time &amp;ndash; and a handful of Qt Quick mobile applications over the past two years, I consider myself eligible enough to write a brief review on it. So, I was provided with a review copy and after reading it cover to cover, my thoughts on the book are as follows.&lt;/p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/book-review-application-development-with-qt-creator-second-edition/book-review-application-development-with-qt-creator-second-edition.webp&#34; alt=&#34;Application Development with Qt Creator, 2nd Edition&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/book-review-application-development-with-qt-creator-second-edition/book-review-application-development-with-qt-creator-second-edition.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Application Development with Qt Creator, 2nd Edition&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Getting real IP addresses using Nginx and CloudFlare</title>
      <link>https://www.babaei.net/blog/getting-real-ip-addresses-using-nginx-and-cloudflare/</link>
      <pubDate>Sat, 09 Mar 2013 01:35:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/getting-real-ip-addresses-using-nginx-and-cloudflare/</guid>
      <description>&lt;p&gt;&lt;strong&gt;[Update]&lt;/strong&gt;: Thanks to &lt;a href=&#34;https://github.com/digitaltoast&#34;&gt;digitaltoast&lt;/a&gt; for informing me about the missing &lt;s&gt;real_ip_header CF-Connecting-IP;&lt;/s&gt; from the script and providing &lt;a href=&#34;https://github.com/NuLL3rr0r/babaei.net/pull/1&#34;&gt;a patch&lt;/a&gt; for it.&lt;/p&gt;
&lt;p&gt;OK, I suppose you know what &lt;a href=&#34;http://www.cloudflare.com/&#34;&gt;CloudFlare&lt;/a&gt; is, and are familiar with &lt;a href=&#34;http://nginx.org/&#34;&gt;Nginx&lt;/a&gt; configuration process, before we proceed any further. Just in case you don&amp;rsquo;t know, &lt;strong&gt;CloudFlare&lt;/strong&gt; offers free and commercial, cloud-based services to help secure and accelerate websites. The thing is, I&amp;rsquo;m really satisfied with the services they offer except a repellent issue about logging the real IP address of your website&amp;rsquo;s visitors. Since &lt;strong&gt;CloudFlare&lt;/strong&gt; acts as a reverse proxy, all connections come from &lt;strong&gt;CloudFlare&lt;/strong&gt;&amp;rsquo;s IP addresses, not the real visitors anymore. Anyway, using &lt;strong&gt;Nginx&lt;/strong&gt; there&amp;rsquo;s a simple workaround for this issue, which I&amp;rsquo;ll describe in the rest of this post.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Colors Talk: A Colorful Terminal / Console</title>
      <link>https://www.babaei.net/blog/colors-talk-a-colorful-terminal-console/</link>
      <pubDate>Sun, 03 Mar 2013 05:10:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/colors-talk-a-colorful-terminal-console/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve ever used a &lt;strong&gt;GNU&lt;/strong&gt; &lt;a href=&#34;http://www.gentoo.org/&#34;&gt;Gentoo&lt;/a&gt; or &lt;a href=&#34;http://www.funtoo.org/wiki/Welcome&#34;&gt;Funtoo&lt;/a&gt; &lt;strong&gt;Linux&lt;/strong&gt; variant, or a live version of any of them, you may have noticed their eye-catching colorful terminal or console. Whether you&amp;rsquo;re on a virtual console or one of &lt;strong&gt;KDE&lt;/strong&gt;, &lt;strong&gt;GNOME&lt;/strong&gt;, &lt;strong&gt;XFCE&lt;/strong&gt;, &lt;strong&gt;LXDE&lt;/strong&gt; terminal apps.&lt;/p&gt;

&lt;link rel=&#34;stylesheet&#34; href=&#34;https://www.babaei.net/css/hugo-easy-gallery.css&#34; /&gt;
&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/colors-talk-a-colorful-terminal-console/colors-talk-a-colorful-terminal-console-1.webp&#34; alt=&#34;A Colorful Xfce4 Terminal on FreeBSD (Bash)&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/colors-talk-a-colorful-terminal-console/colors-talk-a-colorful-terminal-console-1.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;A Colorful Xfce4 Terminal on FreeBSD (Bash)&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;



&lt;div class=&#34;box&#34; &gt;
  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;
    &lt;div class=&#34;img&#34;&gt;
      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://www.babaei.net/blog/colors-talk-a-colorful-terminal-console/colors-talk-a-colorful-terminal-console-2.webp&#34; alt=&#34;The default Xfce4 Terminal on FreeBSD (sh csh)&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/colors-talk-a-colorful-terminal-console/colors-talk-a-colorful-terminal-console-2.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;The default Xfce4 Terminal on FreeBSD (sh csh)&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;When I&amp;rsquo;ve migrated from &lt;strong&gt;Funtoo&lt;/strong&gt; to &lt;a href=&#34;http://www.freebsd.org&#34;&gt;FreeBSD&lt;/a&gt;, the one thing that I&amp;rsquo;ve missed so badly was its colorful terminal. The nice thing about these colors is taht they always give you some valuable hints, e.g., currently you&amp;rsquo;re &lt;strong&gt;root&lt;/strong&gt; user or a regular user, the file is a symlink (Symbolic link), executable or just a regular file.&lt;/p&gt;
&lt;p&gt;Well, it&amp;rsquo;s pretty easy to have your own colorful terminal or console, once you&amp;rsquo;ve found out how &lt;strong&gt;Gentoo&lt;/strong&gt; and &lt;strong&gt;Funtoo&lt;/strong&gt; did that. Fortunately, it works on &lt;strong&gt;*BSD&lt;/strong&gt; and all other &lt;strong&gt;Linux&lt;/strong&gt; distros as well. So, stay with me and I&amp;rsquo;ll describe the process in the following.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>nano, Syntax Highlighting</title>
      <link>https://www.babaei.net/blog/nano-syntax-highlighting/</link>
      <pubDate>Sun, 17 Feb 2013 01:27:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/nano-syntax-highlighting/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.nano-editor.org/&#34;&gt;GNU nano&lt;/a&gt; is my favorite text editor while I&amp;rsquo;m on console. Although, it doesn&amp;rsquo;t offer syntax highlighting by default, it comes with a decent set of syntax highlighting files. Usually, these files are exist in &lt;strong&gt;/usr/local/share/nano&lt;/strong&gt; or &lt;strong&gt;/usr/share/nano&lt;/strong&gt;, depending on your distro&amp;rsquo;s preference. You can enable syntax highlighting for your prefered language(s) by including related file(s) with &lt;strong&gt;.nanorc&lt;/strong&gt; extension in your &lt;strong&gt;~/.nanorc&lt;/strong&gt; file.&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;~/.nanorc - FreeBSD&lt;/span&gt;
    
    
    
    
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;include &amp;#34;/usr/local/share/nano/asm.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/awk.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/c.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/cmake.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/css.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/debian.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/fortran.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/gentoo.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/groff.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/html.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/java.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/makefile.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/man.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/mgp.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/mutt.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/nanorc.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/objc.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/ocaml.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/patch.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/perl.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/php.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/pov.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/python.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/ruby.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/sh.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/tcl.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/tex.nanorc&amp;#34;
include &amp;#34;/usr/local/share/nano/xml.nanorc&amp;#34;&lt;/code&gt;&lt;/pre&gt;
    
    
    
&lt;/div&gt;

&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;~/.nanorc - Funtoo or Gentoo&lt;/span&gt;
    
    
    
    
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;include &amp;#34;/usr/share/nano/asm.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/awk.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/c.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/cmake.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/css.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/debian.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/fortran.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/gentoo.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/groff.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/html.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/java.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/makefile.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/man.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/mgp.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/mutt.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/nanorc.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/objc.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/ocaml.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/patch.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/perl.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/php.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/pov.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/python.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/ruby.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/sh.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/tcl.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/tex.nanorc&amp;#34;
include &amp;#34;/usr/share/nano/xml.nanorc&amp;#34;&lt;/code&gt;&lt;/pre&gt;
    
    
    
&lt;/div&gt;

&lt;p&gt;Note: If the file doesn&amp;rsquo;t exist, you should create it first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ touch ~/.nanorc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>nano, Do Not Wrap Text</title>
      <link>https://www.babaei.net/blog/nano-do-not-wrap-text/</link>
      <pubDate>Sun, 17 Feb 2013 01:13:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/nano-do-not-wrap-text/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.nano-editor.org/&#34;&gt;GNU nano&lt;/a&gt; is my favorite text editor while I&amp;rsquo;m on console. However, there&amp;rsquo;s one thing about nano which annoys me: &lt;em&gt;automatic text wrapping!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hopefully, there are two simple ways to overcome this. By using either &lt;strong&gt;-w&lt;/strong&gt; command-line argument, or &lt;strong&gt;set nowrap&lt;/strong&gt; configuration command within the file &lt;strong&gt;~/.nanorc&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; The temporary solution by using &lt;strong&gt;-w&lt;/strong&gt; command-line argument, which should be used each time you run nano:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ nano -w /path/to/file&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; The permanent solution by setting off automatic text wrapping using the configuration command &lt;strong&gt;set nowrap&lt;/strong&gt;, in the &lt;strong&gt;~/.nanorc&lt;/strong&gt; file:&lt;/p&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;~/.nanorc&lt;/span&gt;
    
    
    
    
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;set nowrap&lt;/code&gt;&lt;/pre&gt;
    
    
    
&lt;/div&gt;

&lt;p&gt;Note: If the file doesn&amp;rsquo;t exist, you should create it first:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ touch ~/.nanorc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Write Your Own Cross-Platform Cryptographic Library</title>
      <link>https://www.babaei.net/blog/write-your-own-cross-platform-cryptographic-library/</link>
      <pubDate>Fri, 15 Feb 2013 08:11:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/write-your-own-cross-platform-cryptographic-library/</guid>
      <description>&lt;p&gt;Previously I&amp;rsquo;ve described &lt;a href=&#34;https://www.babaei.net/blog/how-to-build-cpp-cryptographic-library-cryptopp/&#34;&gt;the process of building Crypto++ on both FreeBSD and Windows using the GCC, MinGW and VC++ compilers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, we want to develop our own cross-platform cryptographic wrapper library around Crypto++. I&amp;rsquo;ve already uploaded the full source code to &lt;a href=&#34;http://github.com&#34;&gt;GitHub&lt;/a&gt;. You can find the link to the code on GitHub at the end of this article.&lt;/p&gt;
&lt;p&gt;Before you proceed, you have to build the Crypto++ library as I mentioned earlier &lt;a href=&#34;https://www.babaei.net/blog/how-to-build-cpp-cryptographic-library-cryptopp/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>How to Build C&#43;&#43; Cryptographic Library, Crypto&#43;&#43;</title>
      <link>https://www.babaei.net/blog/how-to-build-cpp-cryptographic-library-cryptopp/</link>
      <pubDate>Fri, 15 Feb 2013 03:50:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/how-to-build-cpp-cryptographic-library-cryptopp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.cryptopp.com/&#34;&gt;Crypto++&lt;/a&gt; is an awesome free and open source C++ class library of cryptographic algorithms and schemes which fully supports 32-bit and 64-bit architectures for many major operating systems, including FreeBSD, Linux, Solaris, Windows, Mac OS X and iOS. Currently, Crypto++ officially supports the following compilers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MSVC 6.0 - 2010&lt;/li&gt;
&lt;li&gt;GCC 3.3 - 4.5&lt;/li&gt;
&lt;li&gt;C++Builder 2010&lt;/li&gt;
&lt;li&gt;Intel C++ Compiler 9 - 11.1&lt;/li&gt;
&lt;li&gt;Sun Studio 12u1, Express 11/08, Express 06/10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The latest version at the time of this writing is 5.6.1.&lt;/p&gt;
&lt;p&gt;In spite of the power that Crypto++ offers, building and using it can be a little bit tricky. In the following we will describe the process of building Crypto++ on both FreeBSD and Windows using the GCC, MinGW and VC++ compilers.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
