<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Has Blog]]></title><description><![CDATA[I am a Senior Full Stack Developer focused on .NET, AI integration, cloud systems, and real-world scalable product development.

In this blog, I share practical engineering insights, system design learnings, backend architecture concepts, freelancing experiences, and career growth strategies.

My goal is to learn in public, build impactful systems, and help developers move from coding features to engineering solutions.]]></description><link>https://blog.hsnits.pro</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 20:40:34 GMT</lastBuildDate><atom:link href="https://blog.hsnits.pro/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Fundamentals of Garbage Collection]]></title><description><![CDATA[1.Introdiction to .NET Memory Management
When a .NET application runs, memory is primarily divided into two areas:

Stack

Heap


Local variables and method calls are handled by the Stack.Objects crea]]></description><link>https://blog.hsnits.pro/fundamentals-of-garbage-collection</link><guid isPermaLink="true">https://blog.hsnits.pro/fundamentals-of-garbage-collection</guid><category><![CDATA[dotnet]]></category><category><![CDATA[C#]]></category><category><![CDATA[Garbage Collection]]></category><category><![CDATA[memory-management]]></category><category><![CDATA[Software Engineering]]></category><dc:creator><![CDATA[Has]]></dc:creator><pubDate>Sun, 15 Mar 2026 19:25:44 GMT</pubDate><content:encoded><![CDATA[<h2>1.Introdiction to .NET Memory Management</h2>
<p>When a .NET application runs, memory is primarily divided into two areas:</p>
<ul>
<li><p><strong>Stack</strong></p>
</li>
<li><p><strong>Heap</strong></p>
</li>
</ul>
<p>Local variables and method calls are handled by the <strong>Stack</strong>.<br />Objects created using the <code>new</code> keyword are allocated on the <strong>Heap</strong></p>
<p>But this raises an important question:</p>
<blockquote>
<p>If objects are continuously allocated on the heap, who deletes them?</p>
</blockquote>
<p>In languages like C and C++, developers must manually release memory using mechanisms such as <code>free()</code> or <code>delete</code>. Failure to do so can result in memory leaks, dangling pointers, or memory corruption.</p>
<p>In contrast, .NET uses an automatic memory management system called the <strong>Garbage Collector (GC)</strong>.</p>
<p>The Garbage Collector automatically identifies objects that are no longer in use and reclaims their memory, allowing developers to focus on application logic rather than manual memory cleanup.</p>
<h2>What is Stack.?</h2>
<p>The <strong>Stack</strong> is a region of memory used to manage method execution.</p>
<p>It is responsible for storing:</p>
<ul>
<li><p>Method parameters</p>
</li>
<li><p>Local variables</p>
</li>
<li><p>Return addresses</p>
</li>
<li><p>Execution context</p>
</li>
</ul>
<p>When a method is called, a <strong>stack frame</strong> is created.<br />Each stack frame contains everything required for that specific method call.</p>
<p>When another method is called inside it, a new stack frame is placed <strong>on top</strong> of the previous one.</p>
<p>This is why it is called a <em>Stack</em> —<br />because data is added and removed in a <strong>Last-In, First-Out (LIFO)</strong> order.</p>
<h2>What Happens When a Method Returns?</h2>
<p>When a method finishes execution:</p>
<ul>
<li><p>Its stack frame is removed.</p>
</li>
<li><p>All its local variables go out of scope.</p>
</li>
<li><p>The memory used by that frame is automatically reclaimed.</p>
</li>
</ul>
<p>If the method that called it also returns, its stack frame is removed as well. Eventually, if all methods complete, the stack becomes empty again. Stack memory management is extremely fast because it simply moves a pointer up and down.</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771082828058/5002163b-0a57-4cef-b54d-22ce2b52da4a.jpeg" alt="" style="display:block;margin-left:auto" />

<p>when code call another method</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771082991435/c4e1beb0-ba66-4289-a55f-136d011d1179.jpeg" alt="" style="display:block;margin:0 auto" />

<p>same thing happened again it added, Method parameters, return address, and local variables on top of previous stack frame.</p>
<p>why it called stack.? because information will get stacked on top of another</p>
<p>what happened when will u return result from method.? so in this at moment when you return, all the local variables go out of scope and are destroyed. and if return from first method also we will back at where we started, empty stack</p>
<h2>What is Heap.?</h2>
<p>this is also a block of memory, every new object in .NET is creating into heap like</p>
<pre><code class="language-csharp">MyClass Obj = new MyClass();
</code></pre>
<p>lets see an program</p>
<pre><code class="language-csharp">using System;

class Person
{
    public string Name;
    public int Age;

    public void Greet()
    {
        Console.WriteLine($"Hi, I am {Name} and I am {Age} years old.");
    }
}

class Program
{
    static void Main()
    {
        Person p1 = new Person();
        p1.Name = "Hasan";
        p1.Age = 25;

        p1.Greet();
    }
}
</code></pre>
<p>First, <code>p1</code> is created in the Stack as a reference variable. At this moment, it does not hold an object; it only has space to store a memory address and initially contains <code>null</code>.</p>
<p>Then the <code>new Person()</code> statement executes. This allocates memory in the Heap and creates a new <code>Person</code> object there. The fields of the object are automatically initialized with their default values (<code>Name = null</code>, <code>Age = 0</code>).</p>
<p>After the object is created in the Heap, its memory address is assigned to the reference variable <code>p1</code> in the Stack. Now <code>p1</code> points to that Heap object.</p>
<p>When we assign values using <code>p1</code>, such as setting properties or fields, those values are stored inside the Heap object. The Stack continues to store only the reference (memory address), while the actual object data resides in the Heap.</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771179613465/eb25016c-a1ec-4af9-8fec-9836d2744177.jpeg" alt="" style="display:block;margin:0 auto" />

<p>now on stack method will reference from heap memory.</p>
<p>if method if return i will removed from stack but in heap will still exist like</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771179763411/ee4af28b-c5b8-4cb8-8dc9-e7b5678b39ba.jpeg" alt="" style="display:block;margin:0 auto" />

<p>This is interesting, right? When a method finishes executing, its local variables and parameters go out of scope, but the object in the heap may still exist. In this case, the object becomes dereferenced because the variables and parameters that were referencing it have gone out of scope. A dereferenced object continues to exist in the heap, but it is not released immediately. Instead, it becomes eligible for garbage collection, and the .NET runtime will clean it up later.</p>
<p>The .NET Framework postpones cleaning up dereferenced objects because heap cleanup takes time. By delaying this process, the application can run more efficiently and perform better. This cleanup process is called garbage collection, and it runs periodically in the background.</p>
<p>When the runtime starts garbage collection, it scans the heap and identifies objects that are no longer referenced by any active variables, parameters, or reachable objects in the program. It then deallocates those unreachable objects and frees the memory.</p>
<h2>How Data Stores in Stack &amp; Heap</h2>
<p>In our code have Used parameters like Integer &amp; String<br />The <code>int</code> type belongs to a special category called <strong>value types</strong>. Value types store their actual data directly in the memory location where they are declared.</p>
<p>If a value type variable (like <code>int</code>) is declared inside a method, its value is stored directly in the <strong>Stack</strong> as part of the method’s stack frame. When the method ends, the stack frame is removed, and the value is automatically destroyed.</p>
<p>If a value type is part of an object (for example, <code>int Age</code> inside a class), it is stored in the <strong>Heap</strong> because it becomes part of the object’s memory block.</p>
<p>Reference types (such as <code>class</code>, <code>string</code>, and <code>array</code>) work differently. The reference variable is stored in the <strong>Stack</strong>, but the actual object is created and stored in the <strong>Heap</strong>. The Stack holds only the memory address, while the object’s data remains in the Heap.</p>
<h2>Value Type:-</h2>
<p>A value type is a type of variable in which both the type and the actual value are stored together in memory. The variable directly contains its data rather than a reference to another memory location.</p>
<p>For example, if I declare a local integer variable with a value of 1234, both the <code>int</code> type and the value <code>1234</code> are stored together in the Stack as part of the method’s stack frame. The variable itself holds the actual data, not a memory address pointing somewhere else.</p>
<p>This is why value types are typically faster to access and automatically removed when the method’s stack frame is destroyed.</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771180629186/99299887-2744-44d1-b876-3c9e32d41962.jpeg" alt="" style="display:block;margin:0 auto" />

<p>All Value type</p>
<details>
<summary>See All Value Type</summary>
<table style="min-width:50px"><colgroup><col style="min-width:25px"></col><col style="min-width:25px"></col></colgroup><tbody><tr><th><p>sbyte</p></th><th><p>long</p></th></tr><tr><td><p>byte</p></td><td><p>float</p></td></tr><tr><td><p>char</p></td><td><p>double</p></td></tr><tr><td><p>short</p></td><td><p>decimal</p></td></tr><tr><td><p>unsort</p></td><td><p>bool</p></td></tr><tr><td><p>int</p></td><td><p>enum</p></td></tr><tr><td><p>unit</p></td><td><p>struct</p></td></tr></tbody></table>
</details>

<h2>Reference Type:-</h2>
<img src="https://cdn.hashnode.com/uploads/covers/6884d13c04655ac461ea86d5/eacef68b-df3f-40ad-b106-1eb0ef54029f.jpg" alt="" style="display:block;margin:0 auto" />

<p>a reference type is a type of variable that refers to a value stored on the heap. in this variable can be on stack but i will refer a value on heap<br />reference type can exist on the stack and on the heap just like value types, but they will always refer to a value on heap.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6884d13c04655ac461ea86d5/b6d12568-bfc7-481c-ad90-69edb51e44b8.jpg" alt="" style="display:block;margin:0 auto" />

<blockquote>
<p>lets have variables A and B and variable a an object and b is null, what happens when i will assign a = b,</p>
</blockquote>
<p>The reference of a will copied into b (this is an imp feature of reference type)</p>
<img src="https://cdn.hashnode.com/uploads/covers/6884d13c04655ac461ea86d5/ebbebcc1-1d14-4008-a2d2-3396134b6021.jpg" alt="" style="display:block;margin:0 auto" />

<blockquote>
<p>what happens when i will compare a and b?</p>
</blockquote>
<p>they are two different variables that refers same object on the heap<br />well in this scenario these two will equal...</p>
<img src="https://cdn.hashnode.com/uploads/covers/6884d13c04655ac461ea86d5/8bbf750a-e79b-4a55-94a6-9e087cf0400d.jpg" alt="" style="display:block;margin:0 auto" />

<blockquote>
<p>wait<br />what what happens when i will compare a and b having 2 object in heap with identical data.?</p>
</blockquote>
<p>so in this scenario it will not consider as equal, because the references are diffrent.</p>
<ul>
<li><p>Reference types can be set to the null value.</p>
</li>
<li><p>Reference types store a reference to their value.</p>
</li>
<li><p>And this value is always stored on the heap.</p>
</li>
<li><p>Reference types can exist on the stack and on the heap, but their value is always stored on the heap.</p>
</li>
<li><p>Reference types are assigned by reference, meaning the reference is copied over.</p>
</li>
<li><p>Reference types are compared by reference to variables referring to the same object are considered equal.</p>
</li>
<li><p>And two variables referring to separate but identical objects are considered not equal.</p>
</li>
</ul>
<h2>Boxing and Unboxing</h2>
<p>Boxing and Unboxing is a process to convert value type to reference type like<br />int is value type convert as object</p>
<pre><code class="language-csharp">int number = 10;      // value type (stored in stack)
object obj = number;  // boxing
int number2 = (int)obj  //unboxing
</code></pre>
<p>what will happen here ? as respect of Memory</p>
<p>Boxing is the process of taking value types on the stack, packing them into objects and placing these objects on the heap. Boxing happens whenever you assign a value type to a variable parameter field or property of type object.</p>
<p>Unboxing is the reverse process. Objects on the heap are unpacked and the value types inside are copied back to the stack. Unboxing happens whenever you have an object value and you cast it to a value type.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6884d13c04655ac461ea86d5/b58164a8-574b-4e61-b178-376ab1f2c145.jpg" alt="" style="display:block;margin:0 auto" />

  
<p><mark class="bg-yellow-200 dark:bg-yellow-500/30">This article focused on building strong fundamentals of .NET Garbage Collection.</mark></p>
<blockquote>
<p><mark class="bg-yellow-200 dark:bg-yellow-500/30">In upcoming articles, we will go deeper into:</mark></p>
<p><mark class="bg-yellow-200 dark:bg-yellow-500/30">• Generational GC architecture and allocation behavior • Finalization lifecycle and Dispose pattern • GC pauses, Large Object Heap and performance tuning strategies • Real-world memory optimization techniques used in production systems</mark></p>
</blockquote>
<p><strong><mark class="bg-yellow-200 dark:bg-yellow-500/30">Follow the series to continue the deep dive.</mark></strong></p>
]]></content:encoded></item><item><title><![CDATA[Python uv:  No More Manual Virtual Environments]]></title><description><![CDATA[python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

But now, a new tool called uv makes this entire process seamless.
That changes with uv, a new ultra-fast Python package manager and runtime by Astral (creators of Ruff).
...]]></description><link>https://blog.hsnits.pro/python-uv-no-more-manual-virtual-environments</link><guid isPermaLink="true">https://blog.hsnits.pro/python-uv-no-more-manual-virtual-environments</guid><category><![CDATA[NoVenv]]></category><category><![CDATA[FastAPI]]></category><category><![CDATA[UV ]]></category><category><![CDATA[python development]]></category><category><![CDATA[Web Development]]></category><dc:creator><![CDATA[Has]]></dc:creator><pubDate>Mon, 25 Aug 2025 07:45:09 GMT</pubDate><content:encoded><![CDATA[<pre><code class="lang-python">python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
</code></pre>
<p>But now, a new tool called <code>uv</code> makes this entire process seamless.</p>
<p>That changes with <code>uv</code>, a new <strong>ultra-fast Python package manager and runtime</strong> by Astral (creators of Ruff).</p>
<p>With <code>uv</code>, managing Python dependencies feels more like using <code>npm</code> in Node.js:</p>
<ul>
<li><p>No manual virtual environment setup.</p>
</li>
<li><p>Simple commands to install and run.</p>
</li>
<li><p>Automatic isolation per project.</p>
</li>
</ul>
<p>Why <code>uv</code> Feels Like <code>npm</code></p>
<h2 id="heading-why-uv-feels-like-npm">Why <code>uv</code> Feels Like <code>npm</code></h2>
<p>Let’s compare side by side:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Task</td><td>Old Python Way (<code>pip + venv</code>)</td><td>With <code>uv</code></td><td>Node.js (<code>npm</code>)</td></tr>
</thead>
<tbody>
<tr>
<td>Create project</td><td><code>mkdir app &amp;&amp; cd app &amp;&amp; python -m venv .venv</code></td><td><code>uv init app</code></td><td><code>mkdir app &amp;&amp; cd app &amp;&amp; npm init -y</code></td></tr>
<tr>
<td>Add dependency</td><td><code>pip install requests</code></td><td><code>uv add requests</code></td><td><code>npm install axios</code></td></tr>
<tr>
<td>Track dependencies</td><td><code>requirements.txt</code> (manual update)</td><td><code>pyproject.toml</code> (auto updated)</td><td><code>package.json</code> (auto updated)</td></tr>
<tr>
<td>Run script</td><td><code>source .venv/bin/activate &amp;&amp; python</code> <a target="_blank" href="http://script.py"><code>script.py</code></a></td><td><code>uv run python</code> <a target="_blank" href="http://script.py"><code>script.py</code></a></td><td><code>node script.js</code></td></tr>
<tr>
<td>Lock versions</td><td><code>pip-tools</code> or manual</td><td>Built-in lockfile</td><td><code>package-lock.json</code></td></tr>
<tr>
<td>Global tool install</td><td><code>pip install --user tool</code></td><td><code>uv tool install tool</code></td><td><code>npm install -g tool</code></td></tr>
</tbody>
</table>
</div><p>Example: Installing and Running a Project</p>
<pre><code class="lang-javascript">npm init -y
npm install express
node server.js
</code></pre>
<pre><code class="lang-python">uv init my-app
uv add fastapi uvicorn
uv run uvicorn app:app --reload
</code></pre>
<p>Notice how both flows look <strong>almost identical</strong>. No <code>venv</code> step in Python anymore.</p>
<p>Why This Matters</p>
<h2 id="heading-why-this-matters">Why This Matters</h2>
<ul>
<li><p><strong>Beginner friendly</strong>: New Python devs don’t need to learn about virtual environments right away.</p>
</li>
<li><p><strong>Faster installs</strong>: <code>uv</code> is significantly faster than <code>pip</code>.</p>
</li>
<li><p><strong>Consistency</strong>: Automatic lock files ensure reproducible builds.</p>
</li>
<li><p><strong>Unified experience</strong>: Just like JavaScript developers rely on <code>npm</code>, Python developers can now rely on <code>uv</code>.</p>
</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Python has long lagged behind JavaScript in developer experience when it comes to dependency management. With <code>uv</code>, Python is finally catching up — giving us an <strong>npm-like workflow</strong> that’s simple, fast, and reliable.</p>
<p>If you’re tired of typing <code>python -m venv .venv &amp;&amp; source .venv/bin/activate</code>, it’s time to try <code>uv</code>.</p>
<h2 id="heading-lets-create-a-fastapi-project-step-by-step-with-uv-python">Let’s create a <strong>FastAPI project</strong> step by step… with UV + Python</h2>
<h2 id="heading-1-initialize-a-new-project">1. Initialize a New Project</h2>
<pre><code class="lang-python">uv init testApi
cd testApi
</code></pre>
<p>it will Create</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756106700805/13188a0b-f999-4b00-8a10-f300f566eda4.png" alt /></p>
<p>run this</p>
<pre><code class="lang-powershell">uv run main.py
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756106840829/38ae2b03-2ef4-40e8-8b74-064bbbaf958b.png" alt /></p>
<p>its creates everything automatically</p>
<h2 id="heading-2-add-dependencies">2. Add Dependencies</h2>
<pre><code class="lang-powershell">uv add fastapi uvicorn
</code></pre>
<p>same <mark>npm i packagename</mark></p>
<p>it will add dependency in <mark>pyproject.toml </mark> — same as <mark>package.json</mark></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756107028174/9cef9dd0-bdad-4ed4-b4e2-c594041134e3.png" alt /></p>
<h2 id="heading-3-add-a-basic-fastapi-app">3. Add a Basic FastAPI App</h2>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> fastapi <span class="hljs-keyword">import</span> FastAPI
<span class="hljs-keyword">import</span> uvicorn
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span>():</span>
    print(<span class="hljs-string">"Hello from ocr!"</span>)
    uvicorn.run(app, host=<span class="hljs-string">"0.0.0.0"</span>, port=<span class="hljs-number">7000</span>)


app = FastAPI()

<span class="hljs-meta">@app.get("/")</span>
<span class="hljs-keyword">async</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">root</span>():</span>
    <span class="hljs-keyword">return</span> {<span class="hljs-string">"message"</span>:<span class="hljs-string">"i am python FastAPI"</span>}


<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()
</code></pre>
<h2 id="heading-4-run-the-app">4. Run the App</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756107477734/66349d05-0940-4512-ae17-d11ac40afeed.png" alt class="image--center mx-auto" /></p>
<p>Boom….</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756107540959/847742b5-707b-4229-b2c0-26c95f4bac84.png" alt /></p>
<h2 id="heading-5-summary">5. Summary</h2>
<ul>
<li><p><code>uv</code> = automatic environment + package manager (like npm)</p>
</li>
<li><p>FastAPI project is ready in minutes</p>
</li>
<li><p>No manual venv, no pip hassles</p>
</li>
<li><p>Run scripts with <code>uv run</code></p>
</li>
</ul>
<p>🚀 Exploring <strong>FastAPI with</strong> <code>uv</code> — no virtual environments, no hassle, just Python done right! Stay tuned, more insights coming soon.</p>
]]></content:encoded></item><item><title><![CDATA[BIG Grooper :  A Powerful Document Processing Tool With Some UI Caveats]]></title><description><![CDATA[When it comes to intelligent document processing, it is one of the most capable platforms I’ve used. It’s built to handle large-scale document ingestion, extraction, classification, and validation with impressive accuracy. Whether you’re parsing stru...]]></description><link>https://blog.hsnits.pro/big-grooper-a-powerful-document-processing-tool-with-some-ui-caveats</link><guid isPermaLink="true">https://blog.hsnits.pro/big-grooper-a-powerful-document-processing-tool-with-some-ui-caveats</guid><category><![CDATA[BIS Grooper]]></category><category><![CDATA[Grooper]]></category><category><![CDATA[OCR ]]></category><category><![CDATA[idp]]></category><category><![CDATA[enterprise]]></category><dc:creator><![CDATA[Has]]></dc:creator><pubDate>Sat, 09 Aug 2025 18:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755070881593/e15d72e3-9560-45ae-9efc-b9bf8b183972.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When it comes to intelligent document processing, it is one of the most capable platforms I’ve used. It’s built to handle <strong>large-scale document ingestion, extraction, classification, and validation</strong> with impressive accuracy. Whether you’re parsing structured forms, messy handwritten notes, or mixed document sets, BIS delivers exceptional automation potential.</p>
<p>I’ve been working with Grooper for a while now, and I’ve grown to appreciate its strengths:</p>
<ul>
<li><p><strong>Robust Document Parsing</strong> — Handles multi-page, mixed document types in a single batch.</p>
</li>
<li><p><strong>Powerful Extraction Tools</strong> — From regex-based lookups to advanced classification, it supports complex scenarios.</p>
</li>
<li><p><strong>Flexible Workflow</strong> — You can automate almost every step from ingestion to export.</p>
</li>
</ul>
<p>While BIS Grooper is excellent for backend document processing, I’ve noticed some limitations when it comes to <strong>front-end UI customizations in the Review Panel</strong> — especially for enhancing reviewer experience.</p>
<h3 id="heading-1-adding-an-image-in-the-review-panel-logo-example">1. Adding an Image in the Review Panel (Logo Example)</h3>
<p>Sometimes, I need to show a <strong>logo inside the Review Panel</strong> regardless of whether that image is part of the scanned document.</p>
<p>For example, if I’m processing invoices for <em>Company A</em>, I might want to always display <em>Company A’s logo</em> in the Review Panel for branding consistency, reviewer context, or visual guidance — even if the uploaded document doesn’t contain the logo.</p>
<p>Currently, BIS has no direct option to insert a <strong>custom static or dynamic image</strong> into the Review Panel layout. Whether the image is stored in a file path, a database field, or a lookup table, the Review Panel can only display text-based fields.</p>
<h3 id="heading-2-dynamic-changes-based-on-input-lookup-based-visibility">2. Dynamic Changes Based on Input (Lookup-Based Visibility)</h3>
<p>BIS does offer features like <strong>secondary content types</strong> that can help conditionally display certain sections, but in practice, this isn’t always a <strong>fully complete solution</strong> — especially for more advanced scenarios.</p>
<p>In many document workflows, a section should only be visible if BIS finds relevant data from a <strong>lookup source</strong> (database, XML, API, etc.). If no data is found, the section should be <strong>completely hidden</strong> from the reviewer.</p>
<p><strong>Example:</strong></p>
<ul>
<li><p>While processing an insurance claim, BIS checks an XML lookup for the customer’s policy number.</p>
</li>
<li><p>If a match is found, the <strong>“Policy Details”</strong> section appears in the Review Panel, pre-filled with the retrieved information.</p>
</li>
<li><p>If no match exists, the section is hidden entirely — keeping the interface clean and focused.</p>
</li>
</ul>
<p>While <strong>secondary content types</strong> can partially achieve this, they often fall short when the visibility needs to be <strong>dynamically driven by lookup results</strong> during review. A more robust, real-time solution would give BIS the flexibility needed for complex, data-driven review workflows.</p>
<h3 id="heading-3-displaying-multiple-rows-of-data-from-lookup-sources">3. Displaying Multiple Rows of Data from Lookup Sources</h3>
<p>BIS already provides a very useful feature where a <strong>dropdown list</strong> can be populated from a database or XML lookup. This is excellent for selecting a single value (e.g., choosing a product code, customer ID, or location) from a defined source.</p>
<p>However, in many real-world workflows, it’s not enough to see just <strong>one list of values</strong> — sometimes we need to show <strong>multiple rows of related data</strong> returned by the lookup.</p>
<p><strong>Example scenario:</strong></p>
<ul>
<li><p>The reviewer enters a <strong>customer ID</strong> in the Review Panel.</p>
</li>
<li><p>BIS queries the lookup database and finds <strong>three past invoices</strong> for that customer.</p>
</li>
<li><p>Instead of only showing the customer’s name in a dropdown, the Review Panel should be able to display a <strong>table</strong> with multiple rows (invoice number, date, amount, status, etc.) for quick context.</p>
</li>
</ul>
<p>Currently, there’s no built-in way to render this kind of <strong>multi-row, multi-column data</strong> from a lookup source directly in the Review Panel. This limits the ability to give reviewers richer context without switching to an external system.</p>
<p>A feature to show lookup results as a <strong>grid or list view</strong> inside the Review Panel — rather than just a dropdown — would make BIS even more powerful for complex review workflows.</p>
<hr />
<p>If we set these UI limitations aside, BIS remains an incredibly powerful platform for document processing. Its extraction accuracy, flexible workflows, and ability to integrate with diverse data sources make it a top choice for large-scale automation. For complex, high-volume environments, BIS consistently delivers speed, reliability, and intelligent handling of even the messiest document sets. In short — the backend power is rock solid, even if the Review Panel could use a few upgrades.</p>
]]></content:encoded></item><item><title><![CDATA[BIS Grooper: How I Learned to Automate Data Capture]]></title><description><![CDATA[Introduction
In the past month, I’ve been exploring BIS Grooper, a powerful data capture and document processing platform designed to automate information extraction from various file formats. My goal was simple — to understand how businesses streaml...]]></description><link>https://blog.hsnits.pro/bis-grooper-how-i-learned-to-automate-data-capture</link><guid isPermaLink="true">https://blog.hsnits.pro/bis-grooper-how-i-learned-to-automate-data-capture</guid><category><![CDATA[Grooper]]></category><category><![CDATA[BIS]]></category><category><![CDATA[OCR ]]></category><category><![CDATA[idp]]></category><dc:creator><![CDATA[Has]]></dc:creator><pubDate>Mon, 04 Aug 2025 18:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754769635817/7e24ae59-8f04-492d-ac87-44c6447fc12a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>In the past month, I’ve been exploring <strong>BIS Grooper</strong>, a powerful data capture and document processing platform designed to automate information extraction from various file formats. My goal was simple — to understand how businesses streamline large-scale data entry and reduce manual work through automation.</p>
<p><img src="https://grooper.com/wp-content/uploads/2025/03/2025-02-27-Main_Website_Demo-1.gif" alt="Grooper - Enterprise AI Solutions For Your Data" /></p>
<h2 id="heading-what-is-bis-grooper">What is BIS Grooper?</h2>
<p><strong>BIS Grooper</strong> is an intelligent document processing (IDP) platform developed to capture, extract, and integrate data from a variety of sources. It’s widely used in industries like finance, healthcare, education, and government to turn unstructured or semi-structured documents into usable, structured data.</p>
<p>Grooper works by combining <strong>OCR (Optical Character Recognition)</strong>, <strong>data classification</strong>, <strong>content extraction rules</strong>, and <strong>system integrations</strong> into one unified workflow. This allows organizations to process everything from scanned invoices to complex forms, ensuring accurate and efficient data capture without manual entry.</p>
<p>What makes Grooper stand out is its flexibility — you can design extraction logic visually, train it to recognize specific document layouts, and even integrate directly with databases, content management systems, or cloud services.</p>
<p><img src="https://images.g2crowd.com/uploads/attachment/file/1221013/batch-processing-data-review-grooper-web-client.jpg" alt="Grooper Reviews 2025: Details, Pricing, &amp; Features | G2" /></p>
<h2 id="heading-my-learning-journey-with-bis-grooper">My Learning Journey with BIS Grooper</h2>
<p>When I started with <strong>BIS Grooper</strong> a month ago, I knew it was a powerful data capture tool, but I underestimated just how deep it could go. My learning process wasn’t just about following tutorials — it was about exploring, making mistakes, and solving real problems.</p>
<p>The first few days were all about understanding the <strong>Grooper Design Studio</strong> interface and its core components:</p>
<ul>
<li><p><strong>Content Models</strong> – the backbone for structuring how Grooper identifies and extracts information.</p>
</li>
<li><p><strong>Data Fields</strong> – defining exactly what pieces of data I wanted to capture.</p>
</li>
<li><p><strong>Pipelines</strong> – the workflow engine that automates document processing.</p>
</li>
</ul>
<p>I started with something simple: importing a small batch of sample documents and running basic OCR to see how Grooper handled them. It was surprisingly accurate, even with slightly messy scans.</p>
<h3 id="heading-diving-into-classification-amp-extraction">Diving into Classification &amp; Extraction</h3>
<p>I wanted Grooper to not just read documents but also <strong>understand what type of document</strong> it was looking at. That’s when I learned about <strong>Classification</strong> — training Grooper to automatically distinguish between invoices, forms, letters, or other document types.</p>
<p>For extraction, I began using <strong>Regular Expressions (Regex)</strong> inside Grooper. At first, it felt like learning a foreign language, but soon I could create patterns to pull out invoice numbers, dates, and customer IDs with near-perfect accuracy.</p>
<h3 id="heading-once-i-had-extraction-down-my-focus-shifted-to-automation-i-built-my-first-complete-pipeline-that">Once I had extraction down, my focus shifted to <strong>automation</strong>. I built my first complete pipeline that:</h3>
<p>Once I had extraction down, my focus shifted to <strong>automation</strong>. I built my first complete pipeline that:</p>
<ol>
<li><p><strong>Imported</strong> documents from a folder.</p>
</li>
<li><p><strong>Ran OCR</strong> to recognize text.</p>
</li>
<li><p><strong>Classified</strong> each document type.</p>
</li>
<li><p><strong>Extracted</strong> specific data fields.</p>
</li>
<li><p><strong>Exported</strong> the results directly to a database.</p>
</li>
</ol>
<h3 id="heading-problem-solving-amp-optimization">Problem Solving &amp; Optimization</h3>
<p>The last week was about refining my skills:</p>
<ul>
<li><p>Adjusting OCR settings for better accuracy on low-quality scans.</p>
</li>
<li><p>Creating fallback rules when certain fields couldn’t be extracted.</p>
</li>
<li><p>Learning how to debug extraction errors and pipeline failures.</p>
</li>
</ul>
<p>I also realized Grooper isn’t just a data capture tool — it’s an <strong>intelligent workflow builder</strong>. Once you understand its logic, you can design processes that save massive amounts of time and reduce human errors</p>
<p><img src="https://wiki.grooper.com/images/thumb/8/87/WhatsNew-04-Reports.png/900px-WhatsNew-04-Reports.png" alt /></p>
<h2 id="heading-real-world-applications-i-tried">Real-World Applications I Tried</h2>
<p>After building confidence with BIS Grooper’s core features, I started experimenting with <strong>real-world scenarios</strong> to see how it could handle actual business problems. My goal was simple, take tasks that normally require <strong>repetitive manual effort</strong> and see if Grooper could automate them end-to-end.</p>
<h3 id="heading-1-invoice-data-extraction">1. Invoice Data Extraction</h3>
<p>One of my first test projects was automating the extraction of <strong>invoice details</strong> from scanned PDFs.</p>
<ul>
<li><p><strong>Challenge:</strong> These invoices had different layouts, inconsistent fonts, and sometimes handwritten notes.</p>
</li>
<li><p><strong>Grooper’s Solution:</strong> I trained a <strong>Content Model</strong> to identify invoice numbers, dates, vendor names, and total amounts using a mix of <strong>layout-based extraction</strong> and <strong>Regex rules</strong>.</p>
</li>
<li><p><strong>Result:</strong> What used to take <strong>15–20 minutes per invoice</strong> manually was reduced to <strong>under 30 seconds</strong>, with 95%+ accuracy.</p>
</li>
</ul>
<h3 id="heading-2-form-classification-for-multiple-departments"><strong>2. Form Classification for Multiple Departments</strong></h3>
<p>I simulated a use case where an organization receives different forms — HR onboarding, expense claims, leave requests — all in one folder.</p>
<ul>
<li><p><strong>Challenge:</strong> Sorting them manually is time-consuming and prone to error.</p>
</li>
<li><p><strong>Grooper’s Solution:</strong> I used <strong>Document Classification</strong> to train the system to detect form types based on key words, layouts, and structure.</p>
</li>
<li><p><strong>Result:</strong> Grooper could separate 100+ mixed forms into correct folders in just a few minutes without a single misclassification.</p>
</li>
</ul>
<h3 id="heading-3-legacy-data-digitization"><strong>3. Legacy Data Digitization</strong></h3>
<p>I wanted to see how Grooper handles <strong>old, poor-quality scanned documents</strong>.</p>
<ul>
<li><p><strong>Challenge:</strong> These were decades-old records with faded text and uneven scans.</p>
</li>
<li><p><strong>Grooper’s Solution:</strong> I fine-tuned <strong>OCR settings</strong>, applied <strong>image cleanup filters</strong>, and set up secondary validation rules for critical fields.</p>
</li>
<li><p><strong>Result:</strong> Even for documents that were almost unreadable, Grooper could extract 80–85% of key data without human intervention — something I didn’t expect.</p>
</li>
</ul>
<h3 id="heading-4-automated-database-update"><strong>4. Automated Database Update</strong></h3>
<p>In one test, I built a <strong>pipeline that exported extracted data directly into an SQL database</strong>.</p>
<ul>
<li><p><strong>Challenge:</strong> Making sure field mapping matched the database schema.</p>
</li>
<li><p><strong>Grooper’s Solution:</strong> The <strong>Data Integration</strong> features allowed me to map each extracted field to the correct column automatically.</p>
</li>
<li><p><strong>Result:</strong> The database update process became entirely hands-free after initial setup.</p>
</li>
</ul>
<p>These experiments proved to me that BIS Grooper isn’t just a document reading tool — it’s a <strong>full-scale automation platform</strong>. Once trained properly, it can save hours of work and deliver consistent, high-quality results every single time.</p>
<h2 id="heading-challenges-amp-how-i-overcame-them">Challenges &amp; How I Overcame Them</h2>
<p>My one-month journey with BIS Grooper wasn’t all smooth sailing. While the platform is powerful, mastering it meant running into a few roadblocks — and learning how to solve them.</p>
<ul>
<li><h3 id="heading-1-understanding-the-logic-behind-content-models"><strong>1. Understanding the Logic Behind Content Models</strong></h3>
<ul>
<li><p><strong>Challenge:</strong> In the first week, I struggled to understand how <strong>Content Models</strong> interact with <strong>Data Fields</strong> and <strong>Pipelines</strong>. Sometimes I’d build a pipeline that ran without errors… but extracted nothing.</p>
</li>
<li><p><strong>Solution:</strong> I spent time in the <strong>Grooper Documentation</strong> and experimented with small, controlled datasets to isolate the problem. By breaking workflows into smaller parts, I learned exactly how each component affects the final output.</p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-2-regex-overload"><strong>2. Regex Overload</strong></h3>
<ul>
<li><p><strong>Challenge:</strong> While <strong>Regular Expressions</strong> are powerful for extraction, they can quickly become complicated. I found myself stuck when patterns didn’t work for slightly different document layouts.</p>
</li>
<li><p><strong>Solution:</strong> I built modular Regex rules — smaller, simpler patterns combined logically — instead of one giant pattern. This made them easier to debug and maintain.</p>
</li>
</ul>
<h3 id="heading-3-ocr-accuracy-on-poor-quality-scans"><strong>3. OCR Accuracy on Poor-Quality Scans</strong></h3>
<ul>
<li><p><strong>Challenge:</strong> Low-resolution or skewed documents led to OCR errors, missing characters, and incorrect numbers.</p>
</li>
<li><p><strong>Solution:</strong> I learned to use <strong>Image Processing Features</strong> inside Grooper — deskew, despeckle, contrast adjustment — before running OCR. Accuracy improved dramatically.</p>
</li>
</ul>
<h3 id="heading-4-dropdown-binding-with-lexicon-amp-lookups"><strong>4. Dropdown Binding with Lexicon &amp; Lookups</strong></h3>
<ul>
<li><p><strong>Challenge:</strong> Setting up dropdowns that dynamically bind to a <strong>Lexicon</strong> or data source was trickier than expected. Initially, I couldn’t get the list values to appear correctly in the Data Review Panel.</p>
</li>
<li><p><strong>Solution:</strong> I learned how to properly configure <strong>Lexicon</strong>, map them to fields, and ensure the dropdowns auto-populate. This improved validation speed for human reviewers.</p>
</li>
</ul>
<h3 id="heading-5-database-amp-xml-lookups-xpath"><strong>5. Database &amp; XML Lookups (XPath)</strong></h3>
<ul>
<li><p><strong>Challenge:</strong> Performing <strong>DB Lookups</strong> and <strong>XML Lookups</strong> (especially using <strong>XPath Expression</strong>) was another steep learning point. At first, my queries either returned no results or incorrect matches.</p>
</li>
<li><p><strong>Solution:</strong></p>
<ul>
<li><p>For <strong>DB Lookup</strong>, I ensured the database connection string was correct, set the right query parameters, and used Grooper’s field binding to dynamically pass extracted values.</p>
</li>
<li><p>For <strong>XML Lookup</strong>, I studied <strong>XPath syntax</strong> in depth — learning how to target exact nodes even in deeply nested structures. Once I mastered conditions, attribute selection, and node traversal, my lookups became precise and reliable.<strong>5. Database &amp; XML Lookups (XPath)</strong></p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-6-learning-curve-fatigue"><strong>6. Learning Curve Fatigue</strong></h3>
<ul>
<li><p><strong>Challenge:</strong> Grooper has a steep learning curve if you’re new to document automation.</p>
</li>
<li><p><strong>Solution:</strong> I adopted a “one feature at a time” approach instead of trying to learn everything at once. This kept me motivated and allowed me to apply what I learned immediately.</p>
</li>
</ul>
<p>Overcoming these challenges didn’t just help me understand BIS Grooper better — it gave me the confidence to work with <strong>dynamic data sources</strong>, <strong>integrations</strong>, and <strong>advanced lookups</strong>, which are critical for real-world automation workflows.</p>
<h2 id="heading-conclusion-amp-next-steps">Conclusion &amp; Next Steps</h2>
<p>My first month with BIS Grooper has been both <strong>challenging and rewarding</strong>. I started with zero practical experience in advanced document processing, and now I can confidently build <strong>content models, perform lookups, bind dropdowns to lexicons, and execute precise XPath queries</strong>.</p>
<p>What stands out about Grooper is its <strong>flexibility</strong> — it’s not just an OCR tool, but a <strong>complete document automation platform</strong>. From cleaning poor-quality scans to integrating with databases and XML sources, I’ve learned that success comes from <strong>understanding the logic behind each component</strong> and combining them into a smooth workflow.</p>
]]></content:encoded></item><item><title><![CDATA[🤖 Getting Started with AI in .NET]]></title><description><![CDATA[Build intelligent apps by combining .NET with AI power!
📌 Why Use AI in .NET?
With frameworks like ML.NET, Azure Cognitive Services, and OpenAI APIs, .NET developers can easily integrate AI features such as:✅ Text generation✅ Sentiment analysis✅ Ima...]]></description><link>https://blog.hsnits.pro/getting-started-with-ai-in-net</link><guid isPermaLink="true">https://blog.hsnits.pro/getting-started-with-ai-in-net</guid><category><![CDATA[Build intelligent apps by combining .NET with AI power!]]></category><dc:creator><![CDATA[Has]]></dc:creator><pubDate>Wed, 07 Aug 2024 18:30:00 GMT</pubDate><content:encoded><![CDATA[<p>Build intelligent apps by combining .NET with AI power!</p>
<h2 id="heading-why-use-ai-in-net">📌 Why Use AI in .NET?</h2>
<p>With frameworks like <a target="_blank" href="http://ML.NET"><strong>ML.NET</strong></a>, <strong>Azure Cognitive Services</strong>, and <strong>OpenAI APIs</strong>, .NET developers can easily integrate AI features such as:<br />✅ Text generation<br />✅ Sentiment analysis<br />✅ Image recognition<br />✅ Chatbots</p>
<hr />
<h2 id="heading-ways-to-use-ai-in-net">🛠️ Ways to Use AI in .NET</h2>
<h3 id="heading-1-mlnethttpmlnet">1️⃣ <a target="_blank" href="http://ML.NET"><strong>ML.NET</strong></a></h3>
<p><a target="_blank" href="http://ML.NET">ML.NET</a> is Microsoft’s open-source machine learning framework for .NET developers.</p>
<p>✅ Train and use ML models <strong>directly in C# or F#</strong>.<br />✅ No need to learn Python!</p>
<p>Example: Predicting product sales using regression models.</p>
<hr />
<h3 id="heading-2-azure-cognitive-services">2️⃣ <strong>Azure Cognitive Services</strong></h3>
<p>Microsoft’s pre-built AI APIs for:<br />✔ Vision (Face, OCR)<br />✔ Speech (Text-to-Speech, Speech-to-Text)<br />✔ Language (Translation, Sentiment)</p>
<p>Example Code (C#):</p>
<pre><code class="lang-sql">csharpCopyEditvar client = new TextAnalyticsClient(new Uri(endpoint), new AzureKeyCredential(key));
var response = await client.AnalyzeSentimentAsync("I love Hashnode blogs!");
Console.WriteLine(response.Value.Sentiment);
</code></pre>
<hr />
<h3 id="heading-3-using-openai-api-in-net">3️⃣ <strong>Using OpenAI API in .NET</strong></h3>
<p>Integrate ChatGPT or DALL·E into your apps!</p>
<pre><code class="lang-sql">csharpCopyEditvar openAI = new OpenAIAPI("your_api_key");
var result = await openAI.Completions.CreateCompletionAsync("Write a blog about .NET AI");
Console.WriteLine(result);
</code></pre>
<hr />
<h2 id="heading-real-world-use-cases">🚀 Real-World Use Cases</h2>
<p>✅ AI Chatbots for customer support<br />✅ Recommendation engines in e-commerce apps<br />✅ Automated document analysis using OCR</p>
<hr />
<h2 id="heading-final-thoughts">🎯 Final Thoughts</h2>
<p>AI is <strong>no longer just for data scientists</strong> – with .NET, you can easily bring AI to your applications!</p>
<p>💡 <em>Start with</em> <a target="_blank" href="http://ML.NET"><em>ML.NET</em></a> <em>for simple tasks, and move to Azure/OpenAI for advanced AI features.</em></p>
]]></content:encoded></item><item><title><![CDATA[From Query to Performance – A Guide to SQL Execution Plans]]></title><description><![CDATA[Master SQL performance by learning how to read and use execution plans effectively!
What is an Execution Plan?
When you run a query, SQL Server’s query optimizer decides the best way to fetch data.The Execution Plan is like a roadmap – it shows how S...]]></description><link>https://blog.hsnits.pro/executionplans-sql</link><guid isPermaLink="true">https://blog.hsnits.pro/executionplans-sql</guid><category><![CDATA[Execution Plans]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[Has]]></dc:creator><pubDate>Tue, 11 Oct 2022 18:30:00 GMT</pubDate><content:encoded><![CDATA[<p>Master SQL performance by learning how to read and use execution plans effectively!</p>
<h2 id="heading-what-is-an-execution-plan">What is an Execution Plan?</h2>
<p>When you run a query, SQL Server’s <strong>query optimizer</strong> decides the best way to fetch data.<br />The <strong>Execution Plan</strong> is like a roadmap – it shows how SQL will access tables, use indexes, and perform joins.</p>
<h2 id="heading-types-of-execution-plans">Types of Execution Plans</h2>
<p>1.Estimated Execution Plan (Ctrl+L)</p>
<p>2.Actual Execution Plan (Ctrl+M)</p>
<h2 id="heading-common-operators">Common Operators</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Operator</strong></td><td><strong>Meaning</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>Index Seek</strong> ✅</td><td>Uses index efficiently → Fast query</td></tr>
<tr>
<td><strong>Index Scan</strong> ⚠️</td><td>Reads many rows → Slower than Index Seek</td></tr>
<tr>
<td><strong>Table Scan</strong> ⚠️</td><td>Reads entire table → Very slow</td></tr>
<tr>
<td><strong>Key Lookup</strong> 🔄</td><td>Fetches extra columns not in index</td></tr>
<tr>
<td>Nested Loops / Merge Join / Hash Join</td><td>Shows how tables are joined</td></tr>
</tbody>
</table>
</div><h2 id="heading-how-to-view-in-ssms">🛠️ How to View in SSMS</h2>
<ol>
<li><p>Open <strong>SQL Server Management Studio (SSMS)</strong></p>
</li>
<li><p>Click <strong>Include Actual Execution Plan (Ctrl + M)</strong></p>
</li>
<li><p>Run your query</p>
</li>
<li><p>A new <strong>Execution Plan tab</strong> appears with graphical steps</p>
</li>
</ol>
<pre><code class="lang-sql"><span class="hljs-keyword">SELECT</span> FirstName, LastName 
<span class="hljs-keyword">FROM</span> Employees 
<span class="hljs-keyword">WHERE</span> DepartmentID = <span class="hljs-number">2</span>;
</code></pre>
<p>🔹 If <strong>DepartmentID</strong> is indexed → Execution Plan shows <strong>Index Seek (fast)</strong>.<br />🔹 Without index → Execution Plan shows <strong>Table Scan (slow)</strong>.</p>
<h2 id="heading-tips-to-optimize-queries">⚡ Tips to Optimize Queries</h2>
<p>✅ Add proper indexes for frequently used columns in <code>WHERE</code>, <code>JOIN</code>, and <code>ORDER BY</code>.<br />✅ Avoid <code>SELECT *</code>, fetch only required columns.<br />✅ Check for <strong>Missing Index warnings</strong> in the plan.<br />✅ Review operators with the <strong>highest cost percentage</strong>.</p>
<h2 id="heading-why-execution-plans-matter">🚀 Why Execution Plans Matter</h2>
<p>✔ Help <strong>identify bottlenecks</strong> in queries.<br />✔ Show if SQL is <strong>using indexes efficiently</strong>.<br />✔ Provide hints for <strong>query optimization</strong>.</p>
<p>💡 <em>Next time your query is slow, open the Execution Plan – it’s your best friend for performance tuning!</em></p>
]]></content:encoded></item></channel></rss>