<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss">
  <channel>
    <title>Linux/FOSS and beyond</title>
    <link>https://janjic.lol/</link>
    <description>Recent content on Linux/FOSS and beyond</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 03 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://janjic.lol/index.xml" rel="self" type="application/rss+xml" /><icon>https://janjic.lol/img/icon.svg</icon>
    
    
    <item>
      <title>Automounting Seagate Disks on Fedora (Beginner Friendly Guide)</title>
      <link>https://janjic.lol/posts/automount-disks-on-fedora/</link>
      <pubDate>Tue, 03 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>https://janjic.lol/posts/automount-disks-on-fedora/</guid>
      <description><![CDATA[<blockquote>
<p>🟢 <strong>Beginner Friendly Guide</strong></p>
<p>This article explains everything step-by-step.<br>
If you are new to Linux disk management, don&rsquo;t worry &mdash; we&rsquo;ll go
slowly and explain what each command does.</p>
</blockquote>
<hr>
<h1 id="what-we-are-trying-to-achieve">What We Are Trying To Achieve</h1>
<p>We have two external ext4 Seagate drives and we want:</p>
<ul>
<li>Automatic mount on system boot</li>
<li>No boot failure if a disk is unplugged</li>
<li>Clean <code>/mnt</code> directory structure</li>
<li>Drives visible in GNOME Nautilus</li>
</ul>
<hr>
<h1 id="step-1--identify-your-disks">Step 1 &mdash; Identify Your Disks</h1>
<p>First, list your disks:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>lsblk -f
</span></span></code></pre></div><p>You can also check detailed information:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo blkid
</span></span></code></pre></div><p>Example:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>/dev/sdb1: LABEL=&#34;Seagate 2TB&#34; UUID=&#34;9066b4ff-96d4-4be4-99b9-7402db8ad31c&#34; TYPE=&#34;ext4&#34;
</span></span><span style="display:flex;"><span>/dev/sdc:  LABEL=&#34;Seagate 4TB&#34; UUID=&#34;c36f588e-bcbd-4774-863d-3b9d50e2f08f&#34; TYPE=&#34;ext4&#34;
</span></span></code></pre></div><h3 id="what-is-uuid">What is UUID?</h3>
<p>UUID is a unique identifier for your disk filesystem.<br>
Using UUID (or LABEL) in <code>fstab</code> is safer than using <code>/dev/sdb1</code>,
because device names can change between boots.</p>
<hr>
<h1 id="step-2--set-clean-disk-labels-optional-but-recommended">Step 2 &mdash; Set Clean Disk Labels (Optional but Recommended)</h1>
<p>If the disks are mounted, unmount them first:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo umount /dev/sdb1
</span></span><span style="display:flex;"><span>sudo umount /dev/sdc
</span></span></code></pre></div><p>Set readable labels:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo e2label /dev/sdb1 <span style="color:#e6db74">&#34;Seagate 2TB&#34;</span>
</span></span><span style="display:flex;"><span>sudo e2label /dev/sdc <span style="color:#e6db74">&#34;Seagate 4TB&#34;</span>
</span></span></code></pre></div><p>Verify:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>lsblk -f
</span></span></code></pre></div><hr>
<h1 id="step-3--create-mount-points">Step 3 &mdash; Create Mount Points</h1>
<p>We will mount them under <code>/mnt</code>:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo mkdir -p <span style="color:#e6db74">&#34;/mnt/seagate-2tb&#34;</span> <span style="color:#e6db74">&#34;/mnt/seagate-4tb&#34;</span>
</span></span></code></pre></div><h3 id="what-is-a-mount-point">What is a mount point?</h3>
<p>A mount point is simply a directory where your disk becomes accessible
in the Linux filesystem.</p>
<hr>
<h1 id="step-4--configure-etcfstab">Step 4 &mdash; Configure /etc/fstab</h1>
<p>The file <code>/etc/fstab</code> tells Linux what to mount automatically at boot.</p>
<p>Open it:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo nano /etc/fstab
</span></span></code></pre></div><p>Add the following lines:</p>
<pre tabindex="0"><code class="language-fstab" data-lang="fstab">LABEL=Seagate\0402TB  /mnt/seagate-2tb  ext4  defaults,noatime,nofail,x-systemd.device-timeout=10,x-gvfs-show  0  2
LABEL=Seagate\0404TB  /mnt/seagate-4tb  ext4  defaults,noatime,nofail,x-systemd.device-timeout=10,x-gvfs-show  0  2
</code></pre><h2 id="important-notes">Important Notes</h2>
<ul>
<li><code>\040</code> represents a space character inside a LABEL.</li>
<li><code>nofail</code> prevents boot from stopping if the disk is missing.</li>
<li><code>x-systemd.device-timeout=10</code> avoids long delays during boot.</li>
<li><code>x-gvfs-show</code> ensures the drive appears in Nautilus.</li>
</ul>
<hr>
<h1 id="step-5--test-without-rebooting">Step 5 &mdash; Test Without Rebooting</h1>
<p>Instead of restarting immediately, test:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo mount -a
</span></span></code></pre></div><p>If there are no errors, confirm:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>df -h | grep seagate
</span></span></code></pre></div><p>If you see a parse error, inspect the problematic lines:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo nl -ba /etc/fstab | sed -n <span style="color:#e6db74">&#39;14,22p&#39;</span>
</span></span></code></pre></div><hr>
<h1 id="optional--make-it-writable-without-sudo">Optional &mdash; Make It Writable Without sudo</h1>
<p>Instead of using mount options for permissions (not recommended for
ext4), change ownership:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo chown -R <span style="color:#e6db74">&#34;</span>$USER<span style="color:#e6db74">:</span>$USER<span style="color:#e6db74">&#34;</span> /mnt/seagate-2tb
</span></span><span style="display:flex;"><span>sudo chown -R <span style="color:#e6db74">&#34;</span>$USER<span style="color:#e6db74">:</span>$USER<span style="color:#e6db74">&#34;</span> /mnt/seagate-4tb
</span></span></code></pre></div><hr>
<h1 id="final-result">Final Result</h1>
<p>You now have:</p>
<ul>
<li>Clean disk labels</li>
<li>Automatic mount on boot</li>
<li>Safe boot even if a disk is unplugged</li>
<li>Proper visibility inside GNOME</li>
<li>A structured home lab storage setup</li>
</ul>
<p>This setup is stable, clean, and beginner-safe.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Install Zellij on Fedora With Cargo</title>
      <link>https://janjic.lol/posts/zellij-fedora-cargo/</link>
      <pubDate>Wed, 13 Nov 2024 08:36:38 +0100</pubDate>
      
      <guid>https://janjic.lol/posts/zellij-fedora-cargo/</guid>
      <description><![CDATA[<h1 id="how-to-install-zellij-on-fedora-linux-using-cargo">How to install zellij on Fedora Linux using cargo</h1>
<p>As it is said on zellij <a href="https://zellij.dev/">webiste</a>:</p>
<blockquote>
<p>Zellij is a terminal workspace. It has the base functionality of a terminal multiplexer (similar to tmux or screen) but includes many built-in features that would allow users to extend it and create their own personalized environment.</p>
</blockquote>
<p>So, if you&rsquo;re looking for a modern screen or tmux replacement look no further.</p>
<h1 id="installation">Installation</h1>
<p>To get the latest version, it is best to install directly from cargo and in order to do so on Fedora Linux, we need to install some dependencies.</p>
<ol>
<li>First, install cargo using <a href="https://rustup.rs">rustup</a>:</li>
</ol>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>curl --proto <span style="color:#e6db74">&#39;=https&#39;</span> --tlsv1.2 -sSf https://sh.rustup.rs | sh
</span></span></code></pre></div><ol start="2">
<li>Then, install development dependencies using dnf:</li>
</ol>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo dnf group install c-development development-tools
</span></span></code></pre></div><ol start="3">
<li>In order to build <em>zellij</em> from cargo, we also need two perl libraries:</li>
</ol>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>sudo dnf install perl-FindBin perl-IPC-Cmd
</span></span></code></pre></div><ol start="4">
<li>Finnaly:</li>
</ol>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>cargo install --locked zellij
</span></span></code></pre></div><p>Now grab a cup of cofee ☕️ and wait while it builds.</p>
<h1 id="conclusion">Conclusion</h1>
<p>I hope that you find this short post usefull. Happy hacking! 👩‍💻</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Resolving &#39;Cannot access a disposed context instance&#39; Error in ASP.NET Core</title>
      <link>https://janjic.lol/posts/hot-choco-error-post/</link>
      <pubDate>Thu, 17 Oct 2024 12:00:00 +0100</pubDate>
      
      <guid>https://janjic.lol/posts/hot-choco-error-post/</guid>
      <description><![CDATA[<h2 id="introduction">Introduction</h2>
<p>When developing an ASP.NET Core application and using Entity Framework (especially when using HotChocolate GraphQL library) to manage your database, you may encounter the following error:</p>
<pre tabindex="0"><code>Cannot access a disposed context instance. A common cause of this error is disposing a context instance that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application.
</code></pre><h2 id="cause">Cause</h2>
<p>This error typically occurs when a database context (<code>DbContext</code>) is attempted to be used after it has been disposed. This often happens in scenarios where the <code>DbContext</code> instance is not properly managed within your Dependency Injection (DI) system.</p>
<h2 id="solution">Solution</h2>
<h3 id="use-the-factory-pattern">Use the Factory Pattern</h3>
<p>The solution to this error is to use factory pattern to create a new instance of the <code>DbContext</code> each time it is needed. This way, you can avoid issues with managing the lifecycle of instances.</p>
<ol>
<li>
<p><strong>Register the Factory in the DI Container</strong>:</p>
<p>In your <code>Program.cs</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> connectionString = builder.Configuration.GetConnectionString(<span style="color:#e6db74">&#34;DefaultConnection&#34;</span>);
</span></span><span style="display:flex;"><span>builder.Services..AddDbContextFactory&lt;LibreBorrDbContext&gt;(options =&gt; {
</span></span><span style="display:flex;"><span>        options.UseSqlServer(connectionString); <span style="color:#75715e">// or whatever DB server you are using</span>
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div></li>
<li>
<p><strong>Use the Factory in Your Service</strong>:</p>
<p>In your service (<code>BookService</code>):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">BookService</span> : IBookService
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">readonly</span> IDbContextFactory _dbContextFactory;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> BookService(IDbContextFactory dbContextFactory)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        _dbContextFactory = dbContextFactory;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">async</span> Task&lt;List&lt;Book&gt;&gt; GetBooks()
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">await</span> <span style="color:#66d9ef">using</span> var context = _dbContextFactory.CreateDbContext();
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">await</span> context.Books.ToListAsync();
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>Using the factory pattern for managing <code>DbContext</code> instances allows you to avoid issues with disposal and lifecycle management of the context. This method provides greater control over the context and helps you eliminate errors like <code>Cannot access a disposed context instance</code>.</p>
<p>If you have any further questions or need assistance, feel free to reach out! 😊</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Splitcat: My File Splitting and Merging App</title>
      <link>https://janjic.lol/posts/splitcat-post/</link>
      <pubDate>Wed, 16 Oct 2024 04:00:00 +0000</pubDate>
      
      <guid>https://janjic.lol/posts/splitcat-post/</guid>
      <description><![CDATA[<h1 id="splitcat-an-app-for-easy-file-splitting-and-merging">Splitcat: An App for Easy File Splitting and Merging</h1>
<p>I’m excited to introduce my latest project – <strong>Splitcat</strong>! 🎉 After a lot of work, the app is now <strong>fully developed in Flutter</strong> and ready for download on <a href="https://github.com/vogonwann/splitcat">GitHub</a> and <a href="https://flathub.org/apps/details/lol.janjic.Splitcat">Flathub</a>.</p>
<hr>
<h2 id="about-the-app">About the App</h2>
<p>Splitcat is built entirely in <strong>Flutter</strong>, ensuring a smooth and responsive user experience on both desktop and mobile platforms. It simplifies <strong>file splitting and merging</strong>, making it easier to manage large files without needing complex command-line tools.</p>
<p>Some typical use cases include:</p>
<ul>
<li><strong>Splitting large files</strong> into smaller chunks for sharing via email or uploading to platforms with size limits.</li>
<li><strong>Merging chunks back</strong> into the original file seamlessly.</li>
</ul>
<p>With <strong>ARM64 support</strong>, Splitcat runs perfectly on <strong>Linux phones</strong> like those with <strong>postmarketOS</strong> or <strong>mobian</strong>.</p>
<hr>
<h2 id="key-features">Key Features</h2>
<ul>
<li><strong>Preset and Custom Split Options:</strong> Choose predefined chunk sizes for specific apps or create your own.</li>
<li><strong>Simple and Intuitive UI:</strong> Designed with a minimal layout, including large buttons for easy navigation, especially on smaller screens.</li>
<li><strong>Multi-Platform Support:</strong> Flutter enables compatibility across desktops and Linux phones alike.</li>
<li><strong>Flatpak Package:</strong> Available on <a href="https://flathub.org/">Flathub</a> for hassle-free installation on various Linux distributions.</li>
</ul>
<hr>
<h2 id="installation">Installation</h2>
<p><strong>From Flathub:</strong><br>
Install the app with the following command:</p>
<div class="highlight"><pre tabindex="0" 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="display:flex;"><span>flatpak install flathub lol.janjic.Splitcat
</span></span></code></pre></div><p><strong>From GitHub:</strong>
Alternatively, download the source code or binaries directly from <a href="https://github.com/vogonwann/splitcat/releases">GitHub</a>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Introduction</title>
      <link>https://janjic.lol/posts/intro-post/</link>
      <pubDate>Thu, 03 Oct 2024 18:13:42 +0000</pubDate>
      
      <guid>https://janjic.lol/posts/intro-post/</guid>
      <description><![CDATA[<h1 id="welcome-to-the-geek-side-linux-foss-and-all-things-open-source">Welcome to the Geek Side: Linux, FOSS, and All Things Open Source</h1>
<p>Greetings, fellow nerds, coders, and open-source enthusiasts! 👋</p>
<p>Welcome to my humble corner of the internet, where we celebrate the beauty of <strong>Linux</strong>, embrace the power of <strong>Free and Open Source Software (FOSS)</strong>, and dive deep into the art of <strong>coding</strong>. Whether you&rsquo;re a seasoned command-line wizard or a brave soul just starting your Linux journey, this blog is for you.</p>
<h2 id="what-to-expect">What to Expect?</h2>
<ul>
<li><strong>Linux Tips &amp; Tricks</strong>: From obscure terminal commands to desktop customization magic, we&rsquo;ve got you covered.</li>
<li><strong>FOSS Adventures</strong>: Let&rsquo;s explore the wild world of open-source software and the unsung heroes behind it.</li>
<li><strong>Mobile Linux</strong>: Because who doesn’t want a phone that respects your freedom? (Looking at you, PinePhone and postmarketOS).</li>
<li><strong>Coding Shenanigans</strong>: Python, Rust, C#, Bash, and the occasional &ldquo;How the heck did I break my build again?&rdquo; moment. No language is safe.</li>
</ul>
<h2 id="why-linux">Why Linux?</h2>
<p>Linux isn’t just an operating system—it&rsquo;s a way of life! It’s about freedom, community, and occasionally spending an entire weekend fixing Wi-Fi drivers. But hey, who needs sleep when you can have a perfectly configured system running on <em>your</em> terms?</p>
<h2 id="join-the-fun">Join the Fun!</h2>
<p>I’ll be sharing my experiences, frustrations (because let’s be honest, there will be plenty), and cool discoveries along the way. If you love tech, open-source, and a bit of lighthearted nerdiness, you’re in the right place.</p>
<p>Pull up a terminal, grab a cup of your favorite beverage (mine’s coffee ☕), and let’s get started!</p>
<p>Stay tuned, and remember: With great power comes great responsibility&hellip; and probably some dependency hell.</p>
<p>— <em>Ivan</em></p>
]]></description>
      
    </item>
    
    
    
    
    
    
  </channel>
</rss>
