<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>funinkina's corner</title><link>https://funinkina.co.in/</link><description>Recent content on funinkina's corner</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 01 Jun 2026 00:00:00 +0530</lastBuildDate><atom:link href="https://funinkina.co.in/index.xml" rel="self" type="application/rss+xml"/><item><title>Aryan Kushwaha</title><link>https://funinkina.co.in/hire-me/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0530</pubDate><guid>https://funinkina.co.in/hire-me/</guid><description>&lt;p&gt;&lt;a href="https://funinkina.co.in" target="_blank" rel="noreferrer nofollow"&gt;funinkina.co.in&lt;/a&gt;
 · &lt;a href="mailto:hello@funinkina.co.in" &gt;hello@funinkina.co.in&lt;/a&gt;
 · &lt;a href="https://github.com/funinkina" target="_blank" rel="noreferrer nofollow"&gt;github.com/funinkina&lt;/a&gt;
 · &lt;a href="https://linkedin.com/in/funinkina" target="_blank" rel="noreferrer nofollow"&gt;linkedin.com/in/funinkina&lt;/a&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Backend and systems engineer in &lt;strong&gt;Go, Python, and C/C++&lt;/strong&gt;, with production experience across &lt;strong&gt;real-time LLM infrastructure&lt;/strong&gt;, &lt;strong&gt;voice agent backends&lt;/strong&gt;, and low-level systems work including &lt;strong&gt;device drivers&lt;/strong&gt; and &lt;strong&gt;Linux kernel&lt;/strong&gt; contributions. Track record of measurable impact: &lt;strong&gt;80%&lt;/strong&gt; voice latency reduction, &lt;strong&gt;5× inference speedup&lt;/strong&gt;, and &lt;strong&gt;60% cost savings&lt;/strong&gt;. Also writes technical blogs on &lt;strong&gt;Linux&lt;/strong&gt;, &lt;strong&gt;open source&lt;/strong&gt;, and &lt;strong&gt;computer science&lt;/strong&gt; with &lt;strong&gt;1000+&lt;/strong&gt; monthly readers.&lt;/p&gt;
&lt;h2 id="experience"&gt;Experience&lt;/h2&gt;
&lt;h3 id="backend-ai-intern--zyka-ai"&gt;Backend AI Intern — Zyka AI&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Remote · April 2026 – July 2026&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Reverse Engineering A Printer Driver For Linux</title><link>https://funinkina.co.in/blog/reverse-engineering-a-printer-driver-for-linux/</link><pubDate>Sun, 17 May 2026 02:40:34 +0530</pubDate><guid>https://funinkina.co.in/blog/reverse-engineering-a-printer-driver-for-linux/</guid><description>&lt;h2 id="context"&gt;Context&lt;/h2&gt;
&lt;p&gt;I have this &lt;strong&gt;Ricoh SP 200&lt;/strong&gt; printer, a simple and cheap black-and-white laser printer. The issue is that the official drivers are only available for Windows. CUPS on Linux is excellent and supports most printers out of the box, so naturally I tried everything: foo2zjs, OpenPrinting, HPLIP, Gutenprint. Nothing. This printer is truly one of a kind in the worst possible way.&lt;/p&gt;
&lt;p&gt;My only option was a Windows VM with USB passthrough, which worked but required booting into a VM just to print something. So I decided to take matters into my own hands and write the driver myself. How hard could it be?&lt;/p&gt;</description></item><item><title>Deadenv</title><link>https://funinkina.co.in/projects/deadenv/</link><pubDate>Sat, 16 May 2026 00:09:59 +0530</pubDate><guid>https://funinkina.co.in/projects/deadenv/</guid><description>&lt;p&gt;Every developer I know has a &lt;code&gt;.env&lt;/code&gt; file they shouldn&amp;rsquo;t. Maybe it has a production API key. Maybe it&amp;rsquo;s tracked in git with a &lt;code&gt;.gitignore&lt;/code&gt; entry that someone forgot to add. Maybe it&amp;rsquo;s just sitting there, world-readable, on a shared dev machine. We all know it&amp;rsquo;s bad. We keep doing it anyway because there&amp;rsquo;s no real alternative that doesn&amp;rsquo;t add significant friction.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;deadenv&lt;/code&gt; is my attempt to fix that. It&amp;rsquo;s a cross-platform CLI tool written in Go that stores secrets in the OS-native keychain: Keychain on macOS, libsecret/GNOME Keyring on Linux, Credential Manager on Windows, and injects them into subprocesses at runtime. Secrets never touch the filesystem in plaintext.&lt;/p&gt;</description></item><item><title>Contributing to the Linux Kernel</title><link>https://funinkina.co.in/blog/contributing-to-the-linux-kernel/</link><pubDate>Sun, 10 May 2026 23:27:20 +0530</pubDate><guid>https://funinkina.co.in/blog/contributing-to-the-linux-kernel/</guid><description>&lt;p&gt;I have been running Linux on my HP Pavilion Plus Laptop 14-eh0xxx since 2022, and inevitably, as with most Linux installations, some things will not work perfectly with your hardware.&lt;/p&gt;
&lt;p&gt;Initially there were a few rough edges, like the fingerprint scanner and the mute LED on the function key. The mute button itself worked, but the small orange LED that should indicate the muted state did not. My knowledge of how to fix these kinds of issues was very limited back then, so I just decided to live with it.&lt;/p&gt;</description></item><item><title>Audio Formats and Voice Agents</title><link>https://funinkina.co.in/blog/audio-formats-and-voice-agents/</link><pubDate>Sat, 26 Jul 2025 12:38:47 +0530</pubDate><guid>https://funinkina.co.in/blog/audio-formats-and-voice-agents/</guid><description>&lt;h2 id="a-little-backstory"&gt;A little backstory&lt;/h2&gt;
&lt;p&gt;So for those of you who don&amp;rsquo;t know, I have been working as a Backend and AI engineer at &lt;a href="https://superdash.ai/" target="_blank" rel="noreferrer nofollow"&gt;Superdash&lt;/a&gt;
 for two weeks at the time I am writing this. And so far, I have worked on voice based AI agents and made them sound more natural. And, I&amp;rsquo;m sharing whatever I have scratched my head for. You can use this as a extra reading material while building anything related to voice based communication over the internet.&lt;/p&gt;</description></item><item><title>SSH for Noobs</title><link>https://funinkina.co.in/blog/ssh-for-noobs/</link><pubDate>Mon, 19 May 2025 21:51:21 +0530</pubDate><guid>https://funinkina.co.in/blog/ssh-for-noobs/</guid><description>&lt;p&gt;Many of you must have worked with AWS or GCP at some point, and even if you were scared of the terminals, you might have been forced to use it. And you also must have accessed the terminal of your service from your local terminal. But wait, how is that possible? How can you access the console of another system from your own?&lt;/p&gt;
&lt;h2 id="the-answer-ssh"&gt;&lt;strong&gt;The answer: SSH&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;So, what SSH actually is, and how can you use it effectively without just copy-pasting commands from the internet? Let&amp;rsquo;s explore that in this blog post.&lt;/p&gt;</description></item><item><title>Weekly Commits</title><link>https://funinkina.co.in/projects/weekly-commits/</link><pubDate>Wed, 14 May 2025 00:30:42 +0530</pubDate><guid>https://funinkina.co.in/projects/weekly-commits/</guid><description>&lt;h1 id="weekly-commits-gnome-extension--visualize-your-github-activity-right-from-the-top-bar"&gt;Weekly Commits GNOME Extension — Visualize Your GitHub Activity Right from the Top Bar&lt;/h1&gt;
&lt;h2 id="why-i-built-this"&gt;Why I Built This&lt;/h2&gt;
&lt;p&gt;As developers, we spend hours coding, committing, and pushing changes — but rarely do we take a moment to reflect on our consistency. While GitHub contribution graphs are nice, they live on a webpage, buried behind a few clicks.&lt;/p&gt;
&lt;p&gt;I wanted something more &lt;em&gt;immediate&lt;/em&gt; and &lt;em&gt;minimal&lt;/em&gt;. I wanted to see my GitHub commit activity at a glance — right from my GNOME desktop environment. So I built &lt;strong&gt;Weekly Commits&lt;/strong&gt;, a GNOME Shell extension that brings your GitHub commit stats to your system&amp;rsquo;s top bar.&lt;/p&gt;</description></item><item><title>Why you should be a part of open source?</title><link>https://funinkina.co.in/blog/why-you-should-be-a-part-of-open-source/</link><pubDate>Sun, 04 May 2025 13:16:23 +0530</pubDate><guid>https://funinkina.co.in/blog/why-you-should-be-a-part-of-open-source/</guid><description>&lt;p&gt;As a computer science student, you&amp;rsquo;ve likely encountered the terms &amp;ldquo;open source software&amp;rdquo; or &amp;ldquo;free software&amp;rdquo; while working on projects. But what exactly does open source mean, and why should it matter to you? Let&amp;rsquo;s explore that in this post.&lt;/p&gt;
&lt;h2 id="what-does-open-source-stand-for"&gt;What Does Open Source Stand For?&lt;/h2&gt;
&lt;p&gt;Technically, open source software (OSS) refers to software whose &lt;em&gt;source code is publicly available, allowing anyone to view, modify, and redistribute it freely, often under specific &lt;a href="https://opensource.org/licenses/" target="_blank" rel="noreferrer nofollow"&gt;open source licenses&lt;/a&gt;
&lt;/em&gt;. However, open source is more than just a technical standard; it&amp;rsquo;s a philosophy. It benefits a wide range of people, not just programmers – even if you&amp;rsquo;ve never written a line of code, you likely benefit from OSS every day.&lt;/p&gt;</description></item><item><title>MCP: Giving LLMs Hands (and Tools)</title><link>https://funinkina.co.in/blog/mcp-giving-llms-hands-and-tools/</link><pubDate>Wed, 16 Apr 2025 14:37:16 +0530</pubDate><guid>https://funinkina.co.in/blog/mcp-giving-llms-hands-and-tools/</guid><description>&lt;h2 id="why-the-hype"&gt;Why the hype?&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve all faced the task of writing professional emails and sending personalized versions to multiple recipients. While ChatGPT can help draft the email, it would be even more efficient if the entire process, including sending personalized emails to each recipient, could be automated. Imagine your LLM handling the entire task for you – this is where MCP comes in.&lt;/p&gt;
&lt;p&gt;For example, suppose you&amp;rsquo;re a marketing manager launching a new product. You need to email different customer segments with tailored messages highlighting the product features most relevant to them. Or, imagine you&amp;rsquo;re a recruiter sending personalized follow-up emails to candidates after an interview, referencing specific points discussed. MCP enables these kinds of automated, personalized communications, saving you time and improving engagement.&lt;/p&gt;</description></item><item><title>RSync Backup Script</title><link>https://funinkina.co.in/projects/rsync-backup/</link><pubDate>Mon, 31 Mar 2025 20:45:51 +0530</pubDate><guid>https://funinkina.co.in/projects/rsync-backup/</guid><description>&lt;p&gt;This is a simple, customizable shell script designed to help users back up specific parts of their home directory to an external drive. It leverages the power of the &lt;code&gt;rsync&lt;/code&gt; command for efficient file synchronization.&lt;/p&gt;
&lt;h3 id="github-repository-funinkinarsync-backup-script"&gt;GitHub Repository: &lt;a href="https://github.com/funinkina/rsync-backup-script" target="_blank" rel="noreferrer nofollow"&gt;funinkina/rsync-backup-script&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Since it is just a script, you can just copy from here&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List the FOLDER NAMES within your home directory you want to back up.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Do NOT include the full path, just the name relative to $HOME.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Example: SOURCE_DIRS=(&amp;#34;Documents&amp;#34; &amp;#34;Pictures&amp;#34; &amp;#34;Projects&amp;#34; &amp;#34;.config/some_app&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SOURCE_DIRS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Academics&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;assets&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Codes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Documents&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dotfiles&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Pictures&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Hackathons&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Notes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Projects&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.mozilla&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.ssh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Add more directories here...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# &amp;#34;.config&amp;#34; # Be careful with large hidden dirs, they might contain caches too&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# &amp;#34;.local/share/some_app&amp;#34; # Example of nested path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --- !!! IMPORTANT: External Disk Path !!! ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Example: DEST_BASE_DIR=&amp;#34;/media/your_username/MyExternalUSB/Backups&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ensure this directory exists and you have write permissions.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEST_BASE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/mnt&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;&amp;lt;&amp;lt; --- CHANGE THIS ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --- !!! IMPORTANT: Destination Subfolder Name !!! ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Define the name of the FOLDER *INSIDE* DEST_BASE_DIR where this specific backup will go.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Leave empty to use the default (current date and time).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Example 1 (Fixed Name): DEST_SUBFOLDER_NAME=&amp;#34;MyHomeBackup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Example 2 (Date Based): DEST_SUBFOLDER_NAME=&amp;#34;backup_$(date +%Y-%m-%d)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Default (Date &amp;amp; Time):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;_DEFAULT_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;backup_&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y-%m-%d_%H-%M-%S&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEST_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;archlinux_backup&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;&amp;lt;&amp;lt; --- SET YOUR DESIRED FOLDER NAME HERE, OR LEAVE EMPTY FOR DEFAULT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List of directory NAMES to exclude. These will be excluded wherever they appear.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;EXCLUDE_DIRS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;node_modules&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;venv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.venv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;__pycache__&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Cache&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.cache&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dist&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.gradle&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;target&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.DS_Store&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Thumbs.db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.Trash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*-cache&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.npm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;.yarn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;DEST_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$_DEFAULT_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;INFO: Using default destination subfolder name: &lt;/span&gt;&lt;span class="nv"&gt;$DEST_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FULL_DEST_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$DEST_SUBFOLDER_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/path/to/your/external/disk/backup_area&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: Please configure the &amp;#39;DEST_BASE_DIR&amp;#39; variable in this script.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: Base destination directory &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; not found.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Please ensure the external disk is mounted and the path is correct.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -w &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: Base destination directory &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_BASE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; is not writable.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Please check permissions.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RSYNC_EXCLUDES&lt;/span&gt;&lt;span class="o"&gt;=()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; dir in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EXCLUDE_DIRS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;RSYNC_EXCLUDES&lt;/span&gt;&lt;span class="o"&gt;+=(&lt;/span&gt;--exclude&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RSYNC_OPTS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;-av --progress --delete &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RSYNC_EXCLUDES&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RSYNC_OPTS=(-av --progress &amp;#34;${RSYNC_EXCLUDES[@]}&amp;#34;) # Default: Safer without --delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Attempting to create destination folder: &lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; -ne &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: Failed to create destination folder &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Please check permissions and path validity.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Destination folder ready.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;===========================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Starting Backup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Source Base: &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Destination: &lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Excluded Directories: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EXCLUDE_DIRS&lt;/span&gt;&lt;span class="p"&gt;[*]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;===========================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;processed_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEST_PARENT_FOR_RSYNC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; src_dir in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_DIRS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;SOURCE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$src_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--- Processing: &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$src_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; ---&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WARNING: Source &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; does not exist. Skipping.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--------------------------------------&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Running: rsync &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RSYNC_OPTS&lt;/span&gt;&lt;span class="p"&gt;[*]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; \&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_PATH&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34; \&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_PARENT_FOR_RSYNC&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rsync &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RSYNC_OPTS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DEST_PARENT_FOR_RSYNC&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;rsync_exit_status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$rsync_exit_status&lt;/span&gt; -ne &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ERROR: rsync failed for &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; with exit code &lt;/span&gt;&lt;span class="nv"&gt;$rsync_exit_status&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;errors &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Successfully processed &amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$src_dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;processed_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;processed_count &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--------------------------------------&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;===========================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Backup Finished&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$errors&lt;/span&gt; -gt &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WARNING: Encountered &lt;/span&gt;&lt;span class="nv"&gt;$errors&lt;/span&gt;&lt;span class="s2"&gt; errors during backup.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Processed &lt;/span&gt;&lt;span class="nv"&gt;$processed_count&lt;/span&gt;&lt;span class="s2"&gt; directories successfully before errors or completion.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Backup located at: &lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;All specified source directories (&lt;/span&gt;&lt;span class="nv"&gt;$processed_count&lt;/span&gt;&lt;span class="s2"&gt;) processed successfully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Backup complete in: &lt;/span&gt;&lt;span class="nv"&gt;$FULL_DEST_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;===========================================&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="how-it-is-built"&gt;How it is built&lt;/h1&gt;
&lt;p&gt;The project is implemented as a standard &lt;strong&gt;shell script&lt;/strong&gt;. It utilizes the command-line utility &lt;strong&gt;&lt;code&gt;rsync&lt;/code&gt;&lt;/strong&gt; as its core engine for performing the backup operations, known for its efficiency in handling file transfers and synchronizations. The script is designed to be &lt;strong&gt;highly customizable&lt;/strong&gt; by directly editing its contents, facilitated by being &amp;ldquo;well commented&amp;rdquo; to guide users in modifying parameters like source folders, excluded paths, and the backup destination.&lt;/p&gt;</description></item><item><title>Query MD</title><link>https://funinkina.co.in/projects/query-md/</link><pubDate>Fri, 28 Mar 2025 20:37:57 +0530</pubDate><guid>https://funinkina.co.in/projects/query-md/</guid><description>&lt;p&gt;QueryMD is an AI-powered application designed to help users interact with and query their personal markdown notes. It allows you to ask questions and search your notes using natural language, leveraging the power of large language models.&lt;/p&gt;
&lt;h3 id="github-repository-funinkinaquerymd"&gt;GitHub Repository: &lt;a href="https://github.com/funinkina/QueryMD" target="_blank" rel="noreferrer nofollow"&gt;funinkina/QueryMD&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/funinkina/QueryMD/raw/main/Screenshot.png" alt="Screenshot" loading="lazy"&gt;&lt;/p&gt;
&lt;h2 id="main-usage-of-this"&gt;Main usage of this?&lt;/h2&gt;
&lt;p&gt;If you are like me, who writes all their notes using markdown that is locally stored, this tool will be super handy. I use it frequently to manage and search some obscure reference I wrote somewhere.&lt;/p&gt;</description></item><item><title>Bloop</title><link>https://funinkina.co.in/projects/bloop/</link><pubDate>Wed, 12 Mar 2025 19:43:31 +0530</pubDate><guid>https://funinkina.co.in/projects/bloop/</guid><description>&lt;p&gt;Bloop is a web application designed to analyze exported WhatsApp chat files, offering insights into conversation dynamics, popular words, user activity, and more. It provides a comprehensive look into your chat history.&lt;/p&gt;
&lt;h3 id="try-it-live-at--bloopitvercelapp"&gt;Try it live at:   &lt;a href="https://bloopit.vercel.app" target="_blank" rel="noreferrer nofollow"&gt;bloopit.vercel.app&lt;/a&gt;
&lt;/h3&gt;
&lt;h3 id="the-github-repos-backend-frontend"&gt;The GitHub Repos: &lt;a href="https://github.com/funinkina/whatsappchatanalyzer/" target="_blank" rel="noreferrer nofollow"&gt;Backend&lt;/a&gt;
 &lt;a href="https://github.com/funinkina/bloop-frontend" target="_blank" rel="noreferrer nofollow"&gt;Frontend&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://bloopit.vercel.app" target="_blank" rel="noreferrer nofollow"&gt;&lt;picture&gt;
 &lt;source srcset="https://funinkina.co.in/blog-assets/bloop-demo_hu_9a1a09f08300b380.webp" type="image/webp"&gt;
 &lt;img src="https://funinkina.co.in/blog-assets/bloop-demo_hu_5871f1506ac67137.png" alt="bloop demo"
 width="800" height="458" loading="lazy" decoding="async"&gt;
&lt;/picture&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id="how-it-is-built"&gt;How it is built&lt;/h2&gt;
&lt;p&gt;The backend of Bloop is built with &lt;strong&gt;GoLang&lt;/strong&gt; using the &lt;strong&gt;Gin framework&lt;/strong&gt;. GoLang was chosen for its speed and lightweight nature. Gin is utilized for its high performance and efficiency in handling a large number of requests, making the server suitable for potentially high-traffic scenarios. The frontend is developed using &lt;strong&gt;Next.js&lt;/strong&gt;, a popular React framework, chosen for its capabilities in building fast, scalable, and SEO-friendly web applications.&lt;/p&gt;</description></item><item><title>Building OCR in Plasma's Spectacle using C++</title><link>https://funinkina.co.in/blog/building-ocr-in-plasmas-spectacle-using-c/</link><pubDate>Wed, 12 Mar 2025 13:10:15 +0530</pubDate><guid>https://funinkina.co.in/blog/building-ocr-in-plasmas-spectacle-using-c/</guid><description>&lt;h2 id="-the-why"&gt;🔍 The Why?&lt;/h2&gt;
&lt;p&gt;A while ago I made a python script that achieved the same goal but in GNOME desktop environment. You can read more about it &lt;a href="https://funinkina.xyz/blog/enhancing-screenshots-in-gnome-with-ocr/" target="_blank" rel="noreferrer nofollow"&gt;here&lt;/a&gt;
. That also uses &lt;em&gt;Tesseract&lt;/em&gt; to extract the text and displays a GTK window to copy or save. But recently, I switched to KDE Plasma and I wanted to have the same functionality in Spectacle, the default screenshot tool in KDE Plasma. So I decided to write one for KDE Plasma too.&lt;/p&gt;</description></item><item><title>Spectacle Ocr Screenshot</title><link>https://funinkina.co.in/projects/spectacle-ocr-screenshot/</link><pubDate>Tue, 11 Mar 2025 20:13:54 +0530</pubDate><guid>https://funinkina.co.in/projects/spectacle-ocr-screenshot/</guid><description>&lt;p&gt;Spectacle OCR Screenshot is a straightforward Qt application designed for the KDE desktop environment. It integrates seamlessly with KDE&amp;rsquo;s native Spectacle screenshot tool to enable users to quickly extract text and decode QR codes directly from captured screen regions.&lt;/p&gt;
&lt;h3 id="github-repository-funinkinaspectacle-ocr-screenshot"&gt;GitHub Repository: &lt;a href="https://github.com/funinkina/spectacle-ocr-screenshot" target="_blank" rel="noreferrer nofollow"&gt;funinkina/spectacle-ocr-screenshot&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/funinkina/spectacle-ocr-screenshot/raw/main/screenshot.png" alt="Screenshot" loading="lazy"&gt;&lt;/p&gt;
&lt;h2 id="why-i-made-this"&gt;Why I made this?&lt;/h2&gt;
&lt;p&gt;Oftentimes I needed to copy a error or debug message from the screen but it won&amp;rsquo;t be in a nice text box, so i decided to make this simple utility to do that for me. Basically the same tool as &lt;a href="https://github.com/funinkina/Gnome-OCR-Screenshot" target="_blank" rel="noreferrer nofollow"&gt;funinkina/Gnome-OCR-Screenshot&lt;/a&gt;
 but for KDE desktop.&lt;/p&gt;</description></item><item><title>Terminal Emulators: Under the Hood</title><link>https://funinkina.co.in/blog/terminal-emulators-under-the-hood/</link><pubDate>Tue, 25 Feb 2025 11:44:45 +0530</pubDate><guid>https://funinkina.co.in/blog/terminal-emulators-under-the-hood/</guid><description>&lt;h2 id="a-little-overview-about-terminals"&gt;A little overview about terminals&lt;/h2&gt;
&lt;p&gt;As a developer, you must have gotten your hands dirty with terminal emulators at some point in your career. They are powerful tools that allow you to interact with your operating system and run commands from the command line. You might think that it is just text in a black box, but it&amp;rsquo;s much more than that.&lt;/p&gt;
&lt;p&gt;You see, in the early days of computing, a computer was literally a green/white text on a black background. This you can say is a true computer, you give some input, and you get some output. But as time went on, we moved on from that and started using graphical user interfaces (GUIs). GUIs allowed us to interact with our computers using a mouse and a keyboard, but they were not as powerful as terminal emulators. Behind the scenes, a GUI is just executing commands that we used to enter manually in the terminal.&lt;/p&gt;</description></item><item><title>A beginner's guide to Linux</title><link>https://funinkina.co.in/blog/a-beginners-guide-to-linux/</link><pubDate>Thu, 20 Feb 2025 15:45:33 +0530</pubDate><guid>https://funinkina.co.in/blog/a-beginners-guide-to-linux/</guid><description>&lt;h2 id="-why-this-guide"&gt;📝 Why this guide?&lt;/h2&gt;
&lt;p&gt;When I first heard about Linux, I jumped headfirst into it. All I did was a few minutes of Googling about what it is, and how to install it. And for a short while, it works, but the moment you want to do more with it, you will use the things you learned from Windows or macOS and that has a high chance of breaking your system. This guide aims to help you understand the basics of linux and how to use it effectively. And more importantly, it will help you avoid common mistakes that can lead to system crashes or data loss. All those mistakes in the beginning broke my system so many times that I gave up on Linux for a while, then one day, I decided to do a good research and found out that Linux is not as hard as it seems. I started learning Linux again and now I can confidently say &amp;ldquo;I use Arch btw&amp;rdquo;. My aim with this guide is to make people know how to use linux effectively that most YouTube tutorials or online posts won&amp;rsquo;t tell you.&lt;/p&gt;</description></item><item><title>Enhancing Screenshots in GNOME with OCR</title><link>https://funinkina.co.in/blog/enhancing-screenshots-in-gnome-with-ocr/</link><pubDate>Thu, 06 Feb 2025 22:57:22 +0530</pubDate><guid>https://funinkina.co.in/blog/enhancing-screenshots-in-gnome-with-ocr/</guid><description>&lt;p&gt;A while ago, I was working on a project, and the way error was being displayed, I could not copy the text directly to paste it in ChatGPT. I had to type the whole error message manually, which was a bit frustrating. I thought, what if I could just take a screenshot and extract the text from the image directly? That&amp;rsquo;s when I decided to enhance GNOME Screenshot with OCR. I mean windows snipping tool has this feature, why not GNOME Screenshot?&lt;/p&gt;</description></item><item><title>Gnome OCR Screenshot</title><link>https://funinkina.co.in/projects/gnome-ocr-screenshot/</link><pubDate>Thu, 06 Feb 2025 20:04:01 +0530</pubDate><guid>https://funinkina.co.in/projects/gnome-ocr-screenshot/</guid><description>&lt;p&gt;GNOME Screenshot OCR is a simple, native tool for the GNOME desktop environment that allows users to instantly extract text or scan QR codes directly from a selected area of their screen via a screenshot.&lt;/p&gt;
&lt;h3 id="github-repository-funinkinagnome-ocr-screenshot"&gt;GitHub Repository: &lt;a href="https://github.com/funinkina/Gnome-OCR-Screenshot" target="_blank" rel="noreferrer nofollow"&gt;funinkina/Gnome-OCR-Screenshot&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/funinkina/Gnome-OCR-Screenshot/raw/main/screenshot.png" alt="Screenshot Demo" loading="lazy"&gt;&lt;/p&gt;
&lt;h2 id="why-i-made-this"&gt;Why I made this?&lt;/h2&gt;
&lt;p&gt;Oftentimes I needed to copy a error or debug message from the screen but it won&amp;rsquo;t be in a nice text box, so i decided to make this simple utility to do that for me.&lt;/p&gt;</description></item><item><title>The Way of Arch</title><link>https://funinkina.co.in/blog/the-way-of-arch/</link><pubDate>Mon, 03 Feb 2025 10:14:53 +0530</pubDate><guid>https://funinkina.co.in/blog/the-way-of-arch/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If it&amp;rsquo;s not clear by now, I use arch btw. But you might ask, why arch linux, what&amp;rsquo;s so special about it. After years of distro hopping I have realized what makes arch linux special, Its minimalism is its strength—allowing infinite customization to fit any workflow. It can be tweaked infinitely to your needs, regardless of the kind of work you do. Even if you are not an engineer, it will serve you pretty well instead of getting in your way. Though this guide is mainly targeted towards programmers. Starting with arch linux seems kinds daunting isn&amp;rsquo;t it? I mean the &lt;a href="https://wiki.archlinux.org/title/Installation_guide" target="_blank" rel="noreferrer nofollow"&gt;CLI installation&lt;/a&gt;
 might indeed throw off a beginner from trying arch. But then you realise it&amp;rsquo;s actually just copy pasting commands from the internet and pasting into your terminal. (Honestly, you should not run unknown scripts off of the internet without verifying).&lt;/p&gt;</description></item><item><title>Running Deepseek on Raspberry Pi</title><link>https://funinkina.co.in/blog/running-deepseek-on-raspberry-pi/</link><pubDate>Fri, 31 Jan 2025 23:42:36 +0530</pubDate><guid>https://funinkina.co.in/blog/running-deepseek-on-raspberry-pi/</guid><description>&lt;p&gt;Let&amp;rsquo;s start by addressing the elephant in the room, why? Why would I run a freaking Large Language Model on a 4-core arm processor with 4GB of RAM? Well, why not? I have a Raspberry Pi 4 lying around and I wanted to see if I could run Deepseek on it. (Also cause free content for the blog). Before starting, let me say, I have absolutely zero expectations from this experiment. I am not expecting it to work, I am not expecting it to be fast, I am not expecting it to be usable. I am just doing it because I can. So, let&amp;rsquo;s get started.&lt;/p&gt;</description></item><item><title>Explaining Inodes In Linux</title><link>https://funinkina.co.in/blog/explaining-inodes-in-linux/</link><pubDate>Mon, 27 Jan 2025 23:05:52 +0530</pubDate><guid>https://funinkina.co.in/blog/explaining-inodes-in-linux/</guid><description>&lt;h2 id="what-are-inodes"&gt;What are Inodes?&lt;/h2&gt;
&lt;p&gt;If you are a linux user, you must have encountered some kind &lt;code&gt;Insufficient Permission&lt;/code&gt; or &lt;code&gt;File not found&lt;/code&gt; errors. These errors are usually caused by the filesystem structure of linux. Ever wondered from where Linux reads these properties of a file? Also if you use symlinks (shortcuts if you are coming from windows) to a file, how is it resolved internally? When I was a beginner, I used to think that Linux reads these properties from the file itself. But then where are these properties stored in the file? It turns out, that&amp;rsquo;s not the case. Linux reads these properties from a data structure called &lt;code&gt;Inode&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Simplifying Package installation on Arch Linux</title><link>https://funinkina.co.in/blog/simplifying-package-installation-on-arch-linux/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><guid>https://funinkina.co.in/blog/simplifying-package-installation-on-arch-linux/</guid><description>&lt;p&gt;All of us in the &amp;ldquo;Arch Btw&amp;rdquo; cult use it for one of its main selling points, the repositories. Arch Linux&amp;rsquo;s pragmatic approach to its packages makes it so much easier for users to sync packages without fiddling with multiple repositories and dependency hell, making it a one-stop solution. The Arch User Repository (AUR) is just a cherry on top. Including packages submitted by users makes it even more complete, removing the need for flatpaks or snaps. (Might cause dependency issues, we will discuss this later).&lt;/p&gt;</description></item><item><title>DEM Super Resolution</title><link>https://funinkina.co.in/projects/dem-super-resolution/</link><pubDate>Tue, 30 Jul 2024 20:52:14 +0530</pubDate><guid>https://funinkina.co.in/projects/dem-super-resolution/</guid><description>&lt;h2 id="project-description"&gt;Project Description&lt;/h2&gt;
&lt;p&gt;This project explores upscaling of Digital Elevation Model (DEM) data using a state-of-the-art super-resolution model. The model used is from the 2023 paper, &lt;em&gt;&amp;ldquo;A Global-Information-Constrained Deep Learning Network for Digital Elevation Model Super-Resolution.&amp;rdquo;&lt;/em&gt;. For more details and original implementation see the &lt;a href="https://www.mdpi.com/2072-4292/15/2/305" target="_blank" rel="noreferrer nofollow"&gt;paper&lt;/a&gt;
.
The article demonstrated the model&amp;rsquo;s ability in enhancing the resolution of DEM data beyond traditional bicubic interpolation methods, which are often considered the baseline to beat for super-resolution models on DEM data.&lt;/p&gt;</description></item><item><title>Manjaro Minimal Bootsplash</title><link>https://funinkina.co.in/projects/manjaro-minimal-bootsplash/</link><pubDate>Thu, 16 Jun 2022 21:01:12 +0530</pubDate><guid>https://funinkina.co.in/projects/manjaro-minimal-bootsplash/</guid><description>&lt;p&gt;Manjaro Minimal Bootsplash is a custom theme for Plymouth, the graphical boot splash system used in many Linux distributions, specifically tailored for Manjaro Linux. It aims to provide a cleaner, more minimal look during the system boot process.&lt;/p&gt;
&lt;h3 id="github-repository-funinkinamanjaro-minimal-bootsplash"&gt;GitHub Repository: &lt;a href="https://github.com/funinkina/manjaro-minimal-bootsplash" target="_blank" rel="noreferrer nofollow"&gt;funinkina/manjaro-minimal-bootsplash&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/funinkina/manjaro-minimal-bootsplash/raw/main/preview.gif" alt="Screenshot" loading="lazy"&gt;&lt;/p&gt;
&lt;h2 id="how-it-is-built"&gt;How it is built&lt;/h2&gt;
&lt;p&gt;This project is essentially a &lt;strong&gt;Plymouth theme&lt;/strong&gt; package. It includes &lt;strong&gt;shell scripts (&lt;code&gt;bootsplash-minimal.sh&lt;/code&gt;, &lt;code&gt;bootsplash-packer&lt;/code&gt;)&lt;/strong&gt; used to generate necessary files (like an STL model, which is part of the bootsplash mechanism) and assist in packaging. The theme itself defines how visual elements like the logo and spinner are displayed during boot. It&amp;rsquo;s designed to be built and installed as an &lt;strong&gt;Arch Linux package&lt;/strong&gt; using &lt;code&gt;makepkg&lt;/code&gt;, integrating into Manjaro&amp;rsquo;s package management system. The visual assets, particularly the spinner, were based on graphics from Preloaders.net and further modified. Installation involves modifying system configuration files like &lt;code&gt;/etc/mkinitcpio.conf&lt;/code&gt; and &lt;code&gt;/etc/default/grub&lt;/code&gt; to activate the theme.&lt;/p&gt;</description></item></channel></rss>