<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mamadou Babaei</title>
    <link>https://www.babaei.net/</link>
    <description>Recent content on Mamadou Babaei</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 17 Nov 2025 23:44:00 +0100</lastBuildDate><atom:link href="https://www.babaei.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Unreal Engine 5.7 Android Packaging &amp; APK Build Tutorial | Meta Quest &amp; HTC VIVE Standalone</title>
      <link>https://www.babaei.net/blog/unreal-engine-android-packaging-apk-build-tutorial-meta-quest-htc-vive-standalone/</link>
      <pubDate>Mon, 17 Nov 2025 23:44:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/unreal-engine-android-packaging-apk-build-tutorial-meta-quest-htc-vive-standalone/</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/unreal-engine-android-packaging-apk-build-tutorial-meta-quest-htc-vive-standalone/unreal-engine-android-packaging-apk-build-tutorial-meta-quest-htc-vive-standalone.webp&#34; alt=&#34;Unreal Engine 5.7 Android Packaging &amp;amp; APK Build Tutorial | Meta Quest &amp;amp; HTC VIVE Standalone&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/unreal-engine-android-packaging-apk-build-tutorial-meta-quest-htc-vive-standalone/unreal-engine-android-packaging-apk-build-tutorial-meta-quest-htc-vive-standalone.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Unreal Engine 5.7 Android Packaging &amp;amp; APK Build Tutorial | Meta Quest &amp;amp; HTC VIVE Standalone&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Let&amp;rsquo;s cut the noise. You want quick, clean, and painless Unreal Engine APK builds and packaging? You&amp;rsquo;re in the right place.&lt;/p&gt;
&lt;p&gt;A while back, I released two videos: one on &lt;a href=&#34;https://www.babaei.net/blog/deploy-unreal-engine-projects-android-meta-quest-standalone-mode/&#34;&gt;deploying Unreal Engine projects to Android and Meta Quest&lt;/a&gt;, and another on &lt;a href=&#34;https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive/&#34;&gt;enabling proper hand-tracking using the Meta XR Plugin and HTC VIVE OpenXR plugins&lt;/a&gt;. I also tackled a frustrating issue on HTC VIVE devices, where APKs were launching as 2D apps instead of immersive VR experiences.&lt;/p&gt;
&lt;p&gt;That first video blew up; it became one of my best-performing uploads to this date, with tons of positive feedback. But one thing stood out in the comments: Unreal developers everywhere are struggling to set up the Android development environment and package APKs correctly.&lt;/p&gt;
&lt;p&gt;So, back by demand, and with something even better, welcome to the Ultimate Guide for deploying Unreal Engine projects to Android standalone-mode.&lt;/p&gt;
&lt;p&gt;This video combines everything from the previous tutorials; refined, updated, and streamlined. And to make things even easier, I&amp;rsquo;ve just open-sourced a brand-new one-click installer that sets up your entire Android development environment for Unreal Engine automagically. It downloads, installs, and configures Android Studio, SDK, NDK, and JDK, so you don&amp;rsquo;t have to lift even a finger.&lt;/p&gt;
&lt;p&gt;Whether you&amp;rsquo;re building for Meta Quest or HTC VIVE, this guide takes you from zero to packaged APK, with full VR support, working hand-tracking, and seamless integration of both Meta XR and HTC VIVE OpenXR plugins.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s dive in.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Optimizing Unreal Engine VR Projects for Higher Framerates (Meta Quest, HTC VIVE, FFR, ETFR, NVIDIA DLSS, AMD FSR, and Intel XeSS Tips Included!)</title>
      <link>https://www.babaei.net/blog/optimizing-unreal-engine-vr-projects-higher-framerate/</link>
      <pubDate>Mon, 09 Jun 2025 14:18:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/optimizing-unreal-engine-vr-projects-higher-framerate/</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/optimizing-unreal-engine-vr-projects-higher-framerate/optimizing-unreal-engine-vr-projects-higher-framerate.webp&#34; alt=&#34;Optimizing Unreal Engine VR Projects for Higher Framerates (Meta Quest, HTC VIVE, FFR, ETFR, NVIDIA DLSS, AMD FSR, and Intel XeSS Tips Included!)&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/optimizing-unreal-engine-vr-projects-higher-framerate/optimizing-unreal-engine-vr-projects-higher-framerate.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Optimizing Unreal Engine VR Projects for Higher Framerates (Meta Quest, HTC VIVE, FFR, ETFR, NVIDIA DLSS, AMD FSR, and Intel XeSS Tips Included!)&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Ever felt like your VR project is running so slow it could be a snail&amp;rsquo;s day job? 🐌 Or maybe your framerate is auditioning for a role in The Matrix—dodging bullets, but also every performance standard? 😅&lt;/p&gt;
&lt;p&gt;Well, today, we&amp;rsquo;re fixing that! I’ll show you how to take your Unreal Engine VR game from ‘meh’ to chef’s kiss smooth. Although enhancing the performance and framerate of Unreal Engine VR applications, whether running in standalone mode (Android mobile) or PCVR mode (PC streaming), can feel daunting, especially when dealing with varying project requirements, this guide breaks down practical and easy-to-implement strategies that deliver noticeable results with minimal hassle, helping you achieve smoother gameplay.&lt;/p&gt;
&lt;p&gt;So, let’s get started before that snail finishes its coffee break!&lt;/p&gt;</description>
    </item>
    
    <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>Rust Devs Think We’re Hopeless; Let’s Prove Them Wrong (with C&#43;&#43; Memory Leaks)!</title>
      <link>https://www.babaei.net/blog/rust-devs-think-we-are-hopeless-lets-prove-them-wrong-with-cpp-memory-leaks/</link>
      <pubDate>Sat, 10 May 2025 15:26:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/rust-devs-think-we-are-hopeless-lets-prove-them-wrong-with-cpp-memory-leaks/</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/rust-devs-think-we-are-hopeless-lets-prove-them-wrong-with-cpp-memory-leaks/rust-devs-think-we-are-hopeless-lets-prove-them-wrong-with-cpp-memory-leaks.webp&#34; alt=&#34;Rust Devs Think We’re Hopeless; Let’s Prove Them Wrong (with C&amp;#43;&amp;#43; Memory Leaks)!&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/rust-devs-think-we-are-hopeless-lets-prove-them-wrong-with-cpp-memory-leaks/rust-devs-think-we-are-hopeless-lets-prove-them-wrong-with-cpp-memory-leaks.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Rust Devs Think We’re Hopeless; Let’s Prove Them Wrong (with C&amp;#43;&amp;#43; Memory Leaks)!&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;When Rust developers think of us C++ folks, they picture a cursed bloodline — generational trauma passed down from &lt;code&gt;malloc&lt;/code&gt; to &lt;code&gt;free&lt;/code&gt;. To them, every line of C++ we write is like playing Russian Roulette — except all six chambers are loaded with undefined behavior.&lt;/p&gt;
&lt;p&gt;They look at us like we’re hopeless. Like we’re one dangling pointer away from therapy. But you know what? We don’t need a compiler nanny. No borrow checker. No lifetimes. No ownership models. No black magic. Not even Valgrind is required. Just raw pointers, raw determination, and a bit of questionable sanity.&lt;/p&gt;
&lt;p&gt;So in this video, I’m going to show you how to hunt down memory leaks like you were born with a pointer in one hand and a debugger in the other.&lt;/p&gt;
&lt;p&gt;If that sounds unreasonably dangerous — and incredibly fun — smash that subscribe button, and let’s dive into the deep end of the heap.&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>Unreal Engine OpenXR Hand-Tracking on Android with Meta XR (Quest 3S/3/Pro/2) and HTC VIVE OpenXR (Focus Vision/XR Elite/Focus 3) Plugins</title>
      <link>https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive/</link>
      <pubDate>Wed, 15 Jan 2025 12:12:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive/</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/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive.webp&#34; alt=&#34;Unreal Engine OpenXR Hand-Tracking on Android with Meta XR (Quest 3S/3/Pro/2) and HTC VIVE OpenXR (Focus Vision/XR Elite/Focus 3) Plugins&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive/unreal-engine-openxr-hand-tracking-android-meta-xr-htc-vive.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Unreal Engine OpenXR Hand-Tracking on Android with Meta XR (Quest 3S/Pro/3/2) and HTC VIVE OpenXR (Focus Vision/XR Elite/Focus 3) Plugins&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Hey everyone! Welcome back to the channel! In the last tutorial, we tackled deploying Unreal Engine projects to Android and Meta Quest in standalone mode—because who doesn’t love the thrill of watching their code actually work on a headset? But if you caught that episode, you’ll remember I dropped a little plot twist: Unreal Engine’s built-in OpenXR plugin&amp;hellip; yeah, it’s like that friend who shows up at your party and forgets to bring their own hand-tracking support for Android. Awkward, right?&lt;/p&gt;
&lt;p&gt;Well, today, we’re fixing that. We’re making sure the hand-tracking projects we developed together earlier in this series, have non-broken, fully functional hand-tracking and play nice on your Meta Quest and HTC Vive HMDs in standalone mode. Whether you’re team Meta or team HTC, I’ve got you covered.&lt;/p&gt;
&lt;p&gt;Let’s jump right in and get the hand-tracking working exactly the way it’s supposed to!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Deploy Unreal Engine Projects to Android and Meta Quest 3S/3/Pro/2 in Standalone Mode</title>
      <link>https://www.babaei.net/blog/deploy-unreal-engine-projects-android-meta-quest-standalone-mode/</link>
      <pubDate>Fri, 20 Dec 2024 17:28:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/deploy-unreal-engine-projects-android-meta-quest-standalone-mode/</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/deploy-unreal-engine-projects-android-meta-quest-standalone-mode/deploy-unreal-engine-projects-android-meta-quest-standalone-mode.webp&#34; alt=&#34;Deploy Unreal Engine Projects to Android and Meta Quest 3S/3/Pro/2 in Standalone Mode&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/deploy-unreal-engine-projects-android-meta-quest-standalone-mode/deploy-unreal-engine-projects-android-meta-quest-standalone-mode.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Deploy Unreal Engine Projects to Android and Meta Quest 3S/3/Pro/2 in Standalone Mode&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;All right… so… you might be wondering—where have I been? Did I fall into a virtual void or some digital black hole? Did I get sucked into a never-ending loading screen? Did Unreal Engine finally crash me for good? Well, almost.&lt;/p&gt;
&lt;p&gt;But I’m back! Back from the digital abyss. And let me tell you, I was this close to naming this video: ‘How to Deploy Your Soul to Standalone Mode’… because burnout is real, my friends.&lt;/p&gt;
&lt;p&gt;Jokes aside, YOU—yes, you awesome people—kept me going. I read your comments. I saw your feedback. And honestly, some of those messages… they were half encouragement, half passive-aggressive ‘Bro, where’s the next tutorial?!’ You all have zero chills. But… I like that. That’s what got me here today.&lt;/p&gt;
&lt;p&gt;So, by popular demand and an ungodly amount of coffee, here we are. Today, we will deploy your Unreal Engine projects to Meta Quest. We’re talking Android standalone mode, baby!&lt;/p&gt;
&lt;p&gt;And if you’ve been struggling with this process, don’t worry. I’ve suffered so you don’t have to. You’re welcome!&lt;/p&gt;
&lt;p&gt;But, before we dive into the screen-sharing and the real stuff, you know the drill. Smash that like button, subscribe, and drop a comment. If you don’t, I’ll deploy you into an infinite loop of beginner VR setup tutorials. Trust me, you don’t want that. So, it&amp;rsquo;s your call!&lt;/p&gt;
&lt;p&gt;All right! Let’s get into it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Procedural Virtual Hand Mesh Animation Using OpenXR Hand-Tracking in Unreal Engine</title>
      <link>https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-procedural-virtual-hand-mesh-animation/</link>
      <pubDate>Sat, 07 Dec 2024 18:31:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-procedural-virtual-hand-mesh-animation/</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/unreal-engine-openxr-hand-tracking-procedural-virtual-hand-mesh-animation/unreal-engine-openxr-hand-tracking-procedural-virtual-hand-mesh-animation.webp&#34; alt=&#34;Procedural Virtual Hand Mesh Animation Using OpenXR Hand-Tracking in Unreal Engine&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/unreal-engine-openxr-hand-tracking-procedural-virtual-hand-mesh-animation/unreal-engine-openxr-hand-tracking-procedural-virtual-hand-mesh-animation.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Procedural Virtual Hand Mesh Animation Using OpenXR Hand-Tracking in Unreal Engine&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Building on the &lt;a href=&#34;https://www.babaei.net/blog/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine/&#34;&gt;Introduction to Virtual Reality, OpenXR Hand-Tracking, and Gesture Recognition in Unreal Engine&lt;/a&gt; tutorial, this slightly more advanced tutorial will dive deeper into the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transitioning seamlessly between motion controller and hand-tracking modes in Unreal Engine.&lt;/li&gt;
&lt;li&gt;Adding custom debugging gizmos to improve development and testing workflows.&lt;/li&gt;
&lt;li&gt;Visualizing debug virtual hands by incorporating the custom gizmos.&lt;/li&gt;
&lt;li&gt;Animating virtual hand meshes with OpenXR hand-tracking data, moving beyond basic joint representation with cubes.&lt;/li&gt;
&lt;li&gt;Re-using and adapting the gesture recognition code from the introductory tutorial to integrate with the new animated virtual hand meshes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This guide will help you take your VR projects to the next level with polished and practical implementations.&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>Introduction to Virtual Reality, OpenXR Hand-Tracking, and Gesture Recognition in Unreal Engine</title>
      <link>https://www.babaei.net/blog/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine/</link>
      <pubDate>Sat, 09 Nov 2024 01:10:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine/</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/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine.webp&#34; alt=&#34;Introduction to Virtual Reality, OpenXR Hand-Tracking, and Gesture Recognition in Unreal Engine&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine/virtual-reality-openxr-hand-tracking-gesture-recognition-detection-unreal-engine.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Introduction to Virtual Reality, OpenXR Hand-Tracking, and Gesture Recognition in Unreal Engine&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Here&amp;rsquo;s a lesser-known fact about me. Once upon a time, when it was just me and the dinosaurs&amp;hellip; Okay, maybe not that far back, but long before VR headsets, the Metaverse, and the social media craze, I used to teach people things for 8 years! I loved it so much that, honestly, I could talk for hours (don&amp;rsquo;t worry, I won&amp;rsquo;t in this video)!&lt;/p&gt;
&lt;p&gt;Anyway, enough of my rambling! Recently, I rediscovered that passion for teaching, and I&amp;rsquo;m thrilled to kick off a VR tutorial series in Unreal Engine. That&amp;rsquo;s why, as the introductory step into this series, we&amp;rsquo;re diving hands-first into the fascinating world of virtual reality.&lt;/p&gt;
&lt;p&gt;But, before we jump in, make sure to hit that subscribe button so you don&amp;rsquo;t miss any of my VR adventures.&lt;/p&gt;
&lt;p&gt;Ready? Let&amp;rsquo;s bring those virtual hands to life!&lt;/p&gt;
&lt;p&gt;Find the link to the video tutorial and the project repository down below.&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>The long awaited FreeBSD www/wt and www/wt3 ports updates</title>
      <link>https://www.babaei.net/blog/freebsd-ports-update-www-wt-410-wt3-340/</link>
      <pubDate>Mon, 19 Aug 2019 01:49:00 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/freebsd-ports-update-www-wt-410-wt3-340/</guid>
      <description>&lt;p&gt;For those who don&amp;rsquo;t know, I maintain &lt;a href=&#34;https://www.freebsd.org/cgi/ports.cgi?query=info%40babaei.net&amp;amp;stype=maintainer&amp;amp;sektion=all&#34;&gt;various official FreeBSD ports&lt;/a&gt; and for almost 18 months &lt;a href=&#34;https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=226160&#34;&gt;my submitted updates&lt;/a&gt; to &lt;a href=&#34;https://www.webtoolkit.eu/wt&#34;&gt;www/wt&lt;/a&gt; has been stuck due to lack of a review. Hopefully, tonight it has been committed to the official &lt;a href=&#34;https://www.freebsd.org/ports/&#34;&gt;FreeBSD Ports&lt;/a&gt; tree and has been divided into two ports:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://svnweb.freebsd.org/ports/head/www/wt/&#34;&gt;www/wt&lt;/a&gt; for following the &lt;code&gt;4.x&lt;/code&gt; releases&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://svnweb.freebsd.org/ports/head/www/wt3/&#34;&gt;www/wt3&lt;/a&gt; for following the &lt;code&gt;3.x&lt;/code&gt; releases&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Although &lt;a href=&#34;https://web.archive.org/web/20190819001517/https://www.webtoolkit.eu/wt/news/2017/09/19/wt_4_0_0_is_here_&#34;&gt;Wt Webtoolkit 4.x&lt;/a&gt; is a significant update which brings in more modern C++ and performance improvements (read more about the changes between releases &lt;a href=&#34;https://web.archive.org/web/20190819001524/https://www.webtoolkit.eu/wt/news/all&#34;&gt;on their archive&lt;/a&gt;), I haven&amp;rsquo;t migrated any project to the &lt;code&gt;4.x&lt;/code&gt; release yet. I guess the &lt;code&gt;3.x&lt;/code&gt; releases will live on for the time being and any project using them should be fine for some time.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Keep Crashing Daemons Running on FreeBSD</title>
      <link>https://www.babaei.net/blog/keep-crashing-daemons-running-on-freebsd/</link>
      <pubDate>Thu, 09 May 2019 19:27:37 +0200</pubDate>
      
      <guid>https://www.babaei.net/blog/keep-crashing-daemons-running-on-freebsd/</guid>
      <description>&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 1 [2019/05/11]&lt;/strong&gt;: &lt;em&gt;Thanks to &lt;a href=&#34;https://www.reddit.com/user/mirrorbox&#34;&gt;@mirrorbox&lt;/a&gt;&amp;rsquo;s suggestion, I refactored the script to use &lt;code&gt;service status&lt;/code&gt; instead of &lt;code&gt;ps aux | grep&lt;/code&gt; which makes the script even more simple. As a result, the syntax has changed. Since I keep the article untouched, for the updated code visit either the &lt;a href=&#34;https://github.com/NuLL3rr0r/freebsd-daemon-keeper&#34;&gt;GitHub&lt;/a&gt; or &lt;a href=&#34;https://gitlab.com/NuLL3rr0r/freebsd-daemon-keeper&#34;&gt;GitLab&lt;/a&gt; repositories. The new syntax is as follows:&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:#75715e&#34;&gt;# Syntax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ /path/to/daemon-keeper.sh
&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;Correct usage:
&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;    daemon-keeper.sh -d &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;daemon&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; -e &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;extra daemon to &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;re&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;start&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;-e &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;another extra daemon to &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;re&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;start&lt;span style=&#34;color:#f92672&#34;&gt;}]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;... even more -e and extra daemons to &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;re&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;start&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Example&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ /path/to/daemon-keeper.sh -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clamav-clamd&amp;#34;&lt;/span&gt; -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dovecot&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;&lt;span style=&#34;color:#75715e&#34;&gt;# Crontab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo -u root -g wheel crontab -l
&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;# At every minute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*   *   *   *   *   /usr/local/cron-scripts/daemon-keeper.sh -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;clamav-clamd&amp;#34;&lt;/span&gt; -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dovecot&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;UPDATE 2 [2019/05/11]&lt;/strong&gt;: &lt;em&gt;Another thanks to &lt;a href=&#34;https://www.reddit.com/user/mirrorbox&#34;&gt;@mirrorbox&lt;/a&gt; for mentioning &lt;code&gt;sysutils/daemontools&lt;/code&gt; which seems a proven solution for restarting a crashing daemon. It makes this hack redundant.&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Daemontools is a small set of /very/ useful utilities, from Dan
Bernstein.  They are mainly used for controlling processes, and
maintaining logfiles.

WWW: http://cr.yp.to/daemontools.html
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;UPDATE 3 [2019/05/11]&lt;/strong&gt;: &lt;em&gt;Thanks to &lt;a href=&#34;https://www.reddit.com/user/dlangille&#34;&gt;@dlangille&lt;/a&gt; for mentioning &lt;code&gt;sysutils/py-supervisor&lt;/code&gt;, which seems to be a viable alternative to &lt;code&gt;sysutils/daemontools&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Supervisor is a client/server system that allows its users
to monitor and control a number of processes on UNIX-like
operating systems.

It shares some of the same goals of programs like launchd,
daemontools, and runit. Unlike some of these programs, it is
not meant to be run as a substitute for init as &amp;#34;process id 1&amp;#34;.
Instead it is meant to be used to control processes related to
a project or a customer, and is meant to start like any
other program at boot time.

WWW: http://supervisord.org/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;UPDATE 4 [2019/05/13]&lt;/strong&gt;: &lt;em&gt;Thanks to &lt;a href=&#34;https://www.reddit.com/user/olevole&#34;&gt;@olevole&lt;/a&gt; for mentioning &lt;code&gt;sysutils/fsc&lt;/code&gt;. It is minimalistic, dependency free and designed for FreeBSD:&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The FreeBSD Services Control software provides service
monitoring, restarting, and event logging for FreeBSD
servers.  The core functionality is a daemon (fscd)
which is interfaced with using fscadm.  See manual pages
for more information.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;UPDATE 5 [2019/05/13]&lt;/strong&gt;: &lt;em&gt;Thanks to &lt;a href=&#34;https://www.reddit.com/user/jcigar&#34;&gt;@jcigar&lt;/a&gt; for bringing &lt;a href=&#34;https://www.freebsd.org/cgi/man.cgi?query=daemon&amp;amp;sektion=8&#34;&gt;daemon(8)&lt;/a&gt; to my attention, which is available in the base system and it seems perfectly capable of doing what I was going to achieve in my script and more.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Amidst all the chaos in the current stage of my life, I don&amp;rsquo;t know exactly what got into me that I thought it was a good idea to perform a major upgrade on a production FreeBSD server from &lt;code&gt;11.2-RELENG&lt;/code&gt; to &lt;code&gt;12.0-RELENG&lt;/code&gt;, when I even did not have enough time to go through &lt;code&gt;/usr/src/UPDATING&lt;/code&gt; thoroughly or consult &lt;a href=&#34;https://www.freebsd.org/releases/12.0R/relnotes.html&#34;&gt;the Release Notes&lt;/a&gt; or &lt;a href=&#34;https://www.freebsd.org/releases/12.0R/errata.html&#34;&gt;the Errata&lt;/a&gt; properly; let alone &lt;a href=&#34;https://forums.freebsd.org/threads/mailserver-stops-working-after-a-few-days-after-12-releng-upgrade.70640/&#34;&gt;hitting some esoteric changes which technically crippled my mail server&lt;/a&gt;, when I realized it has been over a week that I haven&amp;rsquo;t been receiving any new emails.&lt;/p&gt;
&lt;p&gt;At first, I did not take it seriously. Just rebooted the server and prayed to the gods that it won&amp;rsquo;t happen again. It was a quick fix and it seemed to work. Until after a few days, I noticed that it happened again. This time I prayed to the gods even harder - both the old ones and the new ones ¯\_(ツ)_/¯ - and rebuilt every installed ports all over again in order to make sure I did not miss anything. I went for another reboot and, ops! There it was again laughing at me. Thus, losing all faith in the gods, which led me to &lt;a href=&#34;https://forums.freebsd.org/threads/mailserver-stops-working-after-a-few-days-after-12-releng-upgrade.70640/&#34;&gt;take up responsibility and investigate more on this issue or ask the experts on the FreeBSD forums&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After messing around with it, it turned out that the culprit is &lt;code&gt;clamav-clamd&lt;/code&gt; service crashing without any apparent reason at first. I fired up &lt;code&gt;htop&lt;/code&gt; after restarting &lt;code&gt;clamav-clamd&lt;/code&gt; and figured even at idle times it devours around ~ &lt;code&gt;30%&lt;/code&gt; of the available memory. According to &lt;a href=&#34;https://unix.stackexchange.com/a/278110&#34;&gt;this Stack Exchange answer&lt;/a&gt;:&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;&lt;p&gt;ClamAV holds the search strings using the classic string (Boyer Moore) and regular expression (Aho Corasick) algorithms. Being algorithms from the 1970s they are extemely memory efficient.&lt;/p&gt;
&lt;p&gt;The problem is the huge number of virus signatures. This leads to the algorithms&amp;rsquo; datastructures growing quite large.&lt;/p&gt;
&lt;p&gt;You can&amp;rsquo;t send those datastructures to swap, as there are no parts of the algorithms&amp;rsquo; datastructures accessed less often than other parts. If you do force pages of them to swap disk, then they&amp;rsquo;ll be referenced moments later and just swap straight back in. (Technically we say &amp;ldquo;the random access of the datastructure forces the entire datastructure to be in the process&amp;rsquo;s working set of memory&amp;rdquo;.)&lt;/p&gt;
&lt;p&gt;The datastructures are needed if you are scanning from the command line or scanning from a daemon.&lt;/p&gt;
&lt;p&gt;You can&amp;rsquo;t use just a portion of the virus signatures, as you don&amp;rsquo;t get to choose which viruses you will be sent, and thus can&amp;rsquo;t tell which signatures you will need.&lt;/p&gt;
&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;vk5tu&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://unix.stackexchange.com/a/278110&#34; title=&#34;https://unix.stackexchange.com/a/278110&#34;&gt;How to reduce ClamAV memory usage?&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;I guess due to some arcane changes in &lt;code&gt;12.0-RELEASE&lt;/code&gt;, FreeBSD kills memory hogs such as &lt;code&gt;clamav-clamd&lt;/code&gt; daemon (don&amp;rsquo;t take my word for it; it is just a poor man&amp;rsquo;s guess). I even tried to &lt;a href=&#34;https://forum.directadmin.com/showthread.php?t=55146&#34;&gt;lower the memory usage&lt;/a&gt; without much of a success. At the end, there were not too many choices or workarounds around the corner:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;A&lt;/code&gt;. Pray to the gods that it go away by itself, which I deemed impractical&lt;/p&gt;
&lt;p&gt;&lt;code&gt;B&lt;/code&gt;. Put aside laziness, and replace &lt;code&gt;security/clamsmtp&lt;/code&gt; with &lt;code&gt;security/amavisd-new&lt;/code&gt; in order to be able to &lt;a href=&#34;ClamAV&#34;&gt;run ClamAV on-demand which has its own pros and cons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;C&lt;/code&gt;. Write a quick POSIX-shell script to scan for a running &lt;code&gt;clamav-clamd&lt;/code&gt; process using &lt;code&gt;ps aux | grep clamd&lt;/code&gt;, set it up as a cron job with X-minute(s) interval, and then start the server if it cannot be found running, and be done with it for the time being.&lt;/p&gt;
&lt;p&gt;For the sake of slothfulness, I opted to go with option &lt;code&gt;C&lt;/code&gt;. As a consequence, I came up with a generic simple script that is able to not only monitor and restart the &lt;code&gt;clamav-clamd&lt;/code&gt; service but also is able to keep any other crashing services running on FreeBSD.&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>HackYourFuture First Game Development Workshop Report</title>
      <link>https://www.babaei.net/blog/hackyourfuture-first-game-development-workshop-report/</link>
      <pubDate>Sun, 13 Jan 2019 20:19:00 +0100</pubDate>
      
      <guid>https://www.babaei.net/blog/hackyourfuture-first-game-development-workshop-report/</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/hackyourfuture-first-game-development-workshop-report/hackyour-future-first-game-development-workshop-report.webp&#34; alt=&#34;HackYourFuture First Game Development Workshop Report&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/hackyourfuture-first-game-development-workshop-report/hackyour-future-first-game-development-workshop-report.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;HackYourFuture First Game Development Workshop Report&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;OK! Today, &lt;a href=&#34;https://www.hackyourfuture.net/&#34;&gt;HackYourFuture&lt;/a&gt; held their first-ever gamedev workshop titled &amp;ldquo;Introduction to Unreal Engine 4 Game Development Using Blueprint&amp;rdquo; at their Amsterdam office, which I&amp;rsquo;ve been given the opportunity to present to their alumni on HackYourFuture&amp;rsquo;s behalf.&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;m still very excited and fascinated by the culture of sharing and the friendly environment governed by HackYourFuture, I decided to share the presentation file which I did prepare for this four hour workshop under the terms of &lt;a href=&#34;http://creativecommons.org/licenses/by-sa/3.0/&#34;&gt;(CC BY-SA 3.0) Creative Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;, to be used by anyone who is either new to game development or is intersted in the topic. It&amp;rsquo;s jam packed with so much information for absolute beginners. Feel free to share and adapt according to your own needs under the terms of the license.&lt;/p&gt;
&lt;p&gt;The presentation can be found at the end of this post in PDF, OpenDocument Presentation, or Microsoft PowerPoint formats.&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>Migrating From Hexo To Hugo</title>
      <link>https://www.babaei.net/blog/migrating-from-hexo-to-hugo/</link>
      <pubDate>Fri, 06 Apr 2018 00:13:10 +0000</pubDate>
      
      <guid>https://www.babaei.net/blog/migrating-from-hexo-to-hugo/</guid>
      <description>&lt;p&gt;Hexo was so perfect and fast that I thought I will live with it happily ever after forever. Shortly, after I migrated this blog from &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress 2.x&lt;/a&gt; to &lt;a href=&#34;https://hexo.io/&#34;&gt;Hexo&lt;/a&gt;, I came across &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; static generator with support for blogging. The idea of having a blazingly fast static generator written in a compiled native language seemed intriguing to me. I tried to migrate my blog to Hugo soon after multiple times which led to failure every single time due to &lt;a href=&#34;https://github.com/gohugoio/hugo/issues/1768&#34;&gt;lack of a few features in Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fast-forward, I played around with &lt;a href=&#34;https://www.getgutenberg.io/&#34;&gt;Gutenburg&lt;/a&gt; (written in &lt;a href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;) a few month back. I found it to be an awesome project. Not only, every feature put together thoughtfully, but also &lt;a href=&#34;https://github.com/Keats&#34;&gt;the developer&lt;/a&gt; is very very responsive and welcomes new ideas and contributions warmly. Nonetheless, it&amp;rsquo;s still young and immature. So, it failed me too.&lt;/p&gt;
&lt;p&gt;I came back to check out Hugo once more last week and to my surprise, I found it really stable and production ready with tons of features and themes. So, here is my new blog ported over to the mighty Hugo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; Although Hugo satisfies all my current needs, I&amp;rsquo;m more interested in Rust projects than the &lt;a href=&#34;https://golang.org/&#34;&gt;Go&lt;/a&gt; ones since I&amp;rsquo;m playing around with Rust as an alternative to Modern C++ these days. So, I&amp;rsquo;ll keep an eye on Gutenberg; who knows another port might be underway :)&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>Android: Install ADB drivers for any device without OEM drivers</title>
      <link>https://www.babaei.net/blog/android-install-adb-drivers-for-any-device-without-oem-drivers/</link>
      <pubDate>Tue, 26 Jan 2016 03:38:37 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/android-install-adb-drivers-for-any-device-without-oem-drivers/</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/android-install-adb-drivers-for-any-device-without-oem-drivers/android-robot.webp&#34; alt=&#34;Figure 1. Android Robot&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/android-install-adb-drivers-for-any-device-without-oem-drivers/android-robot.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Figure 1. Android Robot&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Well, I started my &lt;em&gt;Android&lt;/em&gt; development on a &lt;a href=&#34;http://www.gsmarena.com/samsung_i9100_galaxy_s_ii-3621.php&#34;&gt;Samsung I9100 Galaxy S II&lt;/a&gt;. I never had any trouble getting ADB to work on &lt;em&gt;Microsoft Windows&lt;/em&gt; since I had the drivers from Samsung which was already installed due to my previous &lt;a href=&#34;http://www.cyanogenmod.org/&#34;&gt;Cyanogenmod&lt;/a&gt; installation process. Afterwards, I received a &lt;a href=&#34;http://www.gsmarena.com/asus_google_nexus_7-4850.php&#34;&gt;Nexus 7&lt;/a&gt; and a bit latter a &lt;a href=&#34;http://www.gsmarena.com/lg_nexus_5-5705.php&#34;&gt;Nexus 5&lt;/a&gt; which became my primary development device of choice. &lt;em&gt;Google&lt;/em&gt; did a good job by providing ADB drivers for All Nexus devices inside the SDK or as a &lt;a href=&#34;http://developer.android.com/sdk/win-usb.html&#34;&gt;small separate download on Android Developers website&lt;/a&gt; which was very easy to install. The trouble began when my development process involved testing my applications and games on devices other than Nexus ones I had. For some manufacturers I was never able to find the drivers. Finding the correct driver for each device was a huge pain until I found a solution that became a remedy for all my troubles getting ADB to work with any Android device, even without the OEM drivers. It even became my preferred alternative to manufacturer&amp;rsquo;s provided ADB drivers for all my other devices till this day, since I hate the bloat-ware and useless crap they provide along with their drivers which is inevitable to install anyway.&lt;/p&gt;
&lt;p&gt;In the rest of this post I&amp;rsquo;m going to share my easy solution with you:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Post-Processing Effects in Cocos2d-x</title>
      <link>https://www.babaei.net/blog/post-processing-effects-in-cocos2d-x/</link>
      <pubDate>Fri, 08 Jan 2016 22:10:30 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/post-processing-effects-in-cocos2d-x/</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/post-processing-effects-in-cocos2d-x/gray-black-and-white-shader.webp&#34; alt=&#34;Picture A: Gray (black and white) post-processing effect in Cocos2d-x&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/post-processing-effects-in-cocos2d-x/gray-black-and-white-shader.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Picture A: Gray (black and white) post-processing effect in Cocos2d-x&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Update [2020/10/23]:&lt;/strong&gt; &lt;em&gt;Since I wrote this tutorial many things has changed in Cocos2d-x and I haven&amp;rsquo;t been using it in years as I switched to Unreal Engine 4. According to &lt;a href=&#34;https://github.com/NuLL3rr0r/babaei.net/issues/2&#34;&gt;this GitHub issue&lt;/a&gt; opened by my blog readers, in order for this code to work there has to be some modifications to the code which is provided on that issue by @lazerfalcon and @madrazo. I was also &lt;a href=&#34;https://stackoverflow.com/questions/34595594/cocos2dx-sprite3d-wont-render-to-texture/39073958#39073958&#34;&gt;having trouble with render to texture on Sprite3D&lt;/a&gt; which seems to have been solved in newer versions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Despite the fact that &lt;a href=&#34;http://cocos2d-x.org/&#34;&gt;Cocos2d-x&lt;/a&gt; uses the &lt;a href=&#34;https://www.khronos.org/opengles/&#34;&gt;OpenGL ES Shading Language v1.0&lt;/a&gt; for the shaders (in order to learn more about the language, please refer to: &lt;a href=&#34;https://www.khronos.org/files/opengles_shading_language.pdf&#34;&gt;OpenGL ES Shading Language v1.0 Spec&lt;/a&gt;) the engine does not provide an out-of-the-box API to apply post-processing effects to the whole game scene output at once.&lt;/p&gt;
&lt;p&gt;In this tutorial we will learn an easy way to apply multiple post-processing effects to the game scene output all at once.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Packt $5 Campaign - Packt Publishing</title>
      <link>https://www.babaei.net/blog/packt-dollar-5-campaign-packt-publishing/</link>
      <pubDate>Sat, 19 Dec 2015 10:47:34 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/packt-dollar-5-campaign-packt-publishing/</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/packt-dollar-5-campaign-packt-publishing/packt-dollar-5-campaign-packt-publishing.webp&#34; alt=&#34;Packt $5 Campaign - Packt Publishing&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/packt-dollar-5-campaign-packt-publishing/packt-dollar-5-campaign-packt-publishing.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Packt $5 Campaign - Packt Publishing&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;From the 17th December 2015 into the New Year, Packt Publishing is inviting the tech world to explore its extensive library of eBooks and Video courses for one amazing price. Every single eBook and Video course Packt has ever created will be available on packtpub.com for just $5!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Packt Essential IT Skills of 2015 and Challenges for 2016</title>
      <link>https://www.babaei.net/blog/packt-essential-it-skills-of-2015-and-challenges-for-2016/</link>
      <pubDate>Thu, 17 Dec 2015 22:48:06 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/packt-essential-it-skills-of-2015-and-challenges-for-2016/</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/packt-essential-it-skills-of-2015-and-challenges-for-2016/packt-essential-it-skills-of-2015-and-challenges-for-2016.webp&#34; alt=&#34;Join Packt and Prepare for Tech in 2016 - Take Packt’s Year in Review survey and get any eBook or video for just $5!&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/packt-essential-it-skills-of-2015-and-challenges-for-2016/packt-essential-it-skills-of-2015-and-challenges-for-2016.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Join Packt and Prepare for Tech in 2016 - Take Packt’s Year in Review survey and get any eBook or video for just $5!&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;At a time of rapid development and innovation, tech skills have never been more valuable. The right skills and cutting-edge knowledge can bring huge rewards.&lt;/p&gt;
&lt;p&gt;Over the summer, Packt Publishing carried out &lt;a href=&#34;http://bit.ly/1NYBOs3&#34;&gt;a survey of more than 20,000 people from across the world of tech&lt;/a&gt;, to investigate what skills are most important in today’s fast-changing technological landscape. Now, as the year draws to a close, the publisher is continuing their invitation to ‘Skill Up’ by reviewing the year and looking closely at what the future might hold. From the key challenges to the skills and tools people are most passionate about learning, Packt is preparing for an exciting 2016.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Be Skilled &amp; Ready with Packt’s revamped learning library</title>
      <link>https://www.babaei.net/blog/be-skilled-ready-with-packt-revamped-learning-library/</link>
      <pubDate>Thu, 01 Oct 2015 17:29:14 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/be-skilled-ready-with-packt-revamped-learning-library/</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/be-skilled-ready-with-packt-revamped-learning-library/be-skilled-ready-with-packt-revamped-learning-library.webp&#34; alt=&#34;Be Skilled &amp;amp; Ready with Packt’s revamped learning library – over 3,000 titles for a whole year now just $100!&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/be-skilled-ready-with-packt-revamped-learning-library/be-skilled-ready-with-packt-revamped-learning-library.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Be Skilled &amp;amp; Ready with Packt’s revamped learning library – over 3,000 titles for a whole year now just $100!&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;With new features and our latest books and videos just for you, there’s no reason to stay behind when it comes to IT&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This week, &lt;a href=&#34;https://www.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt; has reduced the price of its PacktLib subscription service as it rolled out dozens of new features and improvements to give you the best experience possible to stay on top of the curve and get the skills you need when you need them.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Delete a File With Invalid or Bad Characters in File Name on FreeBSD</title>
      <link>https://www.babaei.net/blog/delete-a-file-with-invalid-or-bad-characters-in-file-name-on-freebsd/</link>
      <pubDate>Wed, 09 Sep 2015 12:54:08 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/delete-a-file-with-invalid-or-bad-characters-in-file-name-on-freebsd/</guid>
      <description>&lt;p&gt;There once was a time when I did the following inside my home directory:&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;$ wget &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;some-url&amp;#34;&lt;/span&gt; -O &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;output-file.mp4&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I clearly remember copying the output file name from a web page. Unfortunately, the copied text has a new line at the beginning of it and I didn&amp;rsquo;t notice that. That&amp;rsquo;s because the &lt;code&gt;newline&lt;/code&gt; or &lt;code&gt;carriage return&lt;/code&gt; characters are control characters and have no visual representation. Anyway, when I listed files inside my home directory I noticed a strange file name on my list:&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;$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;?output-file.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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>What does your industry look like?</title>
      <link>https://www.babaei.net/blog/what-does-your-industry-look-like/</link>
      <pubDate>Thu, 23 Jul 2015 15:14:36 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/what-does-your-industry-look-like/</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/what-does-your-industry-look-like/what-does-your-industry-look-like.webp&#34; alt=&#34;What does your industry look like?&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/what-does-your-industry-look-like/what-does-your-industry-look-like.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;What does your industry look like?&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;I can only say wow! &lt;a href=&#34;https://www.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt; has just released &lt;a href=&#34;http://bit.ly/1TSIsRq&#34;&gt;their comprehensive IT industry salary reports, with data from over 20,000 developers around the globe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you really want to identify or get an idea of the upcoming trends over the next few years, you should consider this comprehensive analysis in order to get the most out of your career and skills. This report covers four segments of IT industry including Web Development &amp;amp; Design, Application Development, Security &amp;amp; System Administration, and Data Science &amp;amp; Business Intelligence, making this &lt;a href=&#34;http://bit.ly/1TSIsRq&#34;&gt;one of the most comprehensive surveys in recent years&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Rapid Gulp Video Tutorial</title>
      <link>https://www.babaei.net/blog/rapid-gulp-video-tutorial/</link>
      <pubDate>Fri, 12 Jun 2015 14:06:50 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/rapid-gulp-video-tutorial/</guid>
      <description>&lt;p&gt;Modern web development is filled with an abundance of tools and technologies, but it’s difficult to know where to begin. You want both efficiency of your work and high performance of your site; Gulp brings that right to your doorstep. With its rising popularity, you don’t want to leave Gulp out of your toolbox.&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>Packt Free Learning Library</title>
      <link>https://www.babaei.net/blog/packt-free-learning-library/</link>
      <pubDate>Thu, 28 May 2015 03:37:59 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/packt-free-learning-library/</guid>
      <description>&lt;p&gt;From 30th April, 2015 Packt Publishing has thrown open the virtual doors of its new Free Learning Library and offering its customers a daily chance to grab a fresh free eBook from its website. The publisher is encouraging people to learn new skills and try out new technologies and so every day it will be offering a different eBook from its huge list of titles free for anyone to download.&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/packt-free-learning-library/packt-free-learning-library.webp&#34; alt=&#34;Packt Free Learning Library - Every day Packt Publishing is giving away books for free to help teach new tech skills&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/packt-free-learning-library/packt-free-learning-library.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;Packt Free Learning Library - Every day Packt Publishing is giving away books for free to help teach new tech skills&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Migrating From Octopress To Hexo</title>
      <link>https://www.babaei.net/blog/migrating-from-octopress-to-hexo/</link>
      <pubDate>Thu, 28 May 2015 01:44:00 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/migrating-from-octopress-to-hexo/</guid>
      <description>&lt;p&gt;Well, I was living a happy life with &lt;em&gt;&lt;a href=&#34;https://github.com/imathis/octopress&#34;&gt;Octopress 2.x&lt;/a&gt;&lt;/em&gt; despite the fact that I didn&amp;rsquo;t do much blogging in the past couple of years. Moreover, in my estimation &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; still should be considered as one of the greatest blogging platforms among &lt;a href=&#34;https://www.staticgen.com/&#34;&gt;its peers&lt;/a&gt; and I really got nothing against it. But, I see a few shortcomings which made me looking for alternatives (and some of these still affects &lt;a href=&#34;https://github.com/octopress/octopress&#34;&gt;the 3.x version of Octopress&lt;/a&gt;):&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>International Day Against DRM at Packt Publishing</title>
      <link>https://www.babaei.net/blog/international-day-against-drm-packt-publishing/</link>
      <pubDate>Wed, 06 May 2015 23:30:33 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/international-day-against-drm-packt-publishing/</guid>
      <description>&lt;blockquote&gt;
  &lt;p&gt;&lt;p&gt;Digital Restrictions Management (DRM) harms almost everyone, but most people have never heard of it. Today is one of our best opportunities to change that.&lt;/p&gt;
&lt;p&gt;There are people around the world coming together to say that we will not tolerate the remote deletions, unethical surveillance, and invasive restrictions of DRM. In fact, with events in at least nine countries and huge online participation, it&amp;rsquo;s the world&amp;rsquo;s biggest anti-DRM protest.&lt;/p&gt;
&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;Defective by Design - International Day Against DRM  May, 6th 2015&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;https://www.defectivebydesign.org/dayagainstdrm&#34; title=&#34;https://www.defectivebydesign.org/dayagainstdrm&#34;&gt;defectivebydesign.org/...&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&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/international-day-against-drm-packt-publishing/international-day-against-drm-packt-publishing.webp&#34; alt=&#34;International Day Against DRM at Packt Publishing&#34;/&gt;
    &lt;/div&gt;
    &lt;a href=&#34;https://www.babaei.net/blog/international-day-against-drm-packt-publishing/international-day-against-drm-packt-publishing.webp&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;
      &lt;figcaption&gt;
          &lt;p&gt;International Day Against DRM at Packt Publishing&lt;/p&gt;
      &lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Well, I just found out that this year, to demonstrate their continuing support for Day Against DRM, as they celebrates &lt;a href=&#34;https://www.defectivebydesign.org/dayagainstdrm&#34;&gt;International Day Against DRM, May 6th 2015&lt;/a&gt;, &lt;a href=&#34;http://bit.ly/1clSCd7&#34;&gt;Packt Publishing is offering all its DRM-free content at $10 for 24 hours only on May 6th&lt;/a&gt; – with more than 3000 eBooks and 100 Videos available across &lt;a href=&#34;http://www.packtpub.com/&#34;&gt;the publisher’s website&lt;/a&gt;.&lt;/p&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>Wifi Fix for Asus Google Nexus 7 Cellular, When SIM-Card Is Inserted</title>
      <link>https://www.babaei.net/blog/wifi-fix-for-asus-google-nexus-7-cellular-when-sim-card-is-inserted/</link>
      <pubDate>Thu, 13 Jun 2013 03:39:00 +0430</pubDate>
      
      <guid>https://www.babaei.net/blog/wifi-fix-for-asus-google-nexus-7-cellular-when-sim-card-is-inserted/</guid>
      <description>&lt;p&gt;As a Nexus 7 tablet user I&amp;rsquo;ve been struggling with my Nexus 7 WiFi from the moment that I&amp;rsquo;ve owned it. It was originally released with Android 4.2.0 installed. Nonetheless, Android 4.2.1 and 4.2.2 didn&amp;rsquo;t get me anywhere with the WiFi issue. In fact, you may have suffered from this issue, and are already familiar with. After inserting a SIM-Card into the device, Android asks to restart the device. However, after rebooting you will notice the WiFi module won&amp;rsquo;t work. No matter how hard you try it won&amp;rsquo;t see any WiFi network while keeps saying &amp;ldquo;WPS failed. Please try again in a few minutes&amp;rdquo;. Even tried an open unencrypted WiFi without any luck. In fact, the only solution that worked for me was removing the SIM-Card completely and do a factory reset.&lt;/p&gt;
&lt;p&gt;Also as you may have noticed, it&amp;rsquo;s been quiet some time since &lt;a href=&#34;http://code.google.com/p/android/issues/detail?id=40065&#34;&gt;an issue has been opened on Google Code around this issue on Nexus 4, Nexus 7 and Nexus 10 devices&lt;/a&gt;. Unfortunately, it seems that Google doesn&amp;rsquo;t care about this issue at all, and they closed the issue while ago. Even worse, they won&amp;rsquo;t allow comments any more (At the time of this writing there are 1223 comments on the issue which shows how serious the situation is).&lt;/p&gt;
&lt;p&gt;Anyway, if you&amp;rsquo;re one of the sufferers from this issue, still there may be some good news for you. It appears that the root of all evil is inserting a non-U.S. SIM-Card on your device. Hopefully, I suddenly came across an Android application called &lt;a href=&#34;http://www.fardjad.com/android/wifix/&#34;&gt;WiFi Fix for Android 4.x&lt;/a&gt; by &lt;a href=&#34;http://www.fardjad.com/&#34;&gt;Fardjad Davari&lt;/a&gt;, which completely solved the problem for me. It&amp;rsquo;s been a week since I tried this application and found no more issue with my WiFi.&lt;/p&gt;
&lt;p&gt;In fact, the process is very easy and straightforward to follow. Here is what worked for me on &lt;a href=&#34;http://get.cm/?device=tilapia&#34;&gt;Nexus 7 with latest CyanogenMod 10.1 nightly builds&lt;/a&gt; (It may work on Nexus 4 or Nexus 10, too):&lt;/p&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>
    
    <item>
      <title>Should I Check if a Pointer Is NULL Before Deleting It?</title>
      <link>https://www.babaei.net/blog/should-i-check-if-pointer-is-null-before-deleting-it/</link>
      <pubDate>Mon, 11 Feb 2013 01:52:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/should-i-check-if-pointer-is-null-before-deleting-it/</guid>
      <description>&lt;p&gt;Most of the time I see some C++ programmers who check if a pointer is NULL before deleting it.&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-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;if&lt;/span&gt; (ptr &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; NULL) {
&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;delete&lt;/span&gt; ptr;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ptr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;
&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;/div&gt;
&lt;p&gt;Well, according to &lt;em&gt;C++03 [ISO/IEC IS 14882:2003] §5.3.5/2&lt;/em&gt; which explicitly states:&lt;/p&gt;











  
  
  
  





  


&lt;blockquote&gt;
  &lt;p&gt;&amp;hellip;if the value of the operand of delete is the null pointer the operation has no effect.&lt;/p&gt;
  &lt;footer&gt;
    &lt;strong&gt;C&amp;#43;&amp;#43; Standard Core Language Defect Reports and Accepted Issues, Revision 82&lt;/strong&gt;
    
      
        &lt;cite&gt;
          &lt;a href=&#34;http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348&#34; title=&#34;http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348&#34;&gt;delete and user-written deallocation functions&lt;/a&gt; 
        &lt;/cite&gt;
      
    
  &lt;/footer&gt;
&lt;/blockquote&gt;

&lt;p&gt;Therefore, deleting a &lt;em&gt;NULL pointer&lt;/em&gt; has no effect (if the deallocation function is one supplied in the standard library), so it is not necessary to check for a &lt;em&gt;NULL pointer&lt;/em&gt; before calling delete.&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-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;delete&lt;/span&gt; ptr;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ptr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; NULL;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: Keep in mind that deleting a &lt;strong&gt;void*&lt;/strong&gt; pointer results in &lt;strike&gt;undefined behavior&lt;/strike&gt; whether it&amp;rsquo;s &lt;strong&gt;NULL&lt;/strong&gt; or not.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>Get nFringe to Work with Visual Studio 2012</title>
      <link>https://www.babaei.net/blog/get-nfringe-to-work-with-visual-studio-2012/</link>
      <pubDate>Sun, 10 Feb 2013 17:53:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/get-nfringe-to-work-with-visual-studio-2012/</guid>
      <description>&lt;p&gt;As you&amp;rsquo;ve noticed there&amp;rsquo;s still no official support for Microsoft Visual Studio 2012 in recent Pixel Mine nFringe releases. While ago I came across &lt;a href=&#34;http://forums.epicgames.com/threads/874296-debug-Unreal-Script-error-at-vs2011?p=30795357&amp;amp;viewfull=1#post30795357&#34;&gt;an awesome forum post at Epic Games Forums&lt;/a&gt; which describs a simple process of getting nFringe to work with VS2012. Since then I&amp;rsquo;ve used it in my day to day development tasks and I had no difficulties at all using it. And damn, it&amp;rsquo;s pretty stable despite the fact that not officially supported by Pixel Mine. Even nFringe version 1.1 which I&amp;rsquo;ve tested is playing nice with VS2012.&lt;/p&gt;
&lt;p&gt;The only prerequisite that you need is your previous VS2010 + nFringe installation to obtain some files from it. Once you&amp;rsquo;ve acquired these files you don&amp;rsquo;t need VS2010 or nFringe installer for further installations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Open Windows Command Prompt (cmd.exe) and run the following commands:&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-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; xcopy /E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Pixel Mine&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; xcopy /E &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 10.0\UnrealScript&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 11.0\&amp;#34;&lt;/span&gt;&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; Open up &lt;strong&gt;extension.vsixmanifest&lt;/strong&gt; in Notepad or your favorite editor and change &lt;strong&gt;VisualStudio Version&lt;/strong&gt; to &lt;strong&gt;11&lt;/strong&gt; (Note: In the following path change &lt;strong&gt;1.1&lt;/strong&gt; with your nfringe version, e.g. 1.2).&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-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; notepad &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Pixel Mine nFringe (UnrealScript)\1.1\extension.vsixmanifest&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;codeblock&#34;&gt;
    
    &lt;span class=&#34;title&#34;&gt;extension.vsixmanifest&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-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;InstalledByMsi&amp;gt;&lt;/span&gt;true&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/InstalledByMsi&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:#f92672&#34;&gt;&amp;lt;SupportedProducts&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:#f92672&#34;&gt;&amp;lt;VisualStudio&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Version=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;11.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Run the following command to register nFringe extension in Visual Studio 2012:&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-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe&amp;#34;&lt;/span&gt; /setup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Finally, you need to re-validate your nFringe license in VS2012.&lt;/p&gt;
&lt;p&gt;Happy coding ;)&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Windows 8, Install .NET Framework 2.0 - 3.5 Offline</title>
      <link>https://www.babaei.net/blog/windows-8-install-dot-net-framework-20-35-offline/</link>
      <pubDate>Sun, 10 Feb 2013 17:31:00 +0330</pubDate>
      
      <guid>https://www.babaei.net/blog/windows-8-install-dot-net-framework-20-35-offline/</guid>
      <description>&lt;p&gt;Well, I&amp;rsquo;ve failed to install .NET Framework 2.0/3.5 in Windows 8 using Program and Features in Control Panel, which I need for an older project I&amp;rsquo;ve done long ago. But I came across an easy solution which did the trick.&lt;/p&gt;
&lt;p&gt;In Windows Command Prompt (cmd.exe) or Run dialog, enter the following command and hit Enter:&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-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt; Dism /online /enable-feature /featurename:NetFx3 /All /Source❌\sources\sxs /LimitAccess&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace &lt;strong&gt;x:&lt;/strong&gt; with path of your Windows 8 installation DVD.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: You have to run cmd.exe as Administrator in order for this to work!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    
    <item>
      <title>About Me</title>
      <link>https://www.babaei.net/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.babaei.net/about/</guid>
      <description>My first exposure to videogames occurred during a visit to my aunt’s house in the late 80’s. I was riveted at the sight of motioning icons on the TV screen. Later, I learned the videogame was called River Raid, and the console 8-bit Atari 2600. When my parents bought me my first gaming console the next summer, I found my lifelong passion: making games.
Although the game development industry in my home country of Iran is still in the making, I am affiliated with a respectable group of game developers known as the nation’s first generation.</description>
    </item>
    
    <item>
      <title>Blog Archives</title>
      <link>https://www.babaei.net/blog/archives/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.babaei.net/blog/archives/</guid>
      <description></description>
    </item>
    
    <item>
      <title>Projects</title>
      <link>https://www.babaei.net/projects/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.babaei.net/projects/</guid>
      <description>Something Cool Genre Not a gamedev project Developer - Year(s) 2022 - Present Engine Unreal Engine 4 / 5 Platform(s) Microsoft Windows, GNU/Linux, Android, Oculus Quest 2, Oculus Quest Pro, HTC VIVE Pro, HTC VIVE Focus 3 Description - Roles(s) Lead C++/Unreal Developer
Lead Rust Developer
Go lang
NHRA Championship Drag Racing: Speed For All Genre Racing Developer Team6 Year(s) 2021 - 2022 Engine Unreal Engine 4 Platform(s) PlayStation 5, Nintendo Switch, Xbox One, PlayStation 4, Microsoft Windows, Xbox Series X and Series S Description The official NHRA video-game.</description>
    </item>
    
    <item>
      <title>Search</title>
      <link>https://www.babaei.net/search/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://www.babaei.net/search/</guid>
      <description>In order to search the site, enter a phrase in the following text box and hit enter, please:
Search phrase Search powered by a self-hosted instance of searx.</description>
    </item>
    
  </channel>
</rss>
