<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.ssarwarjahan.com/atom.xml" rel="self" type="application/atom+xml" /><link href="https://blog.ssarwarjahan.com/" rel="alternate" type="text/html" hreflang="en-US" /><updated>2026-01-06T22:15:50+00:00</updated><id>https://blog.ssarwarjahan.com/atom.xml</id><title type="html">Sabit’s Blog</title><subtitle>#A_Computer_Nerd!</subtitle><author><name>Md. Sarwar Jahan Sabit</name></author><entry><title type="html">Host Website for Free: Google AI Studio -&amp;gt; GitHub -&amp;gt; Cloudflare</title><link href="https://blog.ssarwarjahan.com/hosting-google-ai-studio-to-cloudflare" rel="alternate" type="text/html" title="Host Website for Free: Google AI Studio -&amp;gt; GitHub -&amp;gt; Cloudflare" /><published>2026-01-07T12:30:00+00:00</published><updated>2026-01-07T12:30:00+00:00</updated><id>https://blog.ssarwarjahan.com/hosting-google-ai-studio-to-cloudflare</id><content type="html" xml:base="https://blog.ssarwarjahan.com/hosting-google-ai-studio-to-cloudflare"><![CDATA[<p>Google AI Studio is an incredible tool for generating code, including full-fledged React applications. But once you have that code, how do you share it with the world? In this guide, I’ll walk you through the process of taking your project from Google AI Studio to a live, hosted website for free using GitHub and Cloudflare Pages.</p>

<h2 id="prerequisite">Prerequisite</h2>
<ul>
  <li>A generic Google account (for AI Studio).</li>
  <li>A GitHub account.</li>
  <li>A Cloudflare account.</li>
</ul>

<h2 id="step-1-export-to-github">Step 1: Export to GitHub</h2>

<p>Google AI Studio now has a direct integration with GitHub, making this process incredibly smooth.</p>

<ol>
  <li>Open your project in <strong>Google AI Studio</strong>.</li>
  <li>Look for the <strong>“Export to GitHub”</strong> button (often found in the “Share” or “Export” menu).</li>
  <li>Click it and authenticate your GitHub account if prompted.</li>
  <li>Choose to <strong>Create a new repository</strong>.</li>
  <li>Give your repository a name (e.g., <code class="language-plaintext highlighter-rouge">my-ai-app</code>), add description, and click <strong>Push</strong>.</li>
</ol>

<p>Your code is now live on GitHub! No terminal commands required.</p>

<h2 id="step-2-connect-to-cloudflare-pages">Step 2: Connect to Cloudflare Pages</h2>

<ol>
  <li>Log in to your <strong>Cloudflare Dashboard</strong>.</li>
  <li>Go to <strong>Workers &amp; Pages</strong> &gt; <strong>Create Application</strong> (+ button at the top left) &gt; <strong>Pages</strong> &gt; <strong>Connect to Git</strong>.</li>
  <li>Select your GitHub account and the repository you just created.</li>
  <li><strong>Configure the build settings:</strong>
    <ul>
      <li><strong>Framework preset:</strong> usually <code class="language-plaintext highlighter-rouge">React (Vite)</code>.</li>
      <li><strong>Build command:</strong> <code class="language-plaintext highlighter-rouge">npm run build</code> (standard for most).</li>
      <li><strong>Build output directory:</strong> <code class="language-plaintext highlighter-rouge">dist</code> (for Vite).</li>
    </ul>
  </li>
  <li>Click <strong>Save and Deploy</strong>.</li>
</ol>

<h2 id="limitations">Limitations</h2>

<p>Cloudflare Pages has a free tier that allows you to host up to 100,000 requests (page views in this case) per month. If you expect more traffic, you may need to upgrade to a paid plan or host it to GitHub Pages.</p>

<h2 id="troubleshooting">Troubleshooting</h2>

<h3 id="i-see-a-blank-white-page">“I see a blank white page!”</h3>

<p>If your deployment finishes successfully but you see a blank page, it’s likely a missing script tag issue common with some AI-generated exports.</p>

<p>I wrote a detailed guide on how to fix this specific issue here:
<a href="/troubleshooting-react-blank-page-cloudflare"><strong>Troubleshooting: React App Shows Blank White Page on Cloudflare Pages</strong></a></p>

<p>Follow that guide to update your <code class="language-plaintext highlighter-rouge">index.html</code>, then push the changes to GitHub. Cloudflare will automatically redeploy your fix!</p>

<h2 id="conclusion">Conclusion</h2>

<p>That’s it! You now have a free, SSL-secured, fast-hosting pipeline. Any time you want to update your site, just generate new code, overwrite the files locally, and push to GitHub. Cloudflare handles the rest.</p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="hosting" /><category term="cloudflare" /><category term="github" /><category term="google-ai-studio" /><category term="tutorial" /><summary type="html"><![CDATA[A step-by-step guide on how to take your generated code from Google AI Studio, push it to GitHub, and host it for free using Cloudflare Pages.]]></summary></entry><entry><title type="html">Troubleshooting: React App Shows Blank White Page on Cloudflare Pages</title><link href="https://blog.ssarwarjahan.com/troubleshooting-react-blank-page-cloudflare" rel="alternate" type="text/html" title="Troubleshooting: React App Shows Blank White Page on Cloudflare Pages" /><published>2026-01-07T12:00:00+00:00</published><updated>2026-01-07T12:00:00+00:00</updated><id>https://blog.ssarwarjahan.com/troubleshooting-react-blank-page-cloudflare</id><content type="html" xml:base="https://blog.ssarwarjahan.com/troubleshooting-react-blank-page-cloudflare"><![CDATA[<p>If you’ve recently exported a React project from Google AI Studio or a similar tool and deployed it to Cloudflare Pages, you might have encountered a frustrating issue: the deployment is successful, but when you visit the site, you’re greeted with a completely blank white page.</p>

<p>This is a common issue often caused by a missing entry point in your <code class="language-plaintext highlighter-rouge">index.html</code>.</p>

<h2 id="the-problem">The Problem</h2>

<p>When you inspect the source of your <code class="language-plaintext highlighter-rouge">index.html</code> (often located in the <code class="language-plaintext highlighter-rouge">public</code> folder or at the root), you might see something like this:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;body&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"root"</span><span class="nt">&gt;&lt;/div&gt;</span>
<span class="nt">&lt;/body&gt;</span>
</code></pre></div></div>

<p>Notice the lack of a script connecting your HTML to your React code? Without pointing to your main JavaScript file (usually <code class="language-plaintext highlighter-rouge">index.tsx</code> or <code class="language-plaintext highlighter-rouge">main.tsx</code>), the browser renders the empty <code class="language-plaintext highlighter-rouge">#root</code> div and nothing else happens.</p>

<h2 id="the-solution">The Solution</h2>

<p>To fix this, you need to explicitly link your main entry file in the <code class="language-plaintext highlighter-rouge">body</code> of your <code class="language-plaintext highlighter-rouge">index.html</code>.</p>

<p>Add the following line inside the <code class="language-plaintext highlighter-rouge">&lt;body&gt;</code> tag, usually right after the root div:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"module"</span> <span class="na">src=</span><span class="s">"/index.tsx"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<p>Your corrected <code class="language-plaintext highlighter-rouge">index.html</code> should look like this:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;body&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"root"</span><span class="nt">&gt;&lt;/div&gt;</span>
    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"module"</span> <span class="na">src=</span><span class="s">"/index.tsx"</span><span class="nt">&gt;&lt;/script&gt;</span>
<span class="nt">&lt;/body&gt;</span>
</code></pre></div></div>

<p><em>(Note: If your entry file is named <code class="language-plaintext highlighter-rouge">main.tsx</code> or <code class="language-plaintext highlighter-rouge">index.jsx</code>, update the <code class="language-plaintext highlighter-rouge">src</code> attribute accordingly.)</em></p>

<h3 id="why-this-happens">Why this happens</h3>

<p>Some code generation tools or templates might omit this link, assuming a specific build setup that auto-injects it, or simply due to a generation error. Cloudflare Pages (and Vite/others) need this entry point to kickstart the React application.</p>

<p>Once you add this line, commit your changes and push to your repository. Cloudflare Pages should rebuild quite quickly, and your site should load correctly!</p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="react" /><category term="cloudflare" /><category term="troubleshooting" /><category term="web-dev" /><summary type="html"><![CDATA[Learn how to fix the common 'blank white page' issue when deploying Google AI Studio React projects to Cloudflare Pages by adding a missing script tag.]]></summary></entry><entry><title type="html">The Mysterious bootTel.dat File - Not a Virus, Just Windows Being Windows</title><link href="https://blog.ssarwarjahan.com/mysterious-boottel-dat-file-explained" rel="alternate" type="text/html" title="The Mysterious bootTel.dat File - Not a Virus, Just Windows Being Windows" /><published>2025-12-05T16:00:00+00:00</published><updated>2025-12-05T16:00:00+00:00</updated><id>https://blog.ssarwarjahan.com/mysterious-boottel-dat-file-explained</id><content type="html" xml:base="https://blog.ssarwarjahan.com/mysterious-boottel-dat-file-explained"><![CDATA[<p>Found a suspicious <code class="language-plaintext highlighter-rouge">bootTel.dat</code> file lurking in my drive root. Time to investigate.</p>

<h2 id="the-discovery">The Discovery</h2>

<p>While browsing my NTFS drive on Linux, I spotted a hidden 112-byte file called <code class="language-plaintext highlighter-rouge">bootTel.dat</code>. Naturally, my first thought: <em>“Is this malware?”</em></p>

<p>Spoiler: It’s not. But the journey to find out was fun.</p>

<h2 id="the-investigation">The Investigation</h2>

<p>Ran <code class="language-plaintext highlighter-rouge">xxd</code> on it and found some interesting bytes:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>00000000: 7000 0000 3832 2e20 4555 ...  p...82. EU...
00000020: 6e00 7400 6600 7300 ...      n.t.f.s.
</code></pre></div></div>

<p>That <code class="language-plaintext highlighter-rouge">n.t.f.s.</code> in UTF-16LE encoding was a dead giveaway. This is Windows territory.</p>

<h2 id="what-bootteldat-actually-is">What bootTel.dat Actually Is</h2>

<p>After some research, turns out:</p>

<ul>
  <li><strong>Created by:</strong> <code class="language-plaintext highlighter-rouge">autochk.exe</code> - Windows’ disk checking utility</li>
  <li><strong>Purpose:</strong> Telemetry data from filesystem checks</li>
  <li><strong>When:</strong> After improper shutdowns, power loss, or chkdsk operations</li>
</ul>

<p>Basically, Windows writes this file to say <em>“Hey, I checked this drive for errors.”</em> It’s Windows’ way of leaving a sticky note.</p>

<h2 id="is-it-safe-to-delete">Is It Safe to Delete?</h2>

<p>Yes. Windows won’t complain. Your drive won’t explode. It’s just metadata about a past disk check.</p>

<h2 id="why-did-it-appear">Why Did It Appear?</h2>

<p>If you see this file, your drive probably:</p>
<ol>
  <li>Got unplugged without proper ejection (oops)</li>
  <li>Survived a power outage</li>
  <li>Had Windows run a repair on it</li>
</ol>

<p>Think of it as a receipt for a doctor’s visit your drive never asked for.</p>

<h2 id="tldr">TL;DR</h2>

<p><code class="language-plaintext highlighter-rouge">bootTel.dat</code> = Windows’ filesystem doctor’s note. Not malware. Safe to delete. Move along, nothing to see here.</p>

<p><em>The real mystery is why Windows doesn’t clean up after itself.</em></p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="windows" /><category term="linux" /><category term="filesystem" /><category term="ntfs" /><summary type="html"><![CDATA[Found a suspicious bootTel.dat file lurking in my drive root. Time to investigate. The Discovery While browsing my NTFS drive on Linux, I spotted a hidden 112-byte file called bootTel.dat. Naturally, my first thought: “Is this malware?” Spoiler: It’s not. But the journey to find out was fun. The Investigation Ran xxd on it and found some interesting bytes: 00000000: 7000 0000 3832 2e20 4555 ... p...82. EU... 00000020: 6e00 7400 6600 7300 ... n.t.f.s. That n.t.f.s. in UTF-16LE encoding was a dead giveaway. This is Windows territory. What bootTel.dat Actually Is After some research, turns out: Created by: autochk.exe - Windows’ disk checking utility Purpose: Telemetry data from filesystem checks When: After improper shutdowns, power loss, or chkdsk operations Basically, Windows writes this file to say “Hey, I checked this drive for errors.” It’s Windows’ way of leaving a sticky note. Is It Safe to Delete? Yes. Windows won’t complain. Your drive won’t explode. It’s just metadata about a past disk check. Why Did It Appear? If you see this file, your drive probably: Got unplugged without proper ejection (oops) Survived a power outage Had Windows run a repair on it Think of it as a receipt for a doctor’s visit your drive never asked for. TL;DR bootTel.dat = Windows’ filesystem doctor’s note. Not malware. Safe to delete. Move along, nothing to see here. The real mystery is why Windows doesn’t clean up after itself.]]></summary></entry><entry><title type="html">Deploying Happy-Server on Coolify</title><link href="https://blog.ssarwarjahan.com/deploying-happy-server-on-coolify" rel="alternate" type="text/html" title="Deploying Happy-Server on Coolify" /><published>2025-10-27T10:30:00+00:00</published><updated>2025-10-27T10:30:00+00:00</updated><id>https://blog.ssarwarjahan.com/deploying-happy-server-on-coolify</id><content type="html" xml:base="https://blog.ssarwarjahan.com/deploying-happy-server-on-coolify"><![CDATA[<p>Happy-Server is a powerful tool that enhances AI assistants like Claude by enabling to use it on your smartphone. If you’re looking to self-host it using Coolify, this guide covers the Docker setup you’ll need.</p>

<h2 id="background">Background</h2>

<p>While exploring deployment options for Happy-Server, I found a helpful <a href="https://github.com/slopus/happy-server/pull/5">pull request by @akoenig</a> that added Docker Compose support for easy self-hosting. <a href="https://github.com/HashWarlock">@HashWarlock</a> also contributed valuable insights. I’ve adapted their work for Coolify deployment in <a href="https://github.com/ms-jahan/happy-server">my fork</a>.</p>

<h2 id="the-dockerfile">The Dockerfile</h2>

<p>The setup uses a multi-stage build to keep the final image lean while ensuring all dependencies are properly installed.</p>

<h3 id="stage-1-building-the-application">Stage 1: Building the Application</h3>

<figure class="highlight"><pre><code class="language-dockerfile" data-lang="dockerfile"><span class="k">FROM</span><span class="w"> </span><span class="s">node:20</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s">builder
</span>

<span class="c"># Install dependencies
</span>
<span class="k">RUN </span>apt-get update <span class="o">&amp;&amp;</span> apt-get <span class="nb">install</span> <span class="nt">-y</span> python3 ffmpeg make g++ build-essential <span class="o">&amp;&amp;</span> <span class="nb">rm</span> <span class="nt">-rf</span> /var/lib/apt/lists/<span class="k">*</span>

<span class="k">WORKDIR</span><span class="s"> /app
</span>

<span class="c"># Copy package files
</span>
<span class="k">COPY</span><span class="s"> package.json yarn.lock ./
</span>
<span class="k">COPY</span><span class="s"> ./prisma ./prisma
</span>

<span class="c"># Install dependencies
</span>
<span class="k">RUN </span>yarn <span class="nb">install</span> <span class="nt">--frozen-lockfile</span> <span class="nt">--ignore-engines</span>

<span class="c"># Copy application code
</span>
<span class="k">COPY</span><span class="s"> ./tsconfig.json ./tsconfig.json
</span>
<span class="k">COPY</span><span class="s"> ./vitest.config.ts ./vitest.config.ts
</span>
<span class="k">COPY</span><span class="s"> ./sources ./sources
</span>

<span class="c"># Build the application
</span>
<span class="k">RUN </span>yarn build

<span class="c"># Generate Prisma client
</span>
<span class="k">RUN </span>yarn prisma generate</code></pre></figure>

<p><strong>Key Points:</strong></p>
<ul>
  <li>Uses Node.js 20 as the base image</li>
  <li>Installs system dependencies: <code class="language-plaintext highlighter-rouge">python3</code>, <code class="language-plaintext highlighter-rouge">ffmpeg</code>, and build tools</li>
  <li>Uses <code class="language-plaintext highlighter-rouge">--frozen-lockfile</code> for consistent dependency versions</li>
  <li>Includes Prisma database client generation</li>
</ul>

<h3 id="stage-2-runtime-environment">Stage 2: Runtime Environment</h3>

<figure class="highlight"><pre><code class="language-dockerfile" data-lang="dockerfile"><span class="k">FROM</span><span class="w"> </span><span class="s">node:20</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="s">runner
</span>

<span class="k">WORKDIR</span><span class="s"> /app
</span>

<span class="c"># Install runtime dependencies
</span>
<span class="k">RUN </span>apt-get update <span class="o">&amp;&amp;</span> apt-get <span class="nb">install</span> <span class="nt">-y</span> python3 ffmpeg <span class="o">&amp;&amp;</span> <span class="nb">rm</span> <span class="nt">-rf</span> /var/lib/apt/lists/<span class="k">*</span>

<span class="c"># Set production environment
</span>
<span class="k">ENV</span><span class="s"> NODE_ENV=production
</span>

<span class="c"># Copy from builder
</span>
<span class="k">COPY</span><span class="s"> --from=builder /app/tsconfig.json ./tsconfig.json
</span>
<span class="k">COPY</span><span class="s"> --from=builder /app/package.json ./package.json
</span>
<span class="k">COPY</span><span class="s"> --from=builder /app/node_modules ./node_modules
</span>
<span class="k">COPY</span><span class="s"> --from=builder /app/sources ./sources
</span>
<span class="k">COPY</span><span class="s"> --from=builder /app/prisma ./prisma
</span>

<span class="c"># Expose port
</span>
<span class="k">EXPOSE</span><span class="s"> 3005
</span>

<span class="c"># Run migrations then start
</span>
<span class="k">CMD</span><span class="s"> ["sh", "-c", "yarn prisma migrate deploy &amp;&amp; yarn start"]</span></code></pre></figure>

<p><strong>Key Points:</strong></p>
<ul>
  <li>Separates runtime from build dependencies</li>
  <li>Runs database migrations on startup</li>
  <li>Exposes port 3005 (configurable via environment variables)</li>
</ul>

<h2 id="docker-compose-setup">Docker Compose Setup</h2>

<p>The docker-compose configuration includes:</p>

<ul>
  <li><strong>PostgreSQL</strong>: Database for persistent storage</li>
  <li><strong>Redis</strong>: For caching and session management</li>
  <li><strong>MinIO</strong>: S3-compatible object storage</li>
  <li><strong>Happy-Server</strong>: The main application</li>
</ul>

<p>All services have proper health checks and dependency management.</p>

<h2 id="deploying-on-coolify">Deploying on Coolify</h2>

<ol>
  <li>Fork or clone <a href="https://github.com/ms-jahan/happy-server">my repository</a></li>
  <li>Set up environment variables:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">HANDY_MASTER_SECRET</code>: Your master secret key</li>
      <li><code class="language-plaintext highlighter-rouge">DATABASE_URL</code>: PostgreSQL connection string</li>
      <li><code class="language-plaintext highlighter-rouge">REDIS_URL</code>: Redis connection string</li>
    </ul>
  </li>
  <li>Point Coolify to your repository</li>
  <li>Use the included Dockerfile for the build</li>
  <li>Configure port mapping (default: 3005)</li>
</ol>

<h2 id="changes-from-original-pr">Changes from Original PR</h2>

<p>The main modification I made was changing the exposed port from 3000 to 3005:</p>

<figure class="highlight"><pre><code class="language-dockerfile" data-lang="dockerfile"><span class="c"># Original PR used port 3000
</span>
<span class="k">EXPOSE</span><span class="s"> 3000
</span>

<span class="c"># My fork uses port 3005
</span>
<span class="k">EXPOSE</span><span class="s"> 3005</span></code></pre></figure>

<p>This provides better compatibility with Coolify’s default configurations and avoids conflicts with other services.</p>

<h2 id="credits">Credits</h2>

<p>Special thanks to <a href="https://github.com/akoenig">@akoenig</a> for the <a href="https://github.com/slopus/happy-server/pull/5">original Docker implementation</a>, and <a href="https://github.com/HashWarlock">@HashWarlock</a> for their valuable feedback.</p>

<h2 id="repository">Repository</h2>

<p>Check out the complete setup here: <a href="https://github.com/ms-jahan/happy-server">github.com/ms-jahan/happy-server</a></p>

<p>Happy deploying! 🚀</p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="docker" /><category term="self-hosting" /><category term="deployment" /><category term="mcp" /><summary type="html"><![CDATA[A comprehensive guide to deploying Happy-Server on Coolify using Docker. Learn how to set up the multi-stage build and configure environment variables for self-hosting.]]></summary></entry><entry><title type="html">Fixing WinBoat host.lan Permission Issues - Complete Investigation and Solution</title><link href="https://blog.ssarwarjahan.com/fixing-winboat-host-lan-permission-issues" rel="alternate" type="text/html" title="Fixing WinBoat host.lan Permission Issues - Complete Investigation and Solution" /><published>2025-10-20T01:58:00+00:00</published><updated>2025-10-20T01:58:00+00:00</updated><id>https://blog.ssarwarjahan.com/fixing-winboat-host-lan-permission-issues</id><content type="html" xml:base="https://blog.ssarwarjahan.com/fixing-winboat-host-lan-permission-issues"><![CDATA[<p>If you’re running Windows inside WinBoat on Linux and struggling to access or write to the <code class="language-plaintext highlighter-rouge">\\host.lan\Data</code> network share, this comprehensive guide will walk you through the exact steps to fix it.</p>

<h2 id="quick-fix-tldr">Quick Fix (TL;DR)</h2>

<p><strong>Total time: ~4 minutes</strong></p>

<h3 id="step-1-create-secure-shared-directory">Step 1: Create Secure Shared Directory</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Create dedicated shared folder</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> ~/shared
<span class="nb">chmod </span>777 ~/shared

<span class="c"># Stop WinBoat</span>
<span class="nb">cd</span> ~/.winboat
docker-compose down

<span class="c"># Edit docker-compose.yml</span>
nano docker-compose.yml
</code></pre></div></div>

<p>Find <code class="language-plaintext highlighter-rouge">"${HOME}:/shared"</code> and change it to:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="s2">"</span><span class="s">${HOME}/shared:/shared"</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Restart WinBoat</span>
docker-compose up <span class="nt">-d</span>
</code></pre></div></div>

<h3 id="step-2-stop-conflicting-samba">Step 2: Stop Conflicting Samba</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>systemctl stop smb
<span class="nb">sudo </span>systemctl disable smb
</code></pre></div></div>

<h3 id="step-3-fix-write-permissions">Step 3: Fix Write Permissions</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Get container ID</span>
<span class="nv">CONTAINER_ID</span><span class="o">=</span><span class="si">$(</span>docker ps | <span class="nb">grep </span>WinBoat | <span class="nb">awk</span> <span class="s1">'{print $1}'</span><span class="si">)</span>

<span class="c"># Update Samba config</span>
docker <span class="nb">exec</span> <span class="nv">$CONTAINER_ID</span> sh <span class="nt">-c</span> <span class="s2">"cat &gt; /etc/samba/smb.conf &lt;&lt; 'EOF'
[global]
    server string = Dockur
    netbios name = host.lan
    workgroup = WORKGROUP
    interfaces = dockerbridge
    bind interfaces only = yes
    security = user
    guest account = nobody
    map to guest = Bad User
    server min protocol = NT1
    follow symlinks = yes
    wide links = yes
    unix extensions = no
    log level = 3
    load printers = no
    printing = bsd
    printcap name = /dev/null
    disable spoolss = yes

[Data]
    path = /shared
    comment = Shared
    writable = yes
    browseable = yes
    guest ok = yes
    public = yes
    read only = no
    create mask = 0777
    directory mask = 0777
    force create mode = 0666
    force directory mode = 0777
EOF"</span>

<span class="c"># Restart Samba</span>
docker <span class="nb">exec</span> <span class="nv">$CONTAINER_ID</span> killall smbd
</code></pre></div></div>

<h3 id="step-4-test-from-windows">Step 4: Test from Windows</h3>

<pre><code class="language-cmd">net use \\host.lan /delete
net use \\host.lan
echo test &gt; \\host.lan\Data\test.txt
dir \\host.lan\Data
</code></pre>

<p>✅ Done! You should now have full read/write access.</p>

<hr />

<h2 id="the-problem">The Problem</h2>

<p>When trying to access <code class="language-plaintext highlighter-rouge">\\host.lan\Data</code> from Windows inside WinBoat, users encounter:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Windows cannot access \\host.lan\Data
You do not have permission to access \\host.lan\Data.
</code></pre></div></div>

<p>Even when the share is visible, writing files fails with “Access is denied.”</p>

<h2 id="root-causes">Root Causes</h2>

<p>After extensive investigation, three main issues were identified:</p>

<h3 id="1-insecure-home-directory-mount">1. Insecure Home Directory Mount</h3>

<p><strong>Problem:</strong> WinBoat’s default configuration mounts your entire home directory:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="s2">"</span><span class="s">${HOME}:/shared"</span>
</code></pre></div></div>

<p>This exposes sensitive files (.ssh keys, browser data, etc.) and had permission issues (700 permissions blocking container access).</p>

<p><strong>Solution:</strong> Use a dedicated shared directory instead:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="s2">"</span><span class="s">${HOME}/shared:/shared"</span>
</code></pre></div></div>

<h3 id="2-conflicting-samba-servers">2. Conflicting Samba Servers</h3>

<p><strong>Problem:</strong> Two Samba servers running simultaneously:</p>
<ul>
  <li>Host systemd Samba service</li>
  <li>WinBoat’s container Samba</li>
</ul>

<p>This caused routing confusion and AppArmor security blocks.</p>

<p><strong>Solution:</strong> Disable the host Samba service - WinBoat has its own built-in Samba server.</p>

<h3 id="3-samba-permission-configuration">3. Samba Permission Configuration</h3>

<p><strong>Problem:</strong> The Samba configuration used <code class="language-plaintext highlighter-rouge">force user = root</code> + <code class="language-plaintext highlighter-rouge">guest only = yes</code>, which failed to properly map guest users to root, blocking write operations.</p>

<p><strong>Solution:</strong> Remove forced user mapping and set proper file creation masks to allow the guest (nobody) user to write files.</p>

<h2 id="network-architecture">Network Architecture</h2>

<p>Understanding how WinBoat networking works:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Linux Host (192.168.0.186)
    ↓
Docker Bridge (172.22.0.1) ← WinBoat Container (172.22.0.2)
    ↓                            ↓
    ↓                      Internal Bridge (20.20.20.1) - Samba Server
    ↓                            ↓
    └────────[NAT/Routing]─→ Windows Guest (20.20.20.21)
</code></pre></div></div>

<ul>
  <li>Windows resolves <code class="language-plaintext highlighter-rouge">host.lan</code> to <code class="language-plaintext highlighter-rouge">20.20.20.1</code> (WinBoat’s internal bridge)</li>
  <li>Traffic gets NATed through the container to reach your Linux host</li>
  <li>Samba serves files from the <code class="language-plaintext highlighter-rouge">/shared</code> mount point</li>
</ul>

<h2 id="key-technical-insights">Key Technical Insights</h2>

<h3 id="apparmor-and-docker-containers">AppArmor and Docker Containers</h3>

<p><strong>Important:</strong> AppArmor on the host does NOT apply to processes inside Docker containers. The AppArmor denials observed were from the host Samba service, not WinBoat’s containerized Samba.</p>

<h3 id="samba-force-user-directive">Samba Force User Directive</h3>

<p>The combination of <code class="language-plaintext highlighter-rouge">force user = root</code>, <code class="language-plaintext highlighter-rouge">force group = root</code>, and <code class="language-plaintext highlighter-rouge">guest only = yes</code> doesn’t work as expected. Samba fails to properly map guest connections to root in this configuration, blocking write operations even though the config claims to allow them.</p>

<p><strong>Better approach:</strong> Let the guest user (nobody) write files directly with appropriate create masks:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">create mask = 0777</code> - Files are writable by all</li>
  <li><code class="language-plaintext highlighter-rouge">force create mode = 0666</code> - Forces specific file permissions</li>
  <li><code class="language-plaintext highlighter-rouge">directory mask = 0777</code> - Directories are writable by all</li>
  <li><code class="language-plaintext highlighter-rouge">force directory mode = 0777</code> - Forces specific directory permissions</li>
</ul>

<h3 id="file-creation-masks-matter">File Creation Masks Matter</h3>

<p>Default Samba <code class="language-plaintext highlighter-rouge">create mask = 0744</code> makes files read-only for group/others. For shared storage accessible by Windows guests, use <code class="language-plaintext highlighter-rouge">0777</code> masks with forced modes to ensure write access.</p>

<h2 id="security-considerations">Security Considerations</h2>

<h3 id="before-insecure">Before (Insecure)</h3>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">volumes</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s2">"</span><span class="s">${HOME}:/shared"</span>  <span class="c1"># Exposes entire home directory!</span>
</code></pre></div></div>

<p><strong>Risks:</strong></p>
<ul>
  <li>SSH keys accessible</li>
  <li>Browser history/cookies exposed</li>
  <li>GPG keys accessible</li>
  <li>All personal files readable</li>
</ul>

<h3 id="after-secure">After (Secure)</h3>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">volumes</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s2">"</span><span class="s">${HOME}/shared:/shared"</span>  <span class="c1"># Only exposes ~/shared</span>
</code></pre></div></div>

<p><strong>Benefits:</strong></p>
<ul>
  <li>Home directory stays private (700 permissions)</li>
  <li>Only intended files are shared</li>
  <li>Easy to audit what’s exposed</li>
  <li>Follows principle of least privilege</li>
</ul>

<h2 id="usage">Usage</h2>

<h3 id="share-files-from-linux-to-windows">Share Files from Linux to Windows</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Copy files to shared directory</span>
<span class="nb">cp</span> ~/Documents/myfile.pdf ~/shared/

<span class="c"># Create subdirectories</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> ~/shared/projects
<span class="nb">cp</span> <span class="nt">-r</span> ~/work/myproject ~/shared/projects/
</code></pre></div></div>

<p>Files appear instantly in Windows at <code class="language-plaintext highlighter-rouge">\\host.lan\Data\</code></p>

<h3 id="share-files-from-windows-to-linux">Share Files from Windows to Linux</h3>

<pre><code class="language-cmd">rem Copy file
copy C:\Users\sjs\Desktop\file.txt \\host.lan\Data\

rem Copy directory
xcopy C:\Documents\project \\host.lan\Data\project\ /E /I
</code></pre>

<p>Access from Linux at <code class="language-plaintext highlighter-rouge">/home/YOUR_USERNAME/shared/</code></p>

<h3 id="map-as-network-drive">Map as Network Drive</h3>

<p>For convenience, map it as a drive letter in Windows:</p>

<pre><code class="language-cmd">net use Z: \\host.lan\Data /persistent:yes
</code></pre>

<p>Now accessible as <code class="language-plaintext highlighter-rouge">Z:</code> drive in File Explorer.</p>

<h2 id="troubleshooting">Troubleshooting</h2>

<h3 id="share-becomes-inaccessible-after-reboot">Share Becomes Inaccessible After Reboot</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Restart WinBoat</span>
<span class="nb">cd</span> ~/.winboat
docker-compose restart

<span class="c"># Or restart just Samba</span>
docker <span class="nb">exec</span> <span class="si">$(</span>docker ps | <span class="nb">grep </span>WinBoat | <span class="nb">awk</span> <span class="s1">'{print $1}'</span><span class="si">)</span> killall smbd
</code></pre></div></div>

<h3 id="samba-config-lost-after-container-recreate">Samba Config Lost After Container Recreate</h3>

<p>The Samba configuration changes are lost when the container is recreated. To persist them:</p>

<ol>
  <li>Save the Samba config to your host:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&gt;</span> ~/.winboat/custom-smb.conf <span class="o">&lt;&lt;</span> <span class="sh">'</span><span class="no">EOF</span><span class="sh">'
[global]
 # ... (full config here)
</span><span class="no">EOF
</span></code></pre></div>    </div>
  </li>
  <li>Mount it in <code class="language-plaintext highlighter-rouge">docker-compose.yml</code>:
    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">volumes</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s2">"</span><span class="s">./custom-smb.conf:/etc/samba/smb.conf:ro"</span>
</code></pre></div>    </div>
  </li>
</ol>

<h3 id="check-current-samba-configuration">Check Current Samba Configuration</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">CONTAINER_ID</span><span class="o">=</span><span class="si">$(</span>docker ps | <span class="nb">grep </span>WinBoat | <span class="nb">awk</span> <span class="s1">'{print $1}'</span><span class="si">)</span>
docker <span class="nb">exec</span> <span class="nv">$CONTAINER_ID</span> testparm <span class="nt">-s</span>
</code></pre></div></div>

<p>Verify these settings in the <code class="language-plaintext highlighter-rouge">[Data]</code> section:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">read only = No</code></li>
  <li><code class="language-plaintext highlighter-rouge">writable = yes</code></li>
  <li><code class="language-plaintext highlighter-rouge">create mask = 0777</code></li>
  <li><code class="language-plaintext highlighter-rouge">directory mask = 0777</code></li>
</ul>

<h2 id="investigation-tools-used">Investigation Tools Used</h2>

<p>For those interested in troubleshooting similar issues:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Network inspection</span>
docker inspect &lt;container&gt; <span class="nt">--format</span> <span class="s1">''</span>
docker <span class="nb">exec</span> &lt;container&gt; ip addr show
ss <span class="nt">-tlnp</span> | <span class="nb">grep </span>445  <span class="c"># Check SMB ports</span>

<span class="c"># Samba debugging</span>
docker <span class="nb">exec</span> &lt;container&gt; testparm <span class="nt">-s</span>
docker <span class="nb">exec</span> &lt;container&gt; smbstatus
docker logs &lt;container&gt;

<span class="c"># Permission checking</span>
<span class="nb">stat</span> /path/to/directory
getfacl /path/to/directory
dmesg | <span class="nb">grep </span>apparmor  <span class="c"># Check for security blocks</span>

<span class="c"># Container processes</span>
docker <span class="nb">exec</span> &lt;container&gt; ps aux | <span class="nb">grep </span>smbd
</code></pre></div></div>

<h2 id="conclusion">Conclusion</h2>

<p>WinBoat provides excellent Windows-in-Docker functionality, but the default file sharing configuration has security and permission issues. By:</p>

<ol>
  <li>Using a dedicated shared directory instead of mounting your entire home</li>
  <li>Disabling conflicting host Samba services</li>
  <li>Properly configuring Samba file creation masks</li>
</ol>

<p>You get secure, fully functional bidirectional file sharing between your Linux host and Windows guest.</p>

<p><strong>Total investigation time:</strong> ~4 hours
<strong>Time to fix once you know the solution:</strong> ~4 minutes</p>

<hr />

<p><strong>Related Issues:</strong></p>
<ul>
  <li><a href="https://github.com/TibixDev/winboat/issues/362">WinBoat #362: Host.lan inaccessible</a></li>
  <li><a href="https://github.com/dockur/windows/issues/782">dockur/windows #782: Cannot access \host.lan</a></li>
</ul>

<p><em>All commands tested on Manjaro Linux (Kernel 6.16.8) with WinBoat 5.03 running Windows 11 Pro.</em></p>

<p><em>I’ve put Claude Code to investigate the issue, fix it, and write this detailed blog post. ^__^</em></p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="linux" /><category term="docker" /><category term="winboat" /><category term="samba" /><category term="networking" /><category term="troubleshooting" /><summary type="html"><![CDATA[If you’re running Windows inside WinBoat on Linux and struggling to access or write to the \\host.lan\Data network share, this comprehensive guide will walk you through the exact steps to fix it.]]></summary></entry><entry><title type="html">How to Paste Images to Claude Code with Flameshot on Linux</title><link href="https://blog.ssarwarjahan.com/paste-images-to-claude-code-with-flameshot" rel="alternate" type="text/html" title="How to Paste Images to Claude Code with Flameshot on Linux" /><published>2025-10-07T01:15:00+00:00</published><updated>2025-10-07T01:15:00+00:00</updated><id>https://blog.ssarwarjahan.com/paste-images-to-claude-code-with-flameshot</id><content type="html" xml:base="https://blog.ssarwarjahan.com/paste-images-to-claude-code-with-flameshot"><![CDATA[<p>If you’re using Flameshot for screenshots on Linux (especially with xfce4-terminal) and struggling to paste images directly into Claude Code, here’s a simple fix that doesn’t require switching to other screenshot tools.</p>

<h2 id="the-problem">The Problem</h2>

<p>When taking screenshots with Flameshot and trying to paste them into Claude Code using Ctrl+V, the image doesn’t appear. This is because Flameshot copies the raw image data to the clipboard, but Claude Code expects a file path or a different format.</p>

<h2 id="the-solution">The Solution</h2>

<p>Instead of switching screenshot tools, you can configure Flameshot to automatically save images to a location and copy the file path to clipboard. This way, when you paste, Claude Code receives the file path and can load the image - similar to drag and drop.</p>

<h3 id="steps-to-fix">Steps to Fix</h3>

<ol>
  <li>Open Flameshot configuration settings</li>
  <li>Navigate to the <strong>General</strong> tab</li>
  <li><strong>Check</strong> the following two options:
    <ul>
      <li>☑️ Save image after copy</li>
      <li>☑️ Copy file path after save</li>
    </ul>
  </li>
  <li>Set your <strong>Save Path</strong> (e.g., <code class="language-plaintext highlighter-rouge">/home/sjs/Pictures/Screenshots</code>)</li>
  <li>Apply the changes</li>
</ol>

<p><img src="/assets/images/paste-images-to-claude-code-with-flameshot.png" alt="Flameshot Configuration Settings" /></p>

<h3 id="how-it-works">How It Works</h3>

<p>With these settings enabled, when you:</p>
<ol>
  <li>Take a screenshot with Flameshot</li>
  <li>Click the copy button</li>
  <li>The image gets saved to your configured location</li>
  <li>The file path is copied to your clipboard</li>
  <li>Press Ctrl+V in Claude Code</li>
  <li>The image is pasted successfully</li>
</ol>

<p>This behaves exactly like drag-and-drop, but with the convenience of keyboard shortcuts.</p>

<h2 id="why-this-works">Why This Works</h2>

<p>By checking these options, Flameshot changes its behavior to save the file first and then copy the path rather than copying the raw image data. Claude Code can then read the file path from the clipboard and load the image, just as it would with a drag-and-drop operation.</p>

<p>No need to switch to other tools like <a href="https://github.com/thecodecentral/gshot-copy">gshot-copy</a> - your existing Flameshot setup works perfectly!</p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="linux" /><category term="flameshot" /><category term="claude-code" /><category term="xfce" /><category term="screenshot" /><summary type="html"><![CDATA[If you’re using Flameshot for screenshots on Linux (especially with xfce4-terminal) and struggling to paste images directly into Claude Code, here’s a simple fix that doesn’t require switching to other screenshot tools.]]></summary></entry><entry><title type="html">Hide Images and Videos on YouTube Music using uBlock Origin</title><link href="https://blog.ssarwarjahan.com/hide-images-and-videos-on-youtube-music-using-ublock-origin" rel="alternate" type="text/html" title="Hide Images and Videos on YouTube Music using uBlock Origin" /><published>2025-08-13T13:33:54+00:00</published><updated>2025-08-13T13:33:54+00:00</updated><id>https://blog.ssarwarjahan.com/hide-images-and-videos-on-youtube-music-using-ublock-origin</id><content type="html" xml:base="https://blog.ssarwarjahan.com/hide-images-and-videos-on-youtube-music-using-ublock-origin"><![CDATA[<ol>
  <li>Install <strong>uBlock Origin</strong> extension/add-on if that supports your browser!</li>
  <li>Open the extension/add-on dashboard.</li>
  <li>Go to <strong>My Filters</strong> tab.</li>
  <li>Add these filters and click <strong>Apply changes</strong>:</li>
</ol>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>music.youtube.com##img
music.youtube.com##ytd-thumbnail.ytd-video-renderer
music.youtube.com##ytd-rich-item-renderer.style-scope.ytd-rich-grid-row
music.youtube.com##ytmusic-player
</code></pre></div></div>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="adblocker" /><category term="ublock" /><category term="yt-music" /><summary type="html"><![CDATA[Install uBlock Origin extension/add-on if that supports your browser! Open the extension/add-on dashboard. Go to My Filters tab. Add these filters and click Apply changes:]]></summary></entry><entry><title type="html">Wake Up PC (WakeOnLan) Remotely Using Telegram and NodeMCU without Port Forwarding</title><link href="https://blog.ssarwarjahan.com/wake-up-pc-remotely" rel="alternate" type="text/html" title="Wake Up PC (WakeOnLan) Remotely Using Telegram and NodeMCU without Port Forwarding" /><published>2023-11-13T11:25:00+00:00</published><updated>2023-11-13T11:25:00+00:00</updated><id>https://blog.ssarwarjahan.com/wake-up-pc-remotely</id><content type="html" xml:base="https://blog.ssarwarjahan.com/wake-up-pc-remotely"><![CDATA[<p>I’ve created a solution to remotely startup my PC without port forwaring.</p>

<p>Check the Notion link below (as I’ll be updating it there):</p>

<p><a href="https://ms-jahan.notion.site/Wake-Up-PC-WakeOnLan-Remotely-Using-Telegram-and-NodeMCU-500802b5219949b1865ba849cbc390dc">https://ms-jahan.notion.site/Wake-Up-PC-WakeOnLan-Remotely-Using-Telegram-and-NodeMCU-500802b5219949b1865ba849cbc390dc</a></p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="IoT" /><category term="NodeMCU" /><category term="Telegram Bot" /><summary type="html"><![CDATA[I’ve created a solution to remotely startup my PC without port forwaring. Check the Notion link below (as I’ll be updating it there): https://ms-jahan.notion.site/Wake-Up-PC-WakeOnLan-Remotely-Using-Telegram-and-NodeMCU-500802b5219949b1865ba849cbc390dc]]></summary></entry><entry><title type="html">Math For Programming</title><link href="https://blog.ssarwarjahan.com/math-for-programming" rel="alternate" type="text/html" title="Math For Programming" /><published>2023-04-12T04:44:00+00:00</published><updated>2023-04-12T04:44:00+00:00</updated><id>https://blog.ssarwarjahan.com/math-for-programming</id><content type="html" xml:base="https://blog.ssarwarjahan.com/math-for-programming"><![CDATA[<p>The following text was collected from <a href="https://www.facebook.com/groups/10ms.programming/posts/2738823896260758/">here</a> by <a href="https://www.facebook.com/Programmerbaba01">Programming Baba</a>, translated and slightly rewritten by ChatGPT.</p>

<h2>What mathematical concepts are utilized by computer programmers?</h2>
<p>On his first day of university class, the professor asked the students why mathematics is necessary. Many answers were given, but the professor made a logical point: "Perhaps the numbers themselves won't be directly useful, but they will greatly enhance the brain's ability to think logically, which is essential for programming." Programming is entirely dependent on logic, and developing logical skills requires the use of various algorithms. Here are some commonly used math concepts:</p>
<ul>
    <li>Addition</li>
    <li>Subtraction</li>
    <li>Multiplication or Product</li>
    <li>Division</li>
    <li>Modulo (%)</li>
    <li>Exponentiation (power) (pow)</li>
    <li>Absolute values (abs)</li>
    <li>Rounding Off</li>
    <li>Ceiling Rounding (Ceil)</li>
    <li>Floor Rounding (floor)</li>
    <li>Pythagorean Theorem (a^2 + b^2 = c^2)</li>
    <li>Fractions (Floating point) (How floating point works)</li>
    <li>Arithmetic Sequence (1, 2, 3, ...)</li>
    <li>Geometric Sequence (1^2, 2^2, 3^2, ...)</li>
    <li>Finding the sum of numbers (for loops / arithmetic sequences)</li>
    <li>Binary numbers</li>
    <li>Hexadecimal numbers</li>
    <li>Octal numbers</li>
    <li>Factorial</li>
    <li>Function</li>
    <li>Recursive Function (e.g., Fibonacci sequence, Factorial of a number)</li>
    <li>Maximum value / upper limit / lower limit of integer specified bytes (32-bit vs. 64-bit)</li>
    <li>Floating point exceptions (epsilon, division by zero, infinity)</li>
    <li>Square Root (sqrt / pow (x, 1/2))</li>
    <li>String (actually, a set of 8-bit numbers)</li>
    <li>Set</li>
    <li>Hash Function</li>
    <li>Table (e.g., Division Table, Log Table)</li>
    <li>Signedness (e.g., +123, -123)</li>
    <li>Comparison of numbers</li>
    <li>Bit Manipulation (And, Or, Xor, Not, Xnor, Neg, Nand, Nor, Left Shift, Right Shift)</li>
    <li>Boolean Algebra (true or false)</li>
    <li>Logic (&amp;&amp;, ||, ==)</li>
    <li>Geometry (hyperplanes, points at infinity, etc.)</li>
    <li>Trigonometry (sin, cos, tan, asine, etn2, etc.)</li>
    <li>Vector (Cartesian)</li>
    <li>Matrix</li>
    <li>Quaternions</li>
    <li>Graph theory</li>
    <li>Number theory</li>
    <li>Calculus</li>
    <li>Probability</li>
    <li>Fourier series</li>
</ul>
<p>These concepts are based on the answer provided by Md. Zubair (Lecturer | Data Science Researcher | Computer engineer) with some additional items. If you wish to work in machine learning, you will require knowledge of Probability, Statistics, Matrix, Vector, Calculus, and other related topics.</p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="programming" /><category term="math" /><category term="competitive programming" /><summary type="html"><![CDATA[Explore the essential mathematical concepts that computer programmers use daily. From basic arithmetic to advanced algorithms, discover how math enhances logical thinking in programming.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.ssarwarjahan.com/assets/images/math-for-programming.jpg" /><media:content medium="image" url="https://blog.ssarwarjahan.com/assets/images/math-for-programming.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Show Bluetooth Battery Status on Linux</title><link href="https://blog.ssarwarjahan.com/show-bluetooth-battery-status" rel="alternate" type="text/html" title="Show Bluetooth Battery Status on Linux" /><published>2023-04-11T11:49:00+00:00</published><updated>2023-04-11T11:49:00+00:00</updated><id>https://blog.ssarwarjahan.com/show-bluetooth-battery-status</id><content type="html" xml:base="https://blog.ssarwarjahan.com/show-bluetooth-battery-status"><![CDATA[<p>I’ve searched how to do that and finally found it. <a href="https://stackoverflow.com/a/70460138/12804377">Source</a> (seriously, check it out if you’re using Arch)</p>

<p>On Arch Linux, it should be enough to run:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cp /usr/lib/systemd/system/bluetooth.service /etc/systemd/system/
sed -i -r 's/ExecStart=.+/&amp; -E/' /etc/systemd/system/bluetooth.service
systemctl daemon-reload
systemctl restart bluetooth
</code></pre></div></div>

<p>And the headset battery level should appear. To get the battery level programatically, you can then use UPower’s DBus API.</p>]]></content><author><name>Md. Sarwar Jahan Sabit</name></author><category term="linux" /><category term="bluetooth" /><summary type="html"><![CDATA[I’ve searched how to do that and finally found it. Source (seriously, check it out if you’re using Arch)]]></summary></entry></feed>