<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on jludwig.net</title>
        <link>https://jludwig.net/posts/</link>
        <description>Recent content in Posts on jludwig.net</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Fri, 01 Sep 2023 16:58:24 -0700</lastBuildDate>
        <atom:link href="https://jludwig.net/posts/index.xml" rel="self" type="application/rss+xml" />
        
        <item>
            <title>TIL: YAML Anchors and Aliases. Yep, That&#39;s a Thing.</title>
            <link>https://jludwig.net/posts/til-yaml-anchors/</link>
            <pubDate>Fri, 01 Sep 2023 16:58:24 -0700</pubDate>
            
            <guid>https://jludwig.net/posts/til-yaml-anchors/</guid>
            <description>Hello to the five of you who clicked on this. While knee-deep in the YAML swamp (a daily ritual for us Kubernetes enthusiasts), I&amp;rsquo;ve spotted these pesky &amp;amp; and * symbols bobbing up and down in numerous FluxCD repos. Did I, the ever-curious, investigate immediately? Nope. I made a mental &amp;ldquo;todo&amp;rdquo; note, shoved it in the drawer of procrastination, and just unearthed it today.
What are these critters? In YAML&amp;rsquo;s cryptic language, an anchor (&amp;amp;) is like a bookmark, and a reference (*) is you going back to said bookmark because you forgot where you were.</description>
            <content type="html"><![CDATA[<p>Hello to the five of you who clicked on this. While knee-deep in the YAML swamp (a daily ritual for us Kubernetes enthusiasts), I&rsquo;ve spotted these pesky <code>&amp;</code> and <code>*</code> symbols bobbing up and down in numerous FluxCD repos. Did I, the ever-curious, investigate immediately? Nope. I made a mental &ldquo;todo&rdquo; note, shoved it in the drawer of procrastination, and just unearthed it today.</p>
<h3 id="what-are-these-critters">What are these critters?</h3>
<p>In YAML&rsquo;s cryptic language, an <strong>anchor</strong> (<code>&amp;</code>) is like a bookmark, and a <strong>reference</strong> (<code>*</code>) is you going back to said bookmark because you forgot where you were.</p>
<h3 id="for-the-visual-learners-and-the-rest-of-us-pretending-to-be">For the visual learners (and the rest of us pretending to be):</h3>
<p>The Old Way:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml"><span style="color:#f92672">metadata</span>:
  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">really-cool-app</span>
</code></pre></div><p>And repeat that name everywhere.</p>
<p>The New (to me) Way:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml"><span style="color:#f92672">metadata</span>:
  <span style="color:#f92672">name</span>: <span style="color:#75715e">&amp;appName</span> <span style="color:#ae81ff">really-cool-app</span>
...
<span style="color:#f92672">spec</span>:
  <span style="color:#f92672">releaseName</span>: <span style="color:#75715e">*appName</span>
</code></pre></div><p>Ta-da! That <code>&amp;appName</code> is our sneaky bookmark, and <code>*appName</code> is us coming back for a refresher.</p>
<h3 id="why-does-this-even-matter"><em>Why does this even matter?</em></h3>
<ol>
<li><strong>Efficiency</strong>: It&rsquo;s like copy-pasting, but fancier.</li>
<li><strong>Consistency</strong>: Reduce the chances of a rogue typo messing up your YAML (not that I&rsquo;ve ever done that, obviously).</li>
</ol>
<p>But heed this: your anchor has to pop up before its reference, and after tweaking, give it a once-over (or thrice-over, depending on your coffee intake).</p>
<p>In wrapping up this riveting tale of YAML wizardry, remember: no matter how tall the tech stack, there&rsquo;s always a corner we haven’t peeked around. Here’s to lurking symbols, silent chuckles, and the never-ending tech scavenger hunt.</p>
<p>For a deeper dive into YAML anchors and aliases, refer to the official YAML 1.2.2 specification.</p>
<h3 id="further-reading">Further reading</h3>
<p>For a deeper dive into YAML anchors and aliases, refer to the official <a href="https://yaml.org/spec/1.2.2/#anchors-and-aliases">YAML 1.2.2 specification</a>.</p>
]]></content>
        </item>
        
        <item>
            <title>Migrating ZFS Pools: Transitioning from Consumer to Mixed-Consumer/Enterprise SSDs</title>
            <link>https://jludwig.net/posts/migrate-consumer-to-enterprise-on-zfs/</link>
            <pubDate>Fri, 25 Aug 2023 18:27:11 -0700</pubDate>
            
            <guid>https://jludwig.net/posts/migrate-consumer-to-enterprise-on-zfs/</guid>
            <description>When I first upgraded to consumer-grade M.2 NVMe SSDs, the sheer speed was invigorating. But, within six months, two drives failed. While enterprise U.2 NVMe SSDs are typically more readily available and might offer better performance, space constraints led me to M.2 drives. I settled on Samsung PM983 M.2 NVMes, which, while substantially more durable than my previous choice, were still accessible, cost-effective, and close to 2TB in size. The unique capacity of 1.</description>
            <content type="html"><![CDATA[<p>When I first upgraded to consumer-grade M.2 NVMe SSDs, the sheer speed was invigorating. But, within six months, two drives failed. While enterprise U.2 NVMe SSDs are typically more readily available and might offer better performance, space constraints led me to M.2 drives. I settled on Samsung PM983 M.2 NVMes, which, while substantially more durable than my previous choice, were still accessible, cost-effective, and close to 2TB in size. The unique capacity of 1.92TB, in contrast to a rounded 2TB, likely signifies their enterprise readiness. However, such a size difference isn&rsquo;t trivial when working with ZFS.</p>
<p>I plan to maximize the use of my consumer-grade SSDs before transitioning completely to enterprise-grade. My strategy is to establish a new pool with durable NVMe drives mirrored to my consumer ones. Given that my least healthy drive still retains over half of its write lifespan, and considering the impressive 2.5PB durability of the PM983s compared to the premature failing 800TB consumer SSDs, it’s anticipated that I will deplete my consumer-grade stock first.</p>
<h3 id="steps">Steps:</h3>
<ol>
<li><strong>Backup</strong>: Ensure you have a full backup before beginning.</li>
<li><strong>Downtime</strong>: Migrate data to the backup machine using <code>zfs send</code> and <code>zfs receive</code>. If this isn&rsquo;t feasible, establish a maintenance window.</li>
<li><strong>Initialize New ZFS Pool</strong>: Form a fresh ZFS pool with the enterprise SSDs, and for clarity, I&rsquo;m designating them as <code>consumer-pool</code> and <code>durable-pool</code>.</li>
<li><strong>Data Migration</strong>: Shift datasets from <code>consumer-pool</code> to <code>durable-pool</code>.</li>
<li><strong>Detach Consumer SSDs</strong>: Safely disengage consumer SSDs from <code>consumer-pool</code>.</li>
<li><strong>Partition Resizing</strong>: Modify consumer SSD partitions to coincide with enterprise SSD sizes and then reformat.</li>
<li><strong>Mirror Integration</strong>: Merge the resized consumer SSDs with the <code>durable-pool</code>.</li>
<li><strong>Data Verification</strong>: Cross-check data consistency across both pools using ZFS&rsquo;s checksum capabilities.</li>
<li><strong>Old Pool Decommission</strong>: Upon successful validation of <code>durable-pool</code>, decommission <code>consumer-pool</code>.</li>
<li><strong>Implement Hot-Spares</strong>: Assign the surplus consumer SSDs as hot spares within <code>durable-pool</code>.</li>
<li><strong>Activate New Zpool</strong>: Transition operations based on your storage strategy.</li>
</ol>
<h3 id="resizing">Resizing</h3>
<p>Given the use of <code>fdisk</code>, we&rsquo;ll work with sectors. To illustrate, for a disk showing as 1.7TB and 1920383410176 bytes, sectors are computed as:</p>
<pre><code>Sectors (1.7TB) = 1920383410176 bytes / (512 bytes/sector)
</code></pre><p>Adjust the calculations as necessary for different block sizes.</p>
<p>For a streamlined operation, after confirming the sequence above, it can be echoed as shown to facilitate batch processing or loop operations:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">echo -e <span style="color:#e6db74">&#34;g\nn\n\n\n3750748848\nw\n&#34;</span> | fdisk /dev/nvme6n1
</code></pre></div><h3 id="conclusion">Conclusion:</h3>
<p>This strategy eased my transition to enterprise SSDs without forsaking my consumer SSDs. Though certain steps entail risks, vigilance and adequate preparation ensure smooth migration. Remember: Preparation is key to any successful migration. Happy data transitioning!</p>
]]></content>
        </item>
        
        <item>
            <title>Powering Through: Automating Home Infrastructure for Bay Area&#39;s Blackouts</title>
            <link>https://jludwig.net/posts/homelab-blackouts/</link>
            <pubDate>Wed, 09 Aug 2023 17:16:29 -0700</pubDate>
            
            <guid>https://jludwig.net/posts/homelab-blackouts/</guid>
            <description>Introduction Being based in the Bay Area and managing a complex home infrastructure – including Kubernetes clusters, VMs, and Proxmox nodes – I&amp;rsquo;ve faced the significant challenge of rolling blackouts. Here&amp;rsquo;s my journey, including the lessons learned, the solutions implemented, and my plans for the future.
The 2 AM Wake-Up Call My UPS alarm went off at 2 AM, and with only 15 minutes of power left, I failed to turn off my nodes in time, leading to an unsafe shutdown.</description>
            <content type="html"><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Being based in the Bay Area and managing a complex home infrastructure – including Kubernetes clusters, VMs, and Proxmox nodes – I&rsquo;ve faced the significant challenge of rolling blackouts. Here&rsquo;s my journey, including the lessons learned, the solutions implemented, and my plans for the future.</p>
<h2 id="the-2-am-wake-up-call">The 2 AM Wake-Up Call</h2>
<p>My UPS alarm went off at 2 AM, and with only 15 minutes of power left, I failed to turn off my nodes in time, leading to an unsafe shutdown. I knew I needed to develop a more strategic solution.</p>
<h2 id="manual-solution-the-first-success">Manual Solution: The First Success</h2>
<p>I wrote an Ansible playbook that drained the Kubernetes nodes and safely shut them down. During the next blackout, this manual method worked seamlessly, shutting down everything in a controlled manner. But I wanted something more robust.</p>
<h2 id="transition-to-low-power-mode-essentials-stay-on">Transition to Low-Power Mode: Essentials Stay On</h2>
<p>Building upon my initial success, I optimized for a low-power mode that kept essential services running on a low-powered Celeron node, such as Home Assistant and Omada Controller. Additionally, a proxmox VM running OPNsense served as my backup firewall/router, providing critical connectivity. This allowed quick WiFi restoration and light control, creating a more resilient setup.</p>
<h2 id="custom-draining-explained">Custom Draining Explained</h2>
<p>Here&rsquo;s why I used specific options in the draining script:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">kubectl drain $node --force --delete-local-data --ignore-daemonsets --selector<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;essential!=true&#39;</span>
</code></pre></div><p>The <code>--force</code> and <code>--delete-local-data</code> options ensure the node drains without getting stuck, even if local data must be deleted.</p>
<h2 id="low-power-playbook-example">Low-Power Playbook Example</h2>
<p>Here&rsquo;s an excerpt from the playbook designed for low-power mode:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">- hosts: workers
  tasks:
    - name: Custom Drain worker nodes
      command: /path/to/custom-drain.sh <span style="color:#f92672">{{</span> inventory_hostname <span style="color:#f92672">}}</span>
    - name: Stop unnecessary worker nodes
      command: shutdown -h now
</code></pre></div><h2 id="future-plans-full-automation">Future Plans: Full Automation</h2>
<ol>
<li><strong>Monitor Power Status</strong>: Create a script that interfaces with the NUT server to keep an eye on power changes.</li>
<li><strong>Trigger Playbooks</strong>: Automate the execution of playbooks during a power outage.</li>
<li><strong>Reversing the Process</strong>: Develop a playbook to restore the system when power is back.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>From an initial struggle to an elegant manual solution, and finally to a plan for full automation, I&rsquo;ve turned the challenge of Bay Area&rsquo;s blackouts into an opportunity to innovate my home infrastructure. For those facing similar challenges, this journey proves that with ingenuity and the right technical approach, you can build a resilient system that thrives in uncertainty.</p>
]]></content>
        </item>
        
        <item>
            <title>Scratching That Culinary Itch Efficiently: nomad-diner.py</title>
            <link>https://jludwig.net/posts/nomad-diner/</link>
            <pubDate>Tue, 08 Aug 2023 14:41:17 -0700</pubDate>
            
            <guid>https://jludwig.net/posts/nomad-diner/</guid>
            <description>On vacation, and faced the usual dilemma: where to eat? I might side-eye Google for many reasons, but their data? Can&amp;rsquo;t deny it&amp;rsquo;s good. Given they&amp;rsquo;ve probably seen my plans via other household searches, I piped into their API for food intel. It&amp;rsquo;s &amp;ldquo;free&amp;rdquo; until you hit their limit. Here&amp;rsquo;s a script to fetch the nearby eats.
Introducing: nomad-diner
Features:  Location-based Searching: Drop an address or coordinates, and it spits out restaurants.</description>
            <content type="html"><![CDATA[<p>On vacation, and faced the usual dilemma: where to eat? I might side-eye Google for many reasons, but their data? Can&rsquo;t deny it&rsquo;s good. Given they&rsquo;ve probably seen my plans via other household searches, I piped into their API for food intel. It&rsquo;s &ldquo;free&rdquo; until you hit their limit. Here&rsquo;s a script to fetch the nearby eats.</p>
<p>Introducing: <a href="https://github.com/jludwig/nomad-diner/">nomad-diner</a></p>
<h2 id="features">Features:</h2>
<ul>
<li>Location-based Searching: Drop an address or coordinates, and it spits out restaurants.</li>
<li>Filters: Need at least a 4-star place? Or maybe you&rsquo;re on a budget? The script&rsquo;s got you covered.</li>
<li>Search Term: Fancy sushi or perhaps a burger joint? Toss in a keyword.</li>
<li>Driving ETA: If you think about driving, the script can give you a rough estimate of the time involved.</li>
</ul>
<h2 id="how-it-operates">How It Operates:</h2>
<ul>
<li>Coordinate Acquisition: The script accommodates both addresses and coordinates. Feed it an address, and it converts it into latitude and longitude.</li>
<li>Efficient Filtering: By setting max_results and distance, you can further refine the results to more manageable numbers.</li>
<li>Fetching the Essentials: Interacting with Google Places, the script curates a list of restaurants tailored to your criteria. For a comprehensive insight, it delves into detailed data for each establishment.</li>
<li>Drive Time Calculation with Haversine Distance: Before the script decides to fetch the estimated driving time, it employs the Haversine Distance formula as a preliminary check. If a place is, say, only 100 meters away, there’s little sense in calculating driving time. The eta_threshold option in the script ensures unnecessary API calls are avoided.</li>
</ul>
<h2 id="command-line-simplified">Command-line Simplified:</h2>
<p>The script runs from the command line. Here&rsquo;s a sample command:</p>
<pre><code>python script_name.py &quot;Tokyo&quot; --distance 5000 --min-rating 4.5 --max-price 2
</code></pre><p>This gets you restaurants within 5 kilometers of Tokyo, rated at least 4.5, with a price that won&rsquo;t break the bank.</p>
<h2 id="final-thought">Final Thought:</h2>
<p>Vacations should be about the experience, not not wrestling with meal choices. Hopefully this script helps someone else sidestep the food-finding fuss.</p>
]]></content>
        </item>
        
        <item>
            <title>Starting with Hugo: My tl;dr Notes</title>
            <link>https://jludwig.net/posts/hugo-tldr/</link>
            <pubDate>Mon, 07 Aug 2023 14:18:24 -0700</pubDate>
            
            <guid>https://jludwig.net/posts/hugo-tldr/</guid>
            <description>Creating a website with Hugo turned out to be a breeze. While I designed this platform to share my insights and chronicle my adventures, I&amp;rsquo;m relying heavily on Hugo&amp;rsquo;s official quick start guide for this tutorial. For those seeking a concise guide, let&amp;rsquo;s dive into how to craft a website using Hugo.
Why Hugo? Hugo boasts simplicity, speed, security, and ease of use. It&amp;rsquo;s essentially a Go binary that transforms content written in markdown into static HTML websites.</description>
            <content type="html"><![CDATA[<p>Creating a website with Hugo turned out to be a breeze. While I designed this platform to share my insights and chronicle my adventures, I&rsquo;m relying heavily on <a href="https://gohugo.io/getting-started/quick-start">Hugo&rsquo;s official quick start guide</a> for this tutorial. For those seeking a concise guide, let&rsquo;s dive into how to craft a website using Hugo.</p>
<h2 id="why-hugo">Why Hugo?</h2>
<p>Hugo boasts simplicity, speed, security, and ease of use. It&rsquo;s essentially a Go binary that transforms content written in markdown into static HTML websites. Its swiftness is unparalleled, and as for security – well, it&rsquo;s only as secure as its hosting environment. Given that it only presents static HTML and assets, Hugo lacks backend vulnerabilities.</p>
<h2 id="step-by-step-guide">Step-by-step Guide:</h2>
<h3 id="1-install-hugo">1. <strong>Install Hugo</strong></h3>
<p>The official installation instructions can be found <a href="https://gohugo.io/installation/">here</a>.</p>
<p>For those in a hurry, here&rsquo;s a tl;dr:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#75715e"># Linux</span>
sudo pacman -S hugo
sudo apt install hugo
<span style="color:#75715e"># ...etc</span>

<span style="color:#75715e"># Mac (or Linux)</span>
brew install hugo

<span style="color:#75715e"># Windows</span>
choco install hugo-extended

<span style="color:#75715e"># Snap</span>
sudo snap install hugo

<span style="color:#75715e"># With Go</span>
CGO_ENABLED<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> go install -tags extended github.com/gohugoio/hugo@latest
</code></pre></div><h3 id="2-create-a-site">2. <strong>Create a Site</strong></h3>
<p>The official step-by-step commands can be found <a href="https://gohugo.io/getting-started/quick-start/#commands">here</a>.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#75715e"># Creates a new site named &#34;quickstart&#34;</span>
hugo new site quickstart
cd quickstart
git init

<span style="color:#75715e"># Though I&#39;m not usually a fan of git submodules, it simplifies theme</span>
<span style="color:#75715e"># installation and updating.</span>
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke

<span style="color:#75715e"># Set &#39;ananke&#39; as your theme. The hugo.toml file is central to site</span>
<span style="color:#75715e"># configuration. Your options may vary depending on your chosen theme.</span>
echo <span style="color:#e6db74">&#34;theme = &#39;ananke&#39;&#34;</span> &gt;&gt; hugo.toml

<span style="color:#75715e"># Preview your site live. Use Ctrl+C to stop.</span>
hugo server
</code></pre></div><p>For a variety of themes, have a look at <a href="https://themes.gohugo.io/">Hugo&rsquo;s Official Themes Directory</a>.</p>
<h2 id="3-add-content">3. Add Content</h2>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">hugo new posts/amazing-post.md
vim posts/amazing-post.md
</code></pre></div><p>Now, simply write your content in markdown:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-markdown" data-lang="markdown">---
title: &#34;This post is simply amazing&#34;
date: 2023-08-07T14:40:00-08:00
draft: true
---

Okay, so there&#39;s a little &#34;metadata&#34; header that contains info about your post.
That&#39;s what&#39;s shown above and it&#39;s pretty self-explanatory.

<span style="color:#75715e">## Other than that, it&#39;s Just Markdown
</span><span style="color:#75715e"></span>
Markdown is a lightweight markup language designed for plain text formatting.

![<span style="color:#f92672">Sample Image</span>](<span style="color:#a6e22e">http://example.com/path/to/image.jpg</span>)

<span style="color:#75715e">## Main Content
</span><span style="color:#75715e"></span>
<span style="color:#75715e">### Subheading 1 You can **bold** text or _italicize_ it. 
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">-</span> Bullet Point 1
<span style="color:#66d9ef">-</span> Bullet Point 2
 <span style="color:#66d9ef">-</span> Nested Bullet Point

<span style="color:#75715e">### Subheading 2 Embed a link, like to this:
</span><span style="color:#75715e"></span>[<span style="color:#f92672">awesome website</span>](<span style="color:#a6e22e">http://www.example.com</span>), or incorporate quotes:
<span style="color:#66d9ef">
</span><span style="color:#66d9ef">&gt; </span><span style="font-style:italic">Highlight text using blockquotes – perfect for famous quotations or
</span><span style="font-style:italic"></span><span style="color:#66d9ef">&gt; </span><span style="font-style:italic">emphasizing text.
</span><span style="font-style:italic"></span>
<span style="color:#75715e">## Code Snippets Markdown can elegantly display code:
</span><span style="color:#75715e"></span>
\```python
def hello_world():
   print(&#34;Hello, world!&#34;)
\```

Note: I&#39;ve added backslashes before the triple backticks to prevent them from
prematurely terminating the code snippet in this context. When implementing,
remember to remove those backslashes.
</code></pre></div><h3 id="4-deploy">4. Deploy</h3>
<p>There are a myriad of deployment options. For a comprehensive list, check <a href="https://gohugo.io/hosting-and-deployment/">Hugo&rsquo;s official hosting and deployment recommendations</a>.</p>
<p>On a personal note, I&rsquo;ve hosted all my services with Kubernetes, making it a logical choice for this website too. I&rsquo;ll soon share a post detailing that process.</p>
]]></content>
        </item>
        
        <item>
            <title>Welcome to jludwig.net: Starting My Digital Chronicles</title>
            <link>https://jludwig.net/posts/welcome/</link>
            <pubDate>Sun, 06 Aug 2023 14:11:51 -0700</pubDate>
            
            <guid>https://jludwig.net/posts/welcome/</guid>
            <description>Greetings, digital explorers!
Ever wondered how the vast universe of a video game or the near-instantaneous transmission of messages across continents gets distilled into the simplicity of ones and zeros? That&amp;rsquo;s the question that started my lifelong journey into the realm of technology.
During my school days, I was handed the profound paper &amp;ldquo;On Computable Numbers, with an Application to the Entscheidungsproblem.&amp;rdquo; Although it was a deep dive, it piqued my curiosity about the world of computing.</description>
            <content type="html"><![CDATA[<p>Greetings, digital explorers!</p>
<p>Ever wondered how the vast universe of a video game or the near-instantaneous transmission of messages across continents gets distilled into the simplicity of ones and zeros? That&rsquo;s the question that started my lifelong journey into the realm of technology.</p>
<p>During my school days, I was handed the profound paper &ldquo;On Computable Numbers, with an Application to the Entscheidungsproblem.&rdquo; Although it was a deep dive, it piqued my curiosity about the world of computing. An interesting twist from this period was when a discerning teacher handed me an installation CD for Slackware. And guess what? My initial experiment inadvertently led to a fresh start—by wiping our family computer clean! 😅</p>
<p>But every cloud has a silver lining. This gave me a platform to deep-dive into Slackware. By 12, I was navigating through its complexities. My tech endeavors didn’t stop there. I embarked on adventures with BSD, OpenBeOS, MS-DOS, and more. Each challenge, each stumble, and each line of code added a chapter to my story.</p>
<p>Fast forward a few years, and my audacious exploration led me into the very depths of a school Mac&rsquo;s system. A little too deep, in fact, requiring a tech rescue mission by our school&rsquo;s IT squad. It was a humbling reminder of the responsibility that comes with knowledge.</p>
<p>From there, my professional path took me to Emotional Brain Training and later, BioRAFT. Here, I&rsquo;ve donned various hats, from a full-stack engineer to handling a Single Sign-On integration for millions globally. And now, 11 years later, my heart still races with every new tech challenge.</p>
<p>But hey, life isn’t just about work! My personal tech escapades have led me to set up a myriad of Kubernetes clusters:</p>
<ul>
<li><strong>External Cluster</strong>: My digital playground for internet-facing experiments.</li>
<li><strong>Private Cluster</strong>: Crafting digital solutions for the home front.</li>
<li><strong>Semi-Private Clusters</strong>: Melding the personal with the community, these serve friends, family, and a few entrepreneurial ventures.</li>
</ul>
<p>And the cherry on top? My &ldquo;non-prod&rdquo; cluster. It&rsquo;s where imagination takes flight, ideas are tested, and yes, sometimes things break. But that&rsquo;s all part of the journey!</p>
<p>Now, the million-dollar question: Why this blog? I&rsquo;ve always been a silent advocate for Free and Open Source Software (FOSS), keeping my tech adventures close to my chest. But it&rsquo;s time to share! Here, I aim to:</p>
<ul>
<li>Share lessons from the trenches of tech.</li>
<li>Offer a window into my digital wonderland.</li>
<li>Provide insights, musings, and (hopefully) helpful code.</li>
<li>Spark that tech flame in some of you.</li>
</ul>
<p>As the curtain rises on this digital chronicle, I invite you to join me. Whether you&rsquo;re a seasoned tech guru, a budding enthusiast, or just plain curious, there&rsquo;s a spot for you here. So, settle in, grab your drink of choice, and let&rsquo;s kick off this journey together.</p>
]]></content>
        </item>
        
    </channel>
</rss>
