<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AYON</title>
    <description>The latest articles on DEV Community by AYON (@ayon_ssp).</description>
    <link>https://dev.to/ayon_ssp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F815741%2F788add60-e5c0-4b74-a86a-3284776ad784.png</url>
      <title>DEV Community: AYON</title>
      <link>https://dev.to/ayon_ssp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayon_ssp"/>
    <language>en</language>
    <item>
      <title>👮🏻‍♂️ JWT Logout: What “Stateless” Really Means in Production</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Fri, 27 Mar 2026 18:47:14 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/jwt-logout-what-stateless-really-means-in-production-183g</link>
      <guid>https://dev.to/ayon_ssp/jwt-logout-what-stateless-really-means-in-production-183g</guid>
      <description>&lt;p&gt;JWT authentication is often introduced with one powerful idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is stateless.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds great for scalability, but it leads to a very practical question every backend engineer faces:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do you log out a user if there is no session on the server?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s break this down clearly and practically.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔑 First, the Core Idea
&lt;/h2&gt;

&lt;p&gt;A JWT (JSON Web Token) is stateless, meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The server does NOT store session data&lt;/li&gt;
&lt;li&gt;Once issued, the token is valid until it expires&lt;/li&gt;
&lt;li&gt;The server only verifies signature and expiry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 So technically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗ You cannot directly "log out" a JWT like a session&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the key mindset shift. Logout is no longer about deleting something on the server.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Then What Does Logout Mean?
&lt;/h2&gt;

&lt;p&gt;In JWT-based systems, logout becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Preventing further use of an already issued token&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no single built-in solution. Instead, we use design patterns with different trade-offs.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Practical Strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ 🔥 Client-Side Logout (Most Common Starting Point)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove token from client storage (localStorage, cookies, memory)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accessToken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client stops sending the token&lt;/li&gt;
&lt;li&gt;User appears logged out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token is still valid on the server until expiry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is called &lt;strong&gt;soft logout&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✔ Simple&lt;br&gt;
❌ Not secure for sensitive systems&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ ⏳ Short-Lived Access Tokens + Refresh Tokens (Industry Standard)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access token → short expiry (for example 10 to 15 minutes)&lt;/li&gt;
&lt;li&gt;Refresh token → long-lived and stored securely (DB or HTTP-only cookie)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Logout flow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete or invalidate the refresh token&lt;/li&gt;
&lt;li&gt;Access token expires naturally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is the most widely used approach in production systems&lt;/p&gt;

&lt;p&gt;✔ Secure&lt;br&gt;
✔ Scalable&lt;br&gt;
✔ Balanced design&lt;/p&gt;




&lt;h3&gt;
  
  
  3️⃣ 🚫 Token Blacklisting (Server-Side Control)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store invalidated tokens or token IDs in DB or Redis
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;blacklist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"jwt-id-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jwt-id-456"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;On every request, check if the token is blacklisted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Logout flow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add token to blacklist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This introduces state into the system&lt;/p&gt;

&lt;p&gt;✔ Immediate logout&lt;br&gt;
❌ Extra lookup on every request&lt;br&gt;
❌ More operational complexity&lt;/p&gt;




&lt;h3&gt;
  
  
  4️⃣ 🔄 Token Versioning (Clean and Scalable Trick)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store a &lt;code&gt;tokenVersion&lt;/code&gt; per user in the database&lt;/li&gt;
&lt;li&gt;Include this version inside the JWT
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tokenVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Logout flow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increment &lt;code&gt;tokenVersion&lt;/code&gt; in DB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On request&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compare token version with DB value&lt;/li&gt;
&lt;li&gt;If mismatch, reject the token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔ Efficient&lt;br&gt;
✔ No need to track every token&lt;br&gt;
❌ Requires a DB read&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Real-World Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Stateless&lt;/th&gt;
&lt;th&gt;Secure&lt;/th&gt;
&lt;th&gt;Used in production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client delete only&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Rare (low-risk apps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Short-lived + refresh&lt;/td&gt;
&lt;td&gt;⚠️ partially&lt;/td&gt;
&lt;td&gt;✅✅&lt;/td&gt;
&lt;td&gt;✅ MOST COMMON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blacklist&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Sometimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token versioning&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚖️ What Senior Engineers Actually Do
&lt;/h2&gt;

&lt;p&gt;A common mistake is trying to keep systems “purely stateless”.&lt;/p&gt;

&lt;p&gt;In reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security requires control&lt;/li&gt;
&lt;li&gt;Control introduces some form of state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of chasing statelessness, experienced engineers focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimizing state&lt;/li&gt;
&lt;li&gt;Containing it where necessary&lt;/li&gt;
&lt;li&gt;Keeping the system scalable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧾 Final Takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;JWT does not provide logout out of the box&lt;/li&gt;
&lt;li&gt;Logout is a system design decision&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The most practical approach is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short-lived access tokens&lt;/li&gt;
&lt;li&gt;Controlled refresh tokens&lt;/li&gt;
&lt;li&gt;Optional revocation mechanisms when needed&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Stateless authentication is a powerful concept, but real-world systems are always a balance between stateless design and controlled state.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 Interview-Ready Answer
&lt;/h2&gt;

&lt;p&gt;If you want to explain this concisely:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;JWTs are stateless, so logout cannot be handled directly on the server. In practice, we use short-lived access tokens with refresh tokens. On logout, we invalidate the refresh token and let the access token expire. For immediate revocation, we can use token blacklisting or versioning, which introduces some state.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;This is one of those topics where understanding trade-offs matters more than memorizing definitions. That is what separates implementation-level knowledge from system design thinking.&lt;/p&gt;

&lt;p&gt;Happy system designing !!&lt;/p&gt;

</description>
      <category>jwt</category>
      <category>security</category>
    </item>
    <item>
      <title>🗂️ Designing a Scalable Category System for an E-Commerce App</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Fri, 06 Feb 2026 06:26:39 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/designing-a-scalable-category-system-for-an-e-commerce-app-4hkj</link>
      <guid>https://dev.to/ayon_ssp/designing-a-scalable-category-system-for-an-e-commerce-app-4hkj</guid>
      <description>&lt;p&gt;When building an e-commerce application, &lt;strong&gt;categories look simple at first&lt;/strong&gt; — until your product count grows and business asks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sub-categories
&lt;/li&gt;
&lt;li&gt;nested menus
&lt;/li&gt;
&lt;li&gt;breadcrumbs
&lt;/li&gt;
&lt;li&gt;SEO-friendly URLs
&lt;/li&gt;
&lt;li&gt;easy reordering
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This README explains a &lt;strong&gt;scalable, production-ready category design&lt;/strong&gt; used in real-world systems, without overengineering.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❌ The Common Mistake
&lt;/h2&gt;

&lt;p&gt;Many apps start with this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;categories
sub_categories
sub_sub_categories
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;strong&gt;breaks immediately&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you need more depth&lt;/li&gt;
&lt;li&gt;hierarchy changes&lt;/li&gt;
&lt;li&gt;queries become complex&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz3mydpzgob9em81iqi8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz3mydpzgob9em81iqi8.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ The Scalable Solution (Single Categories Table)
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;one table&lt;/strong&gt; with a self-reference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;categories&lt;/span&gt;
&lt;span class="c1"&gt;-----------&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt;          &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;        &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;slug&lt;/span&gt;        &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;
&lt;span class="n"&gt;parent_id&lt;/span&gt;   &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FK&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;level&lt;/span&gt;       &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;        &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sort_order&lt;/span&gt;  &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="n"&gt;is_active&lt;/span&gt;   &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt;
&lt;span class="n"&gt;created_at&lt;/span&gt;  &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;
&lt;span class="n"&gt;updated_at&lt;/span&gt;  &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This supports &lt;strong&gt;unlimited nesting&lt;/strong&gt; and clean queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌳 How Hierarchy Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Example structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Electronics
 └── Mobiles
      ├── Smartphones
      └── Feature Phones
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stored data&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;parent_id&lt;/th&gt;
&lt;th&gt;level&lt;/th&gt;
&lt;th&gt;path&lt;/th&gt;
&lt;th&gt;sort_order&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Electronics&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Mobiles&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1/2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Smartphones&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1/2/3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Feature Phones&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1/2/4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔑 Field Breakdown (The Important Part)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ &lt;strong&gt;slug&lt;/strong&gt; – URL-friendly identifier
&lt;/h3&gt;

&lt;p&gt;A slug is a readable string used in URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Smart Phones" → "smart-phones"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Used for:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="sr"&gt;/category/electronics/mobiles/&lt;/span&gt;&lt;span class="n"&gt;smart&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;phones&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why slugs matter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO friendly&lt;/li&gt;
&lt;li&gt;Stable URLs&lt;/li&gt;
&lt;li&gt;No exposed IDs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2️⃣ &lt;strong&gt;level&lt;/strong&gt; – Depth of the category
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;level&lt;/code&gt; tells how deep a category is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;
&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;
&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it exists:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show only top-level categories on homepage&lt;/li&gt;
&lt;li&gt;Restrict max depth&lt;/li&gt;
&lt;li&gt;Simple filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Query example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3️⃣ &lt;strong&gt;path&lt;/strong&gt; – Full hierarchy (Materialized Path)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;path&lt;/code&gt; stores the &lt;strong&gt;entire lineage&lt;/strong&gt; from root → current node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Electronics&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Mobiles&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nc"&gt;Smartphones&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1/2/3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's powerful:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch entire subtrees &lt;strong&gt;without recursion&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Build breadcrumbs easily&lt;/li&gt;
&lt;li&gt;Generate SEO URLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Query example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'1/2/%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4️⃣ &lt;strong&gt;sort_order&lt;/strong&gt; – Display control (NOT hierarchy)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sort_order&lt;/code&gt; controls how categories appear in UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without it&lt;/strong&gt; → unpredictable order&lt;br&gt;&lt;br&gt;
&lt;strong&gt;With it&lt;/strong&gt; → business-controlled order&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;sort_order&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Used for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navbar ordering&lt;/li&gt;
&lt;li&gt;Featured categories&lt;/li&gt;
&lt;li&gt;Seasonal rearrangements&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Why Use &lt;code&gt;level&lt;/code&gt; + &lt;code&gt;path&lt;/code&gt; Together?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;level&lt;/th&gt;
&lt;th&gt;path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Top-level filtering&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max depth validation&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subtree queries&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breadcrumbs&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO URLs&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;They solve different problems, not duplication.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌟 Product Association
&lt;/h2&gt;

&lt;p&gt;Products usually belong to the &lt;strong&gt;leaf category&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="n"&gt;slug&lt;/span&gt;
&lt;span class="n"&gt;price&lt;/span&gt;
&lt;span class="n"&gt;category_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Business Superpower — Multi-Level Product Visibility
&lt;/h2&gt;

&lt;p&gt;A product usually belongs to the &lt;strong&gt;deepest (leaf) category&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Electronics → Mobiles → Smartphones  
                        ↑  
                 Samsung Galaxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But customers may browse or search from &lt;strong&gt;any level&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They might open:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Electronics
&lt;/li&gt;
&lt;li&gt;Mobiles
&lt;/li&gt;
&lt;li&gt;Smartphones
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 In &lt;strong&gt;all&lt;/strong&gt; cases, the product should appear.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 How This Design Enables It
&lt;/h2&gt;

&lt;p&gt;Because each category stores its &lt;strong&gt;path&lt;/strong&gt;, we instantly know all its ancestors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Smartphones → path = "1/2/3"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the product automatically belongs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; → Electronics
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1/2&lt;/code&gt; → Mobiles
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1/2/3&lt;/code&gt; → Smartphones
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No extra mapping tables.&lt;br&gt;&lt;br&gt;
No complex recursion.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ Example Queries
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Show products under &lt;strong&gt;Mobiles&lt;/strong&gt; (including all children)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'1/2/%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This returns items from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smartphones&lt;/li&gt;
&lt;li&gt;Feature Phones&lt;/li&gt;
&lt;li&gt;any future subcategory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Show products under Electronics&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'1/%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom 💥&lt;br&gt;
Entire department.&lt;/p&gt;
&lt;h2&gt;
  
  
  💰 Business Advantages
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ✅ Better product discovery
&lt;/h3&gt;

&lt;p&gt;Users don’t need perfect navigation.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Faster search &amp;amp; filtering
&lt;/h3&gt;

&lt;p&gt;No recursive joins required.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Powerful marketing pages
&lt;/h3&gt;

&lt;p&gt;Create pages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Best Mobiles”&lt;/li&gt;
&lt;li&gt;“Top Electronics Deals”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ✅ Smarter recommendations &amp;amp; ads
&lt;/h3&gt;

&lt;p&gt;Target an entire branch of the catalog.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Future proof
&lt;/h3&gt;

&lt;p&gt;Add deeper levels anytime → queries still work.&lt;/p&gt;


&lt;h2&gt;
  
  
  🏪 Real Outcome
&lt;/h2&gt;

&lt;p&gt;If a &lt;strong&gt;Samsung Galaxy s23 FE&lt;/strong&gt; is stored in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Electronics → Mobiles → Smartphones
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will automatically appear in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Electronics listing
&lt;/li&gt;
&lt;li&gt;Mobiles listing
&lt;/li&gt;
&lt;li&gt;Smartphones listing
&lt;/li&gt;
&lt;li&gt;search results
&lt;/li&gt;
&lt;li&gt;recommendations
&lt;/li&gt;
&lt;li&gt;breadcrumbs
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✨ without extra logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 Final Recommendation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Single &lt;code&gt;categories&lt;/code&gt; table&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;parent_id&lt;/code&gt; for structure&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;level&lt;/code&gt; for depth logic&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;path&lt;/code&gt; for fast reads&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;slug&lt;/code&gt; for clean URLs&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;sort_order&lt;/code&gt; for UI control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This design scales from startup MVP → large marketplace without schema changes.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Interview One-Liner
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A scalable category system uses a self-referencing table with materialized paths to support unlimited depth, fast reads, clean URLs, and UI-controlled ordering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you liked this design, feel free to ⭐ the repo or reuse it in your project.&lt;/p&gt;

&lt;p&gt;Happy building 🚀&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>database</category>
      <category>ecommer</category>
    </item>
    <item>
      <title>☁️ Cloud Computing Service Models – AWS</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Wed, 15 Oct 2025 06:05:30 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/cloud-computing-service-models-aws-4pn8</link>
      <guid>https://dev.to/ayon_ssp/cloud-computing-service-models-aws-4pn8</guid>
      <description>&lt;p&gt;In &lt;strong&gt;cloud computing&lt;/strong&gt;, service models define how resources and services are delivered to users.&lt;br&gt;&lt;br&gt;
The three primary service models are:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Infrastructure as a Service (IaaS)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Provides virtualized computing resources over the internet. Users can rent servers, storage, and networking infrastructure without owning physical hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete control over infrastructure (OS, runtime, apps)
&lt;/li&gt;
&lt;li&gt;Highly scalable and flexible
&lt;/li&gt;
&lt;li&gt;Pay-as-you-go pricing
&lt;/li&gt;
&lt;li&gt;Ideal for sysadmins, DevOps, and IT teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples in AWS:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🖥️ Amazon EC2 – Virtual servers (compute)
&lt;/li&gt;
&lt;li&gt;💾 Amazon S3 – Object storage
&lt;/li&gt;
&lt;li&gt;🛜 Amazon VPC – Virtual networking
&lt;/li&gt;
&lt;li&gt;📦 Amazon EBS – Block storage
&lt;/li&gt;
&lt;li&gt;🔐 AWS IAM – Access control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Use Case:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hosting web applications
&lt;/li&gt;
&lt;li&gt;Running enterprise workloads
&lt;/li&gt;
&lt;li&gt;Creating testing and development environments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Platform as a Service (PaaS)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Provides a platform with pre-configured environments for building, testing, and deploying applications without managing underlying infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers focus on application logic, not infrastructure
&lt;/li&gt;
&lt;li&gt;Auto-scaling and easy deployment
&lt;/li&gt;
&lt;li&gt;Integrated development tools and frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples in AWS:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧱 AWS Elastic Beanstalk – Deploy and manage apps easily
&lt;/li&gt;
&lt;li&gt;🧪 AWS Lambda (serverless) – Run code without managing servers
&lt;/li&gt;
&lt;li&gt;🗄️ Amazon RDS – Managed relational database service
&lt;/li&gt;
&lt;li&gt;🔔 Amazon API Gateway – Build and manage APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Use Case:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building scalable web apps quickly
&lt;/li&gt;
&lt;li&gt;Continuous deployment pipelines
&lt;/li&gt;
&lt;li&gt;Serverless application development&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Software as a Service (SaaS)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Delivers fully functional software over the internet on a subscription basis. The provider manages everything (infrastructure, platform, app, security).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ready-to-use applications
&lt;/li&gt;
&lt;li&gt;No installation or maintenance
&lt;/li&gt;
&lt;li&gt;Accessible from any device via browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples in AWS:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💻 Amazon WorkMail – Business email service
&lt;/li&gt;
&lt;li&gt;🧑‍💼 Amazon Chime – Online meetings and communication
&lt;/li&gt;
&lt;li&gt;📊 Third-party SaaS apps hosted on AWS (e.g., Salesforce, Zoom)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Use Case:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email services, CRM, collaboration tools
&lt;/li&gt;
&lt;li&gt;Productivity and business software&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;IaaS&lt;/th&gt;
&lt;th&gt;PaaS&lt;/th&gt;
&lt;th&gt;SaaS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control Level&lt;/td&gt;
&lt;td&gt;High (infra &amp;amp; OS)&lt;/td&gt;
&lt;td&gt;Medium (app only)&lt;/td&gt;
&lt;td&gt;Low (end-user access)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target User&lt;/td&gt;
&lt;td&gt;IT Admin, DevOps&lt;/td&gt;
&lt;td&gt;Developers&lt;/td&gt;
&lt;td&gt;End Users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Example in AWS&lt;/td&gt;
&lt;td&gt;EC2, S3, VPC&lt;/td&gt;
&lt;td&gt;Elastic Beanstalk, Lambda, RDS&lt;/td&gt;
&lt;td&gt;WorkMail, Chime, Salesforce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Manual or auto scaling&lt;/td&gt;
&lt;td&gt;Auto-scaling built-in&lt;/td&gt;
&lt;td&gt;Provider managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;User-managed&lt;/td&gt;
&lt;td&gt;Shared&lt;/td&gt;
&lt;td&gt;Provider-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏁 Additional Models (Emerging)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function as a Service (FaaS)&lt;/strong&gt; — e.g., AWS Lambda (a part of PaaS but more fine-grained)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container as a Service (CaaS)&lt;/strong&gt; — e.g., Amazon ECS and Amazon EKS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IaaS&lt;/strong&gt; → You manage everything except hardware
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PaaS&lt;/strong&gt; → You manage code and data only
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SaaS&lt;/strong&gt; → You just use the software&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>🌟 Modern Global Exception Handling in Spring Boot</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Wed, 17 Sep 2025 08:18:50 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/modern-global-exception-handling-in-spring-boot-43aj</link>
      <guid>https://dev.to/ayon_ssp/modern-global-exception-handling-in-spring-boot-43aj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Exception handling is essential for building robust, user-friendly APIs. With Spring Boot, you can centralize error handling using a &lt;strong&gt;Global Exception Handler&lt;/strong&gt; and custom exceptions for clean, maintainable code. This guide shows you how to set up a modern global exception handler, create a custom exception, and use them in a controller—all in a way that's easy to understand and quick to implement.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Create a Custom Exception: &lt;code&gt;ResourceNotFoundException&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A custom exception helps you signal specific error cases (like a missing resource) in your business logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// filepath: src/main/java/com/example/exception/ResourceNotFoundException.java&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.exception&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Thrown when a requested resource is not found.
 */&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResourceNotFoundException&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ResourceNotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Implement a Global Exception Handler
&lt;/h2&gt;

&lt;p&gt;Centralize your error handling for all controllers. This example uses a modern response format and logs errors for debugging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// filepath: src/main/java/com/example/exception/GlobalExceptionHandler.java&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.exception&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.utils.ApiResponse&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.extern.slf4j.Slf4j&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.HttpStatus&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.MethodArgumentNotValidException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.RestControllerAdvice&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.time.Instant&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.stream.Collectors&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Slf4j&lt;/span&gt;
&lt;span class="nd"&gt;@RestControllerAdvice&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GlobalExceptionHandler&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Handle Resource Not Found exceptions&lt;/span&gt;
    &lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResourceNotFoundException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleResourceNotFound&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResourceNotFoundException&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"RESOURCE_NOT_FOUND"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOT_FOUND&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Handle validation errors&lt;/span&gt;
    &lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MethodArgumentNotValidException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleValidation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MethodArgumentNotValidException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBindingResult&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAllErrors&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;errorDetail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
                &lt;span class="n"&gt;errorDetail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FieldError&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getField&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                &lt;span class="n"&gt;errorDetail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultMessage&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;errorDetail&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;})&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Meta&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Meta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;Instant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
            &lt;span class="no"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;randomUUID&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
            &lt;span class="s"&gt;"1.0"&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;
            &lt;span class="s"&gt;"fail"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"Validation error!"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="kc"&gt;null&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UNPROCESSABLE_ENTITY&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@ExceptionHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleGenericException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Internal Server Error: {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"INTERNAL_SERVER_ERROR"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HttpStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INTERNAL_SERVER_ERROR&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Example Controller Using the Exception
&lt;/h2&gt;

&lt;p&gt;Here’s a simple controller method that demonstrates how the custom exception and global handler work together.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Service logic is placed in the controller for demonstration.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Best Practice:&lt;/strong&gt; Move business logic to a service class for maintainability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// filepath: src/main/java/com/example/controller/CategoryController.java&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.controller&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.entity.Category&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.exception.ResourceNotFoundException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.utils.ApiResponse&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.http.ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.web.bind.annotation.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Arrays&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/v1/categories"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CategoryController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Example GET endpoint with inline logic for demonstration.&lt;/span&gt;
    &lt;span class="c1"&gt;// Best Practice: Move this logic to a service class!&lt;/span&gt;
    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Category&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getCategoryById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Category&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Category&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Fruits"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Fresh fruits"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/images/fruits.png"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Category&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2L&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Vegetables"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Green veggies"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/images/veggies.png"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Category&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findFirst&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElseThrow&lt;/span&gt;&lt;span class="o"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResourceNotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Category not found with id: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Category retrieved successfully"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Sample Error Response
&lt;/h2&gt;

&lt;p&gt;When a category is not found, the API returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Validation error!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Category name is required"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-09-17T12:34:56Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requestId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1a2c3d4-e5f6-7890-abcd-ef1234567890"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Centralize exception handling&lt;/strong&gt; with &lt;code&gt;@RestControllerAdvice&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use custom exceptions&lt;/strong&gt; for clear, domain-specific errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep business logic in service classes&lt;/strong&gt; for clean controllers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Return structured error responses&lt;/strong&gt; for easy client integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log errors&lt;/strong&gt; for debugging and monitoring.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With a global exception handler and custom exceptions, your Spring Boot API will be easier to maintain, debug, and consume.&lt;br&gt;&lt;br&gt;
Start with the patterns above and adapt them to your project for a modern, professional backend!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you found this guide helpful, share it with your team or star your repository!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>spring</category>
      <category>adventofcode</category>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Steps to Migrate to Google Play App Signing</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Thu, 24 Jul 2025 09:04:37 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/steps-to-migrate-to-google-play-app-signing-770</link>
      <guid>https://dev.to/ayon_ssp/steps-to-migrate-to-google-play-app-signing-770</guid>
      <description>&lt;p&gt;Follow these steps to migrate an existing published app from manual signing to &lt;strong&gt;Google Play App Signing&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 1. Back Up Your Current Key
&lt;/h2&gt;

&lt;p&gt;Securely store your existing signing credentials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keystore file:&lt;/strong&gt; &lt;code&gt;key.jks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keystore password&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key alias&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key password&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; Keep a safe backup of these credentials. You’ll need them during the migration.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ 2. Export Your App Signing Key (PEPK)
&lt;/h2&gt;

&lt;p&gt;Google requires an encrypted export of your current signing key.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Play Console, go to:
&lt;strong&gt;Setup → App integrity → App signing.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &lt;strong&gt;“Export and upload your app signing key”&lt;/strong&gt;, download:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pepk.jar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;encryption key&lt;/strong&gt; (displayed in the instructions).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the following command in your terminal (replace placeholders):&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; pepk.jar &lt;span class="nt"&gt;--keystore&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;key.jks &lt;span class="nt"&gt;--alias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-alias&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;output.zip &lt;span class="nt"&gt;--encryption-key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;Google-encryption-key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates output.zip containing your encrypted signing key.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ 3. Upload the Key to Google Play
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open Play Console and navigate to:
&lt;strong&gt;Setup → App integrity → App signing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Opt in to Play App Signing&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Upload the &lt;code&gt;output.zip&lt;/code&gt; file generated in the previous step.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ 4. Wait for Google to Process
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google will verify the uploaded key.&lt;/li&gt;
&lt;li&gt;Once approved, &lt;strong&gt;Google Play App Signing&lt;/strong&gt; becomes active.&lt;/li&gt;
&lt;li&gt;From now on, Google securely manages your app signing key.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Note:&lt;/strong&gt; Your existing keystore (&lt;code&gt;key.jks&lt;/code&gt;) will now act as your &lt;strong&gt;Upload Key&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
You can continue using it or optionally register a new upload key.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✨ (Optional) Generate a New Upload Key
&lt;/h2&gt;

&lt;p&gt;For additional security, you can generate a new upload key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;keytool &lt;span class="nt"&gt;-genkey&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-keystore&lt;/span&gt; upload-key.jks &lt;span class="nt"&gt;-keyalg&lt;/span&gt; RSA &lt;span class="nt"&gt;-keysize&lt;/span&gt; 2048 &lt;span class="nt"&gt;-validity&lt;/span&gt; 10000 &lt;span class="nt"&gt;-alias&lt;/span&gt; upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Export the public certificate (.pem) from this new keystore.&lt;/li&gt;
&lt;li&gt;Upload the certificate in Play Console as your new upload key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📌 Summary
&lt;/h2&gt;

&lt;p&gt;✔️ &lt;strong&gt;Backup your keystore&lt;/strong&gt; (&lt;code&gt;key.jks&lt;/code&gt;, alias, and passwords).&lt;br&gt;&lt;br&gt;
✔️ &lt;strong&gt;Export your signing key&lt;/strong&gt; using &lt;code&gt;pepk.jar&lt;/code&gt; from the Play Console.&lt;br&gt;&lt;br&gt;
✔️ &lt;strong&gt;Upload the encrypted key&lt;/strong&gt; (&lt;code&gt;output.zip&lt;/code&gt;) in &lt;strong&gt;Play Console → App Signing&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
✔️ &lt;em&gt;(Optional)&lt;/em&gt; &lt;strong&gt;Generate and register a new upload key&lt;/strong&gt; for added security.&lt;/p&gt;

&lt;p&gt;✅ Your app is now successfully migrated and managed by &lt;strong&gt;Google Play App Signing&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>android</category>
      <category>security</category>
    </item>
    <item>
      <title>📱From APK to .aab: Master the Modern Way to Build &amp; Ship Android Apps</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Thu, 26 Jun 2025 12:45:38 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/from-apk-to-aab-master-the-modern-way-to-build-ship-android-apps-3e7m</link>
      <guid>https://dev.to/ayon_ssp/from-apk-to-aab-master-the-modern-way-to-build-ship-android-apps-3e7m</guid>
      <description>&lt;h1&gt;
  
  
  📦 What is an Android App Bundle (&lt;code&gt;.aab&lt;/code&gt;)?
&lt;/h1&gt;

&lt;p&gt;An &lt;strong&gt;App Bundle&lt;/strong&gt; (&lt;code&gt;.aab&lt;/code&gt;) is the official publishing format for Android apps on the &lt;strong&gt;Google Play Store&lt;/strong&gt;, replacing the older APK format for new apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 What is an App Bundle?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;App Bundle&lt;/strong&gt; is a &lt;strong&gt;publishing format&lt;/strong&gt; that includes all your app’s compiled code, resources, and assets — but it &lt;strong&gt;defers APK generation and signing to Google Play&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rather than shipping a single monolithic APK, the &lt;code&gt;.aab&lt;/code&gt; allows Google Play to create and serve &lt;strong&gt;optimized APKs&lt;/strong&gt; tailored for each user’s device configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Why Use an App Bundle?
&lt;/h2&gt;

&lt;p&gt;Google Play uses &lt;strong&gt;Dynamic Delivery&lt;/strong&gt; to generate and deliver only the necessary code and resources to a user’s device.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Smaller &lt;strong&gt;download sizes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Smaller &lt;strong&gt;installed app sizes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Faster &lt;strong&gt;installation times&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Less &lt;strong&gt;storage usage&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Example
&lt;/h2&gt;

&lt;p&gt;Let’s say your app supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ARM and x86 architectures&lt;/li&gt;
&lt;li&gt;Multiple screen densities&lt;/li&gt;
&lt;li&gt;Multiple languages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of including everything in one APK, Play Store builds a &lt;strong&gt;custom APK&lt;/strong&gt; for each user — e.g., only ARM64 architecture + English language + xxhdpi screen resources — reducing the total size significantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 App Bundle vs APK
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;.apk&lt;/code&gt; (Android Package)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;.aab&lt;/code&gt; (App Bundle)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;Final, installable package&lt;/td&gt;
&lt;td&gt;Upload format for Play Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contains&lt;/td&gt;
&lt;td&gt;All resources and architectures&lt;/td&gt;
&lt;td&gt;Modular resources and code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload to Play Store&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes (mandatory for new apps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install Locally&lt;/td&gt;
&lt;td&gt;✅ Yes (via ADB)&lt;/td&gt;
&lt;td&gt;❌ No (use generated APKs instead)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size Optimization&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;✅ Automatic (via Play Store)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔹 When Should You Use &lt;code&gt;.aab&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mandatory&lt;/strong&gt; for new apps on Google Play.&lt;/li&gt;
&lt;li&gt;Highly recommended for all apps to improve performance and reduce APK size.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 How to Build an App Bundle in Android Studio?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open your project in &lt;strong&gt;Android Studio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to:
&lt;code&gt;Build &amp;gt; Build Bundle(s) / APK(s) &amp;gt; Build Bundle(s)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The generated &lt;code&gt;.aab&lt;/code&gt; file will be located at:
&lt;code&gt;app/build/outputs/bundle/&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔹 Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;cannot install&lt;/strong&gt; a &lt;code&gt;.aab&lt;/code&gt; file directly on a device.&lt;/li&gt;
&lt;li&gt;To test locally, you can use &lt;strong&gt;bundletool&lt;/strong&gt; to convert &lt;code&gt;.aab&lt;/code&gt; to APKs:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  bundletool build-apks &lt;span class="nt"&gt;--bundle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_app.aab &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my_app.apks &lt;span class="nt"&gt;--ks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mykey.jks ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📌 Conclusion
&lt;/h3&gt;

&lt;p&gt;App Bundles offer a modern, efficient, and scalable way to distribute Android apps by optimizing them per device using Dynamic Delivery. While APKs are still useful for testing, .aab is now the standard for production builds on Google Play.&lt;/p&gt;

</description>
      <category>android</category>
    </item>
    <item>
      <title>🚀 Optimizing Your React App: Best Practices for Developers</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Mon, 31 Mar 2025 05:06:15 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/optimizing-your-react-app-best-practices-for-developers-5egf</link>
      <guid>https://dev.to/ayon_ssp/optimizing-your-react-app-best-practices-for-developers-5egf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As a developer, ensuring that your &lt;strong&gt;React app&lt;/strong&gt; is optimized for performance, scalability, and user experience is crucial. Whether you're working on a small project or a large-scale application, the following best practices will help you create a more efficient and responsive React application.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1️⃣ Enhancing Rendering &amp;amp; Component Performance
&lt;/h2&gt;

&lt;p&gt;Rendering inefficiencies can significantly impact your app's performance. Here’s how you can optimize it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;React.memo()&lt;/code&gt;&lt;/strong&gt; to prevent unnecessary re-renders of functional components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilize &lt;code&gt;useCallback()&lt;/code&gt; &amp;amp; &lt;code&gt;useMemo()&lt;/code&gt;&lt;/strong&gt; to optimize function and value references in child components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Lazy Loading&lt;/strong&gt; using &lt;code&gt;React.lazy()&lt;/code&gt; &amp;amp; &lt;code&gt;Suspense&lt;/code&gt; to reduce the initial bundle size and improve loading speeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid Inline Functions &amp;amp; Objects in JSX&lt;/strong&gt; as they create new references on every render, leading to performance overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Automatic Batching&lt;/strong&gt; in React 18+ to update multiple states in a single render pass, reducing re-renders.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ Efficient State Management
&lt;/h2&gt;

&lt;p&gt;Managing state properly is essential for app scalability and performance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Context API Wisely&lt;/strong&gt; – Avoid unnecessary re-renders by wrapping only relevant components in a context provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose the Right State Management Solution&lt;/strong&gt; – Consider Redux Toolkit, Zustand, or Recoil instead of excessive prop drilling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimize Unnecessary State Updates&lt;/strong&gt; – Keep transient UI states (like modals, dropdowns) within local component state rather than global state.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3️⃣ Reducing Bundle Size &amp;amp; Optimizing Asset Loading
&lt;/h2&gt;

&lt;p&gt;Large bundle sizes can slow down page loads. Optimize your assets with these techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enable Tree Shaking&lt;/strong&gt; to remove unused code by properly structuring ES6 module imports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Code Splitting&lt;/strong&gt; to load components dynamically using &lt;code&gt;React.lazy()&lt;/code&gt; and &lt;code&gt;import()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize Images&lt;/strong&gt; by using modern formats like WebP, lazy loading (&lt;code&gt;loading="lazy"&lt;/code&gt;), and CDNs for faster delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use SVG Instead of PNGs&lt;/strong&gt; where applicable for scalable and lightweight graphics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compress and Minify Files&lt;/strong&gt; using tools like Terser, UglifyJS, and Brotli compression to reduce payload size.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4️⃣ Optimizing API Calls &amp;amp; Data Fetching
&lt;/h2&gt;

&lt;p&gt;Efficient data handling reduces unnecessary network requests and improves app responsiveness.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Leverage SWR or React Query&lt;/strong&gt; for API caching, pagination, and automatic background re-fetching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debounce API Requests&lt;/strong&gt; using lodash &lt;code&gt;debounce()&lt;/code&gt; to minimize redundant network calls in search bars and fast user interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use GraphQL&lt;/strong&gt; to fetch only required data instead of over-fetching REST responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement WebSockets&lt;/strong&gt; for real-time updates instead of inefficient polling techniques.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5️⃣ Improving Page Load Speed &amp;amp; User Experience
&lt;/h2&gt;

&lt;p&gt;User experience is critical for retention and engagement. Here’s how to improve it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preload Essential Resources&lt;/strong&gt; using &lt;code&gt;&amp;lt;link rel="preload"&amp;gt;&lt;/code&gt; for critical assets like fonts and scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove Unused CSS &amp;amp; JavaScript&lt;/strong&gt; with tools like PurgeCSS to avoid unnecessary bloat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize Web Vitals&lt;/strong&gt; by improving metrics such as &lt;strong&gt;Time to Interactive (TTI)&lt;/strong&gt; and &lt;strong&gt;First Contentful Paint (FCP)&lt;/strong&gt; with Lighthouse audits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable HTTP/2 &amp;amp; GZIP/Brotli Compression&lt;/strong&gt; to accelerate network performance and reduce load times.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6️⃣ Debugging &amp;amp; Performance Monitoring
&lt;/h2&gt;

&lt;p&gt;Continuous monitoring and debugging help identify issues before they affect users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use React Developer Tools&lt;/strong&gt; to analyze component re-renders and identify bottlenecks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Performance&lt;/strong&gt; with Lighthouse, WebPageTest, and React Profiler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Error Boundaries&lt;/strong&gt; to prevent app crashes and provide fallback UI when errors occur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Sentry or LogRocket&lt;/strong&gt; to capture real-time errors and enhance debugging workflows.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;By applying these optimization techniques, your React app will be &lt;strong&gt;faster, more efficient, and more scalable&lt;/strong&gt;. Keep iterating and monitoring performance to deliver a seamless user experience. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>react</category>
      <category>optimis</category>
    </item>
    <item>
      <title>React Context – Quick Revision Notes</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Thu, 27 Mar 2025 13:52:02 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/react-context-quick-revision-notes-1</link>
      <guid>https://dev.to/ayon_ssp/react-context-quick-revision-notes-1</guid>
      <description>&lt;p&gt;🔹 &lt;strong&gt;Definition:&lt;/strong&gt; Context API manages global state and avoids prop drilling.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1️⃣ Create Context&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;2️⃣ Provide Context&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;sharedData&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;3️⃣ Consume Context&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ With useContext (Functional Components)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;✅ With Context.Consumer (For Class Components)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🚀 Example (Sidebar Context)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useIsMobile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/hooks/use-mobile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;SidebarState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expanded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;collapsed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;SidebarContextType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SidebarState&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;isMobile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;toggleSidebar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SidebarContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SidebarContextType&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;useSidebarContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SidebarContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;useSidebarContext must be used within a SidebarProvider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SidebarProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;defaultOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;defaultOpen&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;defaultOpen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isMobile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useIsMobile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isMobile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isMobile&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toggleSidebar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SidebarContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isOpen&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expanded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;collapsed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;isOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;setIsOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;isMobile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;toggleSidebar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;SidebarContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Provider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚡ Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use multiple contexts for modularity.&lt;/li&gt;
&lt;li&gt;✅ Combine with useReducer for complex state.&lt;/li&gt;
&lt;li&gt;✅ Wrap context logic in a custom hook for cleaner code.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useMyContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 Use Context for: Theme, Auth, Language, Global State.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
    <item>
      <title>The Future is Serverless</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Thu, 27 Mar 2025 06:14:29 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/the-future-is-serverless-1cp0</link>
      <guid>https://dev.to/ayon_ssp/the-future-is-serverless-1cp0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;In today’s fast-paced development landscape, &lt;strong&gt;Serverless Architecture&lt;/strong&gt; has emerged as a game-changer. It enables businesses to build and deploy applications without worrying about infrastructure management. As a senior developer or CTO, adopting serverless can lead to better scalability, cost efficiency, and faster time-to-market.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Serverless Architecture?
&lt;/h2&gt;

&lt;p&gt;Serverless architecture is a cloud-native model where applications rely on backend services fully managed by cloud providers. Developers only focus on writing code, while the provider takes care of server provisioning, scaling, and maintenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Benefits:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No Server Management&lt;/strong&gt; – No need to maintain or provision servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven Execution&lt;/strong&gt; – Functions run in response to events (e.g., HTTP requests, database changes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Scaling&lt;/strong&gt; – Instantly scales based on demand, eliminating capacity concerns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-as-You-Go Pricing&lt;/strong&gt; – Costs are based on actual usage, reducing unnecessary expenses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless Functions&lt;/strong&gt; – Each function runs independently, making deployments easier.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Core Components of Serverless Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Function as a Service (FaaS)
&lt;/h3&gt;

&lt;p&gt;FaaS enables running small, independent functions triggered by events. Leading providers include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Lambda&lt;/strong&gt; (Amazon Web Services)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Cloud Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IBM Cloud Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oracle Functions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Backend as a Service (BaaS)
&lt;/h3&gt;

&lt;p&gt;BaaS offloads backend management by using cloud-hosted services for databases, authentication, and storage. Popular options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; (Google’s real-time database, authentication, and hosting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Amplify&lt;/strong&gt; (Full-stack serverless framework)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; (Open-source Firebase alternative)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth0&lt;/strong&gt; (Authentication &amp;amp; Authorization)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Event Triggers
&lt;/h3&gt;

&lt;p&gt;Serverless applications react to specific events like HTTP requests, file uploads, and database updates. Key event-driven services include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS API Gateway&lt;/strong&gt; – Manages HTTP requests to AWS Lambda&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Pub/Sub&lt;/strong&gt; – Event messaging for distributed systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Event Grid&lt;/strong&gt; – Handles event-driven workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Managed Databases &amp;amp; Storage
&lt;/h3&gt;

&lt;p&gt;Serverless applications require scalable, managed storage solutions. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Amazon DynamoDB&lt;/strong&gt; – NoSQL, fully managed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Firestore&lt;/strong&gt; – Real-time NoSQL database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Firestore&lt;/strong&gt; – Cloud-native NoSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS S3&lt;/strong&gt; – Serverless file storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;Serverless is not just a trend—it’s a practical solution for various applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST APIs &amp;amp; Microservices&lt;/strong&gt; (e.g., API Gateway + AWS Lambda)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Data Processing&lt;/strong&gt; (e.g., Log streaming, Analytics)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chatbots &amp;amp; Notifications&lt;/strong&gt; (Automated message handling)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IoT Applications&lt;/strong&gt; (Processing sensor data in real-time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Backups &amp;amp; CRON Jobs&lt;/strong&gt; (Scheduled tasks with minimal overhead)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Verdict: Is Serverless Right for You?
&lt;/h2&gt;

&lt;p&gt;Serverless architecture is an excellent choice for startups, enterprises, and any business looking to optimize cloud spending while improving agility. However, it’s essential to consider factors like cold start times, vendor lock-in, and debugging challenges before diving in.&lt;/p&gt;

&lt;p&gt;As a CTO or tech lead, embracing serverless can help your team move faster and innovate without operational burdens. The future is serverless—are you ready to adopt it?&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>serverless</category>
      <category>aws</category>
    </item>
    <item>
      <title>Accessing MySQL Server from a Remote Machine in the Same Network</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Mon, 24 Mar 2025 09:04:35 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/accessing-mysql-server-from-a-remote-machine-in-the-same-network-20n4</link>
      <guid>https://dev.to/ayon_ssp/accessing-mysql-server-from-a-remote-machine-in-the-same-network-20n4</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This guide explains how to connect to a MySQL server running on a local network from a different machine. If you receive the error &lt;code&gt;Host 'your_host' is not allowed to connect to this MySQL server&lt;/code&gt;, follow these steps to resolve it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Verify Network Connectivity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before configuring MySQL, check if the server is reachable from the client machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.1 Ping the MySQL Server&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Run this command from the client machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping 192.168.2.51
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you receive replies, the server is reachable.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1.2 Test MySQL Port Connectivity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use PowerShell or Command Prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Test-NetConnection 192.168.2.51 &lt;span class="nt"&gt;-Port&lt;/span&gt; 3306
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;TcpTestSucceeded : True&lt;/code&gt;, MySQL is listening on port 3306.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Grant Remote Access in MySQL&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.1 Log into MySQL on the Server&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;On the MySQL server (&lt;code&gt;192.168.2.51&lt;/code&gt;), open a terminal or command prompt and log in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter the password when prompted.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.2 Check Existing User Privileges&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the &lt;code&gt;root&lt;/code&gt; user only has &lt;code&gt;localhost&lt;/code&gt; access, update its privileges.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.3 Grant Remote Access to a Specific IP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To allow connections from &lt;code&gt;192.168.2.57&lt;/code&gt;, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'192.168.2.57'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;OPTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;FLUSH&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2.4 (Optional) Allow Access from Any IP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you want to allow connections from any machine in the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;'%'&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="s1"&gt;'root'&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;OPTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;FLUSH&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Modify MySQL Configuration to Accept Remote Connections&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By default, MySQL only listens on &lt;code&gt;127.0.0.1&lt;/code&gt;. Update this setting to allow external connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3.1 Edit MySQL Configuration File&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Windows:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Edit &lt;code&gt;C:\ProgramData\MySQL\MySQL Server X.X\my.ini&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Linux:&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/mysql/my.cnf&lt;/code&gt; or &lt;code&gt;/etc/mysql/mysql.conf.d/mysqld.cnf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Find this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;bind-address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3.2 Restart MySQL Service&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Windows:&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;net stop mysql
net start mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Linux:&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Connect to MySQL from the Remote Machine&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now, on &lt;code&gt;192.168.2.57&lt;/code&gt;, try connecting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysql &lt;span class="nt"&gt;-h&lt;/span&gt; 192.168.2.51 &lt;span class="nt"&gt;-P&lt;/span&gt; 3306 &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Following these steps, you should be able to connect to MySQL from another machine on the same network. If issues persist, check firewall rules and MySQL user privileges.&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>networking</category>
      <category>database</category>
    </item>
    <item>
      <title>Flutter Windows Installer 🚀</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Sun, 23 Mar 2025 18:26:16 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/flutter-windows-installer-1a5h</link>
      <guid>https://dev.to/ayon_ssp/flutter-windows-installer-1a5h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This README provides instructions for creating a Windows installer for your Flutter application using Inno Setup.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Prerequisites 🛠️
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build Flutter App for Windows:&lt;/strong&gt;
Run the following command in your Flutter project directory to generate the Windows build:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   flutter build windows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate the build files in the &lt;code&gt;build/windows/runner/Release&lt;/code&gt; directory.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Inno Setup:&lt;/strong&gt;
Download and install Inno Setup from &lt;a href="https://jrsoftware.org/" rel="noopener noreferrer"&gt;jrsoftware.org&lt;/a&gt; or Direct Download Link &lt;a href="https://jrsoftware.org/download.php/is.exe?site=1" rel="noopener noreferrer"&gt;innosetup-6.4.0.exe&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Steps to Create the Installer 📝
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prepare the Build Files&lt;/strong&gt;&lt;br&gt;
Copy all files from &lt;code&gt;build/windows/runner/Release&lt;/code&gt; to a new directory, e.g., &lt;code&gt;C:\MyFlutterApp\ReleaseFiles&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create the Inno Setup Script&lt;/strong&gt;&lt;br&gt;
Open Inno Setup and create a new script with the following content:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   [Setup]
   AppName=MyFlutterApp
   AppVersion=1.0.0
   DefaultDirName={pf}\MyFlutterApp
   DefaultGroupName=MyFlutterApp
   OutputDir=C:\MyFlutterApp\Installer
   OutputBaseFilename=MyFlutterAppSetup
   Compression=lzma
   SolidCompression=yes

   [Files]
   Source: "C:\MyFlutterApp\ReleaseFiles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

   [Icons]
   Name: "{group}\MyFlutterApp"; Filename: "{app}\MyFlutterApp.exe"
   Name: "{group}\Uninstall MyFlutterApp"; Filename: "{uninstallexe}"

   [Run]
   Filename: "{app}\MyFlutterApp.exe"; Description: "Launch MyFlutterApp"; Flags: nowait postinstall skipifsilent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compile the Script&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save the script with a &lt;code&gt;.iss&lt;/code&gt; extension, for example, &lt;code&gt;MyFlutterAppInstaller.iss&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open Inno Setup and click &lt;strong&gt;Compile&lt;/strong&gt; to generate the installer in the &lt;code&gt;OutputDir&lt;/code&gt; (&lt;code&gt;C:\MyFlutterApp\Installer&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test the Installer&lt;/strong&gt;&lt;br&gt;
Run the generated &lt;code&gt;MyFlutterAppSetup.exe&lt;/code&gt; to ensure the installer works as expected.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Customization Options 🎨
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Update Paths:&lt;/strong&gt; Change file paths in the script to match your project’s structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Additional Files:&lt;/strong&gt; Include licenses or documentation by adding entries to the &lt;code&gt;[Files]&lt;/code&gt; section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uninstaller:&lt;/strong&gt; Inno Setup automatically includes an uninstaller for your application.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example Project Structure 🗂️
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\MyFlutterApp
├── ReleaseFiles  # Contains built application files
│   ├── MyFlutterApp.exe
│   ├── data
│   └── ...
├── Installer      # Generated installer output
│   └── MyFlutterAppSetup.exe
└── MyFlutterAppInstaller.iss  # Inno Setup script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion 🎉
&lt;/h2&gt;

&lt;p&gt;By following these steps, you can create a professional installer for your Flutter Windows application. This will make it easier for users to install and use your app. If you have any questions or feedback, feel free to leave a comment below. Happy coding! 💻&lt;/p&gt;

</description>
      <category>flutter</category>
    </item>
    <item>
      <title>Supercharge Your Flutter Apps: Seamlessly Integrate C++ with Dart using DLLs</title>
      <dc:creator>AYON</dc:creator>
      <pubDate>Sat, 22 Mar 2025 02:19:26 +0000</pubDate>
      <link>https://dev.to/ayon_ssp/supercharge-your-flutter-apps-seamlessly-integrate-c-with-dart-using-dlls-2nc2</link>
      <guid>https://dev.to/ayon_ssp/supercharge-your-flutter-apps-seamlessly-integrate-c-with-dart-using-dlls-2nc2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Unlock the full potential of your Flutter applications by integrating powerful C++ functionalities. This guide will walk you through the process of using Dynamic Link Libraries (DLLs) to enhance your Dart code. Let's dive in! 🌊&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Prerequisites 🛠️
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flutter Setup:&lt;/strong&gt; Ensure Flutter is installed and configured on your system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C++ Compiler:&lt;/strong&gt; Install MinGW or Visual Studio for compiling the DLL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dart FFI:&lt;/strong&gt; Familiarity with the &lt;code&gt;dart:ffi&lt;/code&gt; package is helpful but not required.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 1: Create the C++ DLL
&lt;/h2&gt;

&lt;p&gt;Here is a simple C++ example with two functions: one to add two integers and another to concatenate two strings.&lt;br&gt;
&lt;code&gt;example_code.h&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifndef DATAPROCESSOR_H
#define DATAPROCESSOR_H
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;concatenateStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;freeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Write Your C++ Code 💻
&lt;/h2&gt;

&lt;p&gt;Create a C++ file (&lt;code&gt;example_code.cpp&lt;/code&gt;) with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"example_code.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstring&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;concatenateStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;concatenated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;strcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concatenated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;concatenated&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kr"&gt;__declspec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dllexport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;freeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compile the DLL
&lt;/h3&gt;

&lt;p&gt;Run the following command in your terminal to compile the DLL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cl /I &lt;span class="nb"&gt;.&lt;/span&gt; /LD example_code.cpp /Fe:example_code.dll /EHsc /std:c++17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate &lt;code&gt;example_code.dll&lt;/code&gt; in your current directory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Integrate C++ with Dart 🧩
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Dart File:&lt;/strong&gt; In your Dart project, create a file named &lt;code&gt;example.dart&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add FFI Dependency:&lt;/strong&gt; Open &lt;code&gt;pubspec.yaml&lt;/code&gt; and add the &lt;code&gt;ffi&lt;/code&gt; package:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ffi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.1.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write Dart Code:&lt;/strong&gt; Use the following Dart code to call the C++ functions:&lt;br&gt;
&lt;code&gt;example.dart&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:ffi'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:ffi/ffi.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Define function signatures&lt;/span&gt;
&lt;span class="kd"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;AddC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Int32&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;AddDart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;ConcatC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;ConcatDart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;FreeC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Void&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;FreeDart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyLibrary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;DynamicLibrary&lt;/span&gt; &lt;span class="n"&gt;_dll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;MyLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;_dll&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;AddDart&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_dll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lookupFunction&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AddC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AddDart&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;'add'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;concatenateStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;ConcatDart&lt;/span&gt; &lt;span class="n"&gt;concat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_dll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lookupFunction&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ConcatC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ConcatDart&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;'concatenateStrings'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;FreeDart&lt;/span&gt; &lt;span class="n"&gt;free&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_dll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lookupFunction&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FreeC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FreeDart&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;'freeString'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str1Pointer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toNativeUtf8&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;str2Pointer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;str2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toNativeUtf8&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Pointer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;resultPointer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str1Pointer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str2Pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;calloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str1Pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;calloc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str2Pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultPointer&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resultPointer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toDartString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultPointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dylib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DynamicLibrary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'example_code.dll'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;myLibrary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyLibrary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dylib&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Addition Result: &lt;/span&gt;&lt;span class="si"&gt;${myLibrary.add(10, 20)}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;myLibrary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;concatenateStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello, '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'World!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Concatenation Result: &lt;/span&gt;&lt;span class="si"&gt;$result&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Test Your Application 🧪
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Place the generated &lt;code&gt;example_code.dll&lt;/code&gt; in the same directory as your Dart file.&lt;/li&gt;
&lt;li&gt;Run the Dart application:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   dart example.dart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;You should see the following output:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Addition Result: 30
   Concatenation Result: Hello, World!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways 📚
&lt;/h2&gt;

&lt;p&gt;1.Use &lt;code&gt;dart:ffi&lt;/code&gt; to call C++ functions from Dart.&lt;br&gt;
2.Always free dynamically allocated memory in C++ to prevent memory leaks.&lt;br&gt;
3.Make sure the DLL file is accessible by your Flutter or Dart application.&lt;/p&gt;

&lt;p&gt;By following these steps, you can easily extend your Flutter application with native functionality using DLL files. Happy coding! 🧑‍💻&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>flutter</category>
      <category>dart</category>
    </item>
  </channel>
</rss>
