<?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>Forem: davinceleecode</title>
    <description>The latest articles on Forem by davinceleecode (@davinceleecode).</description>
    <link>https://forem.com/davinceleecode</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%2F2924029%2F1845d945-1cf9-4858-9e62-2fb5c6c9ea07.JPG</url>
      <title>Forem: davinceleecode</title>
      <link>https://forem.com/davinceleecode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/davinceleecode"/>
    <language>en</language>
    <item>
      <title>Azure Integration Services – Complete Guide</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Thu, 12 Feb 2026 15:23:40 +0000</pubDate>
      <link>https://forem.com/davinceleecode/azure-integration-services-complete-guide-5c64</link>
      <guid>https://forem.com/davinceleecode/azure-integration-services-complete-guide-5c64</guid>
      <description>&lt;p&gt;Modern applications rarely run in isolation. They need to communicate with other apps, services, databases, and external systems — both in the cloud and on-premises.&lt;/p&gt;

&lt;p&gt;Azure Integration Services help you connect, automate, and orchestrate these systems reliably and at scale.&lt;/p&gt;

&lt;p&gt;In this post, we’ll explore the key Azure Integration Services like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Service Bus
&lt;/li&gt;
&lt;li&gt;Azure Storage Queue
&lt;/li&gt;
&lt;li&gt;Azure Event Grid
&lt;/li&gt;
&lt;li&gt;Azure Event Hubs
&lt;/li&gt;
&lt;li&gt;Azure Logic Apps
&lt;/li&gt;
&lt;li&gt;Azure API Management
&lt;/li&gt;
&lt;li&gt;And more
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Messaging Services
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Azure Service Bus
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Enterprise-grade messaging service&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Queues and Topics (Pub/Sub)&lt;/li&gt;
&lt;li&gt;FIFO support&lt;/li&gt;
&lt;li&gt;Transactions&lt;/li&gt;
&lt;li&gt;Dead-letter queues&lt;/li&gt;
&lt;li&gt;Duplicate detection&lt;/li&gt;
&lt;li&gt;Scheduled messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Reliable communication between microservices&lt;/li&gt;
&lt;li&gt;Financial systems&lt;/li&gt;
&lt;li&gt;Order processing&lt;/li&gt;
&lt;li&gt;Complex enterprise messaging&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2️⃣ Azure Storage Queues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Simple, scalable message queue&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Massive scalability&lt;/li&gt;
&lt;li&gt;Cost-effective&lt;/li&gt;
&lt;li&gt;Basic queue functionality&lt;/li&gt;
&lt;li&gt;At-least-once delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Background jobs&lt;/li&gt;
&lt;li&gt;Lightweight async processing&lt;/li&gt;
&lt;li&gt;Simple decoupling between services&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3️⃣ Azure Event Grid
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Event-based Pub/Sub (Push Model)&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Push-based delivery&lt;/li&gt;
&lt;li&gt;Built-in Azure event sources&lt;/li&gt;
&lt;li&gt;Custom events support&lt;/li&gt;
&lt;li&gt;Low latency&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Event-driven architectures&lt;/li&gt;
&lt;li&gt;Reacting to Blob uploads&lt;/li&gt;
&lt;li&gt;Resource lifecycle events&lt;/li&gt;
&lt;li&gt;Serverless automation&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4️⃣ Azure Event Hubs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Big Data Streaming Platform&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Millions of events per second&lt;/li&gt;
&lt;li&gt;Partitioning&lt;/li&gt;
&lt;li&gt;Capture to Blob/Data Lake&lt;/li&gt;
&lt;li&gt;Integration with Stream Analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Telemetry ingestion&lt;/li&gt;
&lt;li&gt;IoT data streams&lt;/li&gt;
&lt;li&gt;Log streaming&lt;/li&gt;
&lt;li&gt;Real-time analytics&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Workflow &amp;amp; Orchestration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5️⃣ Azure Logic Apps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Low-code workflow automation&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;1000+ connectors (SAP, Salesforce, Outlook, etc.)&lt;/li&gt;
&lt;li&gt;Visual designer&lt;/li&gt;
&lt;li&gt;Built-in retry policies&lt;/li&gt;
&lt;li&gt;Hybrid connectivity&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Business process automation&lt;/li&gt;
&lt;li&gt;System integration without heavy coding&lt;/li&gt;
&lt;li&gt;Enterprise workflows&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6️⃣ Azure Functions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Event-driven serverless compute&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Auto-scaling&lt;/li&gt;
&lt;li&gt;Pay-per-execution&lt;/li&gt;
&lt;li&gt;Triggers (Service Bus, Event Grid, HTTP, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Event handlers&lt;/li&gt;
&lt;li&gt;Lightweight APIs&lt;/li&gt;
&lt;li&gt;Background processing&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7️⃣ Azure Durable Functions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Stateful serverless workflows&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Long-running workflows&lt;/li&gt;
&lt;li&gt;Fan-out/Fan-in patterns&lt;/li&gt;
&lt;li&gt;Human interaction workflows&lt;/li&gt;
&lt;li&gt;Orchestration patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Complex multi-step processes&lt;/li&gt;
&lt;li&gt;Stateful orchestration&lt;/li&gt;
&lt;li&gt;Approval workflows&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ API &amp;amp; Connectivity Services
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8️⃣ Azure API Management (APIM)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full API Gateway Solution&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Authentication &amp;amp; authorization&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;li&gt;API transformation&lt;/li&gt;
&lt;li&gt;Developer portal&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Securing APIs&lt;/li&gt;
&lt;li&gt;Monitoring API usage&lt;/li&gt;
&lt;li&gt;Monetizing APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  9️⃣ Azure Relay
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Secure Hybrid Connectivity&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;No inbound firewall ports needed&lt;/li&gt;
&lt;li&gt;Hybrid connection support&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Exposing on-prem services securely&lt;/li&gt;
&lt;li&gt;Hybrid cloud solutions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔟 Azure Web PubSub
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Real-time messaging via WebSockets&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Chat applications&lt;/li&gt;
&lt;li&gt;Live dashboards&lt;/li&gt;
&lt;li&gt;Real-time notifications&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Data Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣1️⃣ Azure Data Factory
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cloud ETL/ELT Service&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔧 Features:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Data pipelines&lt;/li&gt;
&lt;li&gt;90+ connectors&lt;/li&gt;
&lt;li&gt;Data transformation&lt;/li&gt;
&lt;li&gt;Scheduled workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🎯 Best For:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Moving data between systems&lt;/li&gt;
&lt;li&gt;Data warehousing&lt;/li&gt;
&lt;li&gt;Large-scale data integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Primary Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Service Bus&lt;/td&gt;
&lt;td&gt;Enterprise messaging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Queue&lt;/td&gt;
&lt;td&gt;Simple async processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event Grid&lt;/td&gt;
&lt;td&gt;Event-driven automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event Hubs&lt;/td&gt;
&lt;td&gt;High-volume streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logic Apps&lt;/td&gt;
&lt;td&gt;Low-code workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functions&lt;/td&gt;
&lt;td&gt;Serverless compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Management&lt;/td&gt;
&lt;td&gt;API governance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Factory&lt;/td&gt;
&lt;td&gt;Data pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏗 When to Use What?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Need &lt;strong&gt;reliable enterprise messaging?&lt;/strong&gt; → Service Bus
&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;simple background processing?&lt;/strong&gt; → Storage Queue
&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;event-based automation?&lt;/strong&gt; → Event Grid
&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;massive streaming ingestion?&lt;/strong&gt; → Event Hubs
&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;business workflow automation?&lt;/strong&gt; → Logic Apps
&lt;/li&gt;
&lt;li&gt;Need &lt;strong&gt;API gateway?&lt;/strong&gt; → API Management
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Azure Integration Services provide powerful building blocks for modern cloud architectures.&lt;/p&gt;

&lt;p&gt;Whether you're building microservices, event-driven systems, hybrid integrations, or enterprise workflows — Azure has a service designed for it.&lt;/p&gt;

&lt;p&gt;If you're preparing for Azure certifications (AZ-204, AZ-305) or designing enterprise systems, mastering these services is essential.&lt;/p&gt;




&lt;p&gt;💬 What Azure Integration Service do you use most in your architecture?&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azurefunctions</category>
      <category>eventgrid</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>SQL Normalization vs Denormalization Explained with 1NF, 2NF, and 3NF</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Tue, 10 Feb 2026 04:05:32 +0000</pubDate>
      <link>https://forem.com/davinceleecode/sql-normalization-vs-denormalization-explained-with-1nf-2nf-and-3nf-2gpa</link>
      <guid>https://forem.com/davinceleecode/sql-normalization-vs-denormalization-explained-with-1nf-2nf-and-3nf-2gpa</guid>
      <description>&lt;h2&gt;
  
  
  SQL Normalization vs Denormalization: A Beginner-Friendly Guide
&lt;/h2&gt;

&lt;p&gt;When designing a database, one of the most common questions is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should I normalize my tables, or denormalize for performance?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s break it down in simple terms and see how &lt;strong&gt;1NF, 2NF, and 3NF&lt;/strong&gt; fit into the picture.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Normalization?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Normalization&lt;/strong&gt; is the process of organizing your database tables to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce redundancy (duplicate data)&lt;/li&gt;
&lt;li&gt;Avoid update anomalies&lt;/li&gt;
&lt;li&gt;Maintain data integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to split data into multiple related tables, linked via &lt;strong&gt;primary and foreign keys&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Normalized Database
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Customers Table&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;customer_id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;email&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;Alice&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:alice@mail.com"&gt;alice@mail.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:bob@mail.com"&gt;bob@mail.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Orders Table&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;order_id&lt;/th&gt;
&lt;th&gt;customer_id&lt;/th&gt;
&lt;th&gt;order_date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2026-02-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2026-02-03&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ No customer info is repeated in orders.&lt;br&gt;&lt;br&gt;
✅ Updates to a customer's email happen in one place only.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Denormalization?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Denormalization&lt;/strong&gt; is the opposite: we &lt;strong&gt;intentionally add redundancy&lt;/strong&gt; to make queries faster or simpler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Denormalized Database
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Orders Table (Denormalized)&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;order_id&lt;/th&gt;
&lt;th&gt;customer_id&lt;/th&gt;
&lt;th&gt;customer_name&lt;/th&gt;
&lt;th&gt;customer_email&lt;/th&gt;
&lt;th&gt;order_date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:alice@mail.com"&gt;alice@mail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2026-02-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:bob@mail.com"&gt;bob@mail.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2026-02-03&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;✅ Faster reads (no JOIN needed)&lt;br&gt;&lt;br&gt;
❌ Risk of inconsistent data if a customer's info changes&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Normalize vs Denormalize
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core transactional system (OLTP)&lt;/td&gt;
&lt;td&gt;Normalize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read-heavy reports/dashboard&lt;/td&gt;
&lt;td&gt;Denormalize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frequent updates&lt;/td&gt;
&lt;td&gt;Normalize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mostly read-only data&lt;/td&gt;
&lt;td&gt;Denormalize&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most systems start &lt;strong&gt;normalized&lt;/strong&gt; and denormalize selectively for performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 1NF, 2NF, and 3NF Rules
&lt;/h2&gt;

&lt;p&gt;Normalization is applied in &lt;strong&gt;stages&lt;/strong&gt;, called &lt;strong&gt;normal forms&lt;/strong&gt;. Here’s the beginner-friendly breakdown:&lt;/p&gt;

&lt;h3&gt;
  
  
  1NF (First Normal Form)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; Each column must contain &lt;strong&gt;atomic values&lt;/strong&gt; (no lists or arrays).  &lt;/p&gt;

&lt;p&gt;❌ Bad:&lt;/p&gt;

&lt;p&gt;id | name | phones&lt;br&gt;
1  | Sam  | 111, 222, 333&lt;/p&gt;

&lt;p&gt;✅ Good:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Students Table&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Sam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Phones Table&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;student_id&lt;/th&gt;
&lt;th&gt;phone_number&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;111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;222&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;333&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  2NF (Second Normal Form)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; No &lt;strong&gt;partial dependency&lt;/strong&gt;; all non-key columns must depend on the &lt;strong&gt;whole primary key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;❌ Bad:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enrollments Table&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;student_id&lt;/th&gt;
&lt;th&gt;course_id&lt;/th&gt;
&lt;th&gt;student_name&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;101&lt;/td&gt;
&lt;td&gt;Sam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Primary key: &lt;code&gt;(student_id, course_id)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;student_name&lt;/code&gt; depends only on &lt;code&gt;student_id&lt;/code&gt; ❌&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Good:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Students Table&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;student_id&lt;/th&gt;
&lt;th&gt;student_name&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;Sam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Enrollments Table&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;student_id&lt;/th&gt;
&lt;th&gt;course_id&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;101&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  3NF (Third Normal Form)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rule:&lt;/strong&gt; No &lt;strong&gt;transitive dependency&lt;/strong&gt;; non-key columns should depend &lt;strong&gt;only on the primary key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;❌ Bad:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Employees Table&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;emp_id&lt;/th&gt;
&lt;th&gt;dept_id&lt;/th&gt;
&lt;th&gt;dept_name&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;10&lt;/td&gt;
&lt;td&gt;HR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dept_name&lt;/code&gt; depends on &lt;code&gt;dept_id&lt;/code&gt;, which depends on &lt;code&gt;emp_id&lt;/code&gt; ❌&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Good:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Employees Table&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;emp_id&lt;/th&gt;
&lt;th&gt;dept_id&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;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Departments Table&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;dept_id&lt;/th&gt;
&lt;th&gt;dept_name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;HR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Quick Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Normalize = remove duplication, enforce data integrity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Denormalize = accept duplication for faster reads&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1NF = atomic values&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2NF = no partial dependencies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3NF = no transitive dependencies&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Most systems aim for &lt;strong&gt;3NF&lt;/strong&gt;, then denormalize only where performance demands it.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Normalization ensures your database is clean, consistent, and easy to maintain.&lt;br&gt;&lt;br&gt;
Denormalization sacrifices some cleanliness to improve performance.  &lt;/p&gt;

&lt;p&gt;Understanding &lt;strong&gt;1NF–3NF&lt;/strong&gt; gives you the tools to &lt;strong&gt;design better databases&lt;/strong&gt;, and knowing &lt;strong&gt;when to denormalize&lt;/strong&gt; keeps your apps fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Start normalized. Optimize with denormalization &lt;strong&gt;only when necessary&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>backend</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AI Genie: A Multimodal Q&amp;A Assistant with Google Gemini</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Sun, 07 Sep 2025 07:33:37 +0000</pubDate>
      <link>https://forem.com/davinceleecode/ai-genie-a-multimodal-qa-assistant-with-google-gemini-3dnb</link>
      <guid>https://forem.com/davinceleecode/ai-genie-a-multimodal-qa-assistant-with-google-gemini-3dnb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;AI Genie&lt;/strong&gt;, a simple web app that lets users ask any question and get AI-generated answers in real time. Using Google Gemini via a Python Flask backend, the app sends user prompts to Gemini and returns intelligent responses instantly. This project showcases Gemini’s text understanding and generation capabilities in a general-purpose Q&amp;amp;A assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can try AI Genie locally or view the source code on GitHub:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/davinceleecode/googleai-multimodal-demo" rel="noopener noreferrer"&gt;Library Genie GitHub Repo&lt;/a&gt;&lt;/p&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%2Fadk5bl96z9f5sf83osdh.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%2Fadk5bl96z9f5sf83osdh.png" alt="Gemini AI Demo - UI" width="607" height="976"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;I connected my Flask web app to Google Gemini via the Generative AI API. Users type their questions, and the app sends the prompt to Gemini, which returns an answer in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimodal Features
&lt;/h2&gt;

&lt;p&gt;This project mainly demonstrates Gemini’s text generation and understanding capabilities. It can interpret user queries and generate coherent responses, showing the AI’s ability to handle general-purpose questions interactively.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Wed, 03 Sep 2025 15:09:32 +0000</pubDate>
      <link>https://forem.com/davinceleecode/-1096</link>
      <guid>https://forem.com/davinceleecode/-1096</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/mahdijazini" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F1840802%2Fe45e2029-e74a-4fe6-9901-d2c8757728e3.jpg" alt="mahdijazini"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/mahdijazini/a-love-letter-to-vercel-33l6" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;A Love Letter to Vercel!&lt;/h2&gt;
      &lt;h3&gt;Mahdi Jazini ・ Sep 2&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#vercel&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>vercel</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>This is a submission for the [Midnight Network "Privacy First" Challenge]</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Fri, 29 Aug 2025 16:01:25 +0000</pubDate>
      <link>https://forem.com/davinceleecode/this-is-a-submission-for-the-midnight-network-privacy-first-challenge-41m1</link>
      <guid>https://forem.com/davinceleecode/this-is-a-submission-for-the-midnight-network-privacy-first-challenge-41m1</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built a lightweight &lt;strong&gt;developer demo tool&lt;/strong&gt; that shows how Midnight developers could prototype privacy-preserving DApps with a React + TypeScript frontend.  &lt;/p&gt;

&lt;p&gt;The tool provides a simple &lt;strong&gt;Anonymous Shoutbox&lt;/strong&gt; where users can submit messages backed by a placeholder proof mechanism. It demonstrates how ZK concepts can be wired into the UI flow, making it easier for developers to experiment before integrating real Midnight Compact circuits and MidnightJS.  &lt;/p&gt;

&lt;p&gt;This solves the problem of &lt;strong&gt;developer onboarding&lt;/strong&gt;, giving new builders a ready-to-use Vite + Tailwind starter project that already showcases privacy-first design patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repo&lt;/strong&gt;: [&lt;a href="https://github.com/davinceleecode/midnight-privacy-dapp" rel="noopener noreferrer"&gt;https://github.com/davinceleecode/midnight-privacy-dapp&lt;/a&gt;]
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot&lt;/strong&gt;: &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/screenshot.png" alt="Screenshot" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Replace with actual screenshots from your app running.)&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Midnight's Technology
&lt;/h2&gt;

&lt;p&gt;This project is designed as a &lt;strong&gt;starter template&lt;/strong&gt; for building with &lt;strong&gt;Midnight Compact&lt;/strong&gt; and &lt;strong&gt;MidnightJS&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;While the current version uses &lt;strong&gt;mocked proof generation&lt;/strong&gt;, the architecture is ready to be swapped with real Midnight proof calls. This way, developers can focus on designing their UI/UX flow without needing the full ZK integration on day one.  &lt;/p&gt;

&lt;p&gt;It highlights how Midnight's &lt;strong&gt;privacy-preserving transaction patterns&lt;/strong&gt; could integrate directly into the user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developer Experience Improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Provides a &lt;strong&gt;ready-to-use starter repo&lt;/strong&gt; for privacy-first DApps.
&lt;/li&gt;
&lt;li&gt;Abstracts the boilerplate (React + Tailwind + TypeScript) so developers can jump straight into building.
&lt;/li&gt;
&lt;li&gt;Demonstrates &lt;strong&gt;proof lifecycle flow&lt;/strong&gt; (input → proof → verified → message published) in a minimal, understandable way.
&lt;/li&gt;
&lt;li&gt;Open-sourced under &lt;strong&gt;Apache 2.0 license&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it easier for developers to &lt;strong&gt;experiment quickly&lt;/strong&gt; and extend the template with their own ZK circuits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up Instructions / Tutorial
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repository:
&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
   git clone https://github.com/your-username/midnight-privacy-demo.git
   cd midnight-privacy-demo
&amp;lt;!-- Thanks for participating! --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devchallenge</category>
      <category>midnightchallenge</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Major Algorithm Types Cheat Sheet</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Fri, 22 Aug 2025 07:19:00 +0000</pubDate>
      <link>https://forem.com/davinceleecode/major-algorithm-types-cheat-sheet-1meo</link>
      <guid>https://forem.com/davinceleecode/major-algorithm-types-cheat-sheet-1meo</guid>
      <description>&lt;h2&gt;
  
  
  1. Brute Force
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Try all possibilities until you find the answer.
&lt;/li&gt;
&lt;li&gt;✅ Simple but usually slow (&lt;code&gt;O(2ⁿ)&lt;/code&gt;, &lt;code&gt;O(n!)&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Divide and Conquer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Break problem → solve subproblems → combine results.
&lt;/li&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;Merge Sort, Quick Sort, Binary Search&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Greedy Algorithms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Make the best &lt;em&gt;local&lt;/em&gt; choice at each step → hope it leads to global optimum.
&lt;/li&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;Dijkstra’s shortest path, Huffman coding&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Dynamic Programming (DP)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Break problem into overlapping subproblems.
&lt;/li&gt;
&lt;li&gt;Save (memoize) results to avoid recomputation.
&lt;/li&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;Fibonacci, Knapsack, Matrix path problems&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Backtracking
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Try a path, if it fails → go back and try another.
&lt;/li&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;Sudoku solver, N-Queens, Maze solving&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Graph Algorithms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Work with nodes/edges (networks, maps, dependencies).
&lt;/li&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;BFS, DFS, Dijkstra, Kruskal, Prim&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Sorting &amp;amp; Searching
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sorting&lt;/strong&gt;: QuickSort, MergeSort, HeapSort, BubbleSort.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searching&lt;/strong&gt;: Binary Search, Linear Search.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Recursion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A function calls itself to solve smaller versions of a problem.
&lt;/li&gt;
&lt;li&gt;Often combined with &lt;strong&gt;DP, divide &amp;amp; conquer, backtracking&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Mathematical / Number Theory
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;GCD (Euclidean), Prime tests, Modular arithmetic&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. String Algorithms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Work on text patterns and substrings.
&lt;/li&gt;
&lt;li&gt;🔑 Examples: &lt;strong&gt;KMP, Rabin-Karp, Trie-based search&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optimization&lt;/strong&gt; → Greedy or DP.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paths/Networks&lt;/strong&gt; → Graph.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploring possibilities&lt;/strong&gt; → Backtracking.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ordering/Searching data&lt;/strong&gt; → Sorting/Searching.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formula-style tricks&lt;/strong&gt; → Math/Number theory.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>programming</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Time Complexity (Big-O Notation) in Algorithms</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Wed, 20 Aug 2025 07:09:45 +0000</pubDate>
      <link>https://forem.com/davinceleecode/time-complexity-big-o-notation-in-algorithms-22lf</link>
      <guid>https://forem.com/davinceleecode/time-complexity-big-o-notation-in-algorithms-22lf</guid>
      <description>&lt;h2&gt;
  
  
  1. What is Algorithm Complexity?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Algorithm&lt;/strong&gt; = step-by-step procedure to solve a problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complexity&lt;/strong&gt; = how much time or memory it needs as input size grows.&lt;/li&gt;
&lt;li&gt;We measure this using &lt;strong&gt;Big-O notation.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Why Big-O Notation?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It describes the growth rate, not the exact time.&lt;/li&gt;
&lt;li&gt;Helps compare algorithms (fast vs slow) independent of hardware.&lt;/li&gt;
&lt;li&gt;Example: One algorithm takes 1 second for 1000 inputs, another takes 10 seconds — Big-O tells us how this scales when inputs grow to 1 million.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Common Complexities (with examples)
&lt;/h2&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(1) → Constant time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same time, no matter the input size.&lt;/li&gt;
&lt;li&gt;Example: access &lt;code&gt;arr[5]&lt;/code&gt;, simple formula like &lt;code&gt;n(n+1)/2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(log n) → Logarithmic time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input size shrinks in half each step.&lt;/li&gt;
&lt;li&gt;Example: Binary Search in a sorted array.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(n) → Linear time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One loop over all &lt;code&gt;n&lt;/code&gt; items.&lt;/li&gt;
&lt;li&gt;Example: Find the max element in an array.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(n log n) → Linearithmic time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Appears in efficient sorting algorithms.&lt;/li&gt;
&lt;li&gt;Example: Merge Sort, Quick Sort.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(n²) → Quadratic time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double loop → compare all pairs.&lt;/li&gt;
&lt;li&gt;Example: Bubble Sort, checking all pairs in a matrix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(2ⁿ) → Exponential time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Doubles work for each extra input.&lt;/li&gt;
&lt;li&gt;Example: Recursive Fibonacci, brute force subsets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔹 &lt;strong&gt;O(n!) → Factorial time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explodes very fast → all permutations.&lt;/li&gt;
&lt;li&gt;Example: Traveling Salesman (brute force).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Formula vs Algorithm
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Formula: Already solved shortcut, runs in O(1).

&lt;ul&gt;
&lt;li&gt;Example: Sum of first &lt;code&gt;n&lt;/code&gt; numbers = &lt;code&gt;n(n+1)/2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Algorithm: Step-by-step method to compute the answer.

&lt;ul&gt;
&lt;li&gt;Example: Loop through numbers and add one by one = O(n).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;✅ &lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Big-O tells us how fast/slow an algorithm grows with input size.&lt;/li&gt;
&lt;li&gt;Formulas are direct (O(1)), algorithms can vary (O(n), O(n log n), etc).&lt;/li&gt;
&lt;li&gt;Choosing the right algorithm = huge performance difference in real-world apps.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>programming</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Common Challenges for developers and learners</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Tue, 19 Aug 2025 09:30:46 +0000</pubDate>
      <link>https://forem.com/davinceleecode/common-challenges-for-developers-and-learners-hm2</link>
      <guid>https://forem.com/davinceleecode/common-challenges-for-developers-and-learners-hm2</guid>
      <description>&lt;p&gt;As developers, we often face &lt;strong&gt;challenges that aren't just technical&lt;/strong&gt;. Today, I want to talk about three common ones that affect learning and growth: &lt;strong&gt;Tutorial Hell&lt;/strong&gt;, &lt;strong&gt;Cognitive Load&lt;/strong&gt;, and &lt;strong&gt;Imposter Syndrome&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ Tutorial Hell
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Getting stuck in endless tutorials without building real projects. You learn a lot of tools and frameworks but &lt;strong&gt;never complete something meaningful&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Knowledge is fragmented.
&lt;/li&gt;
&lt;li&gt;Confidence in applying skills is low.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus on building small projects.
&lt;/li&gt;
&lt;li&gt;Finish what you start before moving to another tutorial.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ Cognitive Load
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The &lt;strong&gt;mental effort required to process information&lt;/strong&gt;. When learning multiple complex topics at once, your brain can feel overwhelmed.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Hard to retain information.
&lt;/li&gt;
&lt;li&gt;Learning slows down, frustration increases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break learning into &lt;strong&gt;small chunks&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Focus on &lt;strong&gt;one topic at a time&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3️⃣ Imposter Syndrome
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Feeling like a &lt;strong&gt;fraud&lt;/strong&gt;, thinking "I'm not good enough," even when you have skills or achievements.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Lowers confidence.
&lt;/li&gt;
&lt;li&gt;Makes you &lt;strong&gt;avoid challenges&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track your achievements.
&lt;/li&gt;
&lt;li&gt;Seek feedback from peers.
&lt;/li&gt;
&lt;li&gt;Practice and apply your skills regularly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 How They Connect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tutorial Hell + Cognitive Load&lt;/strong&gt; → increases the chance of &lt;strong&gt;Imposter Syndrome&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;The key to breaking the cycle: &lt;strong&gt;learn by doing&lt;/strong&gt;, &lt;strong&gt;chunk your learning&lt;/strong&gt;, and &lt;strong&gt;celebrate small wins&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;💡 &lt;strong&gt;Takeaway:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Stop getting stuck in tutorials. Focus, build projects, manage your cognitive load, and remember: &lt;strong&gt;you are learning, and you are capable&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>developer</category>
      <category>learning</category>
      <category>career</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>When to Use Which Hook?</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Wed, 23 Jul 2025 17:15:25 +0000</pubDate>
      <link>https://forem.com/davinceleecode/when-to-use-which-hook-1700</link>
      <guid>https://forem.com/davinceleecode/when-to-use-which-hook-1700</guid>
      <description>&lt;p&gt;React provides powerful hooks that allow you to manage state, side effects, performance optimizations, and much more — all inside functional components. Here's a concise guide on when to use each hook:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hook&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useState&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manage local component state (e.g., input fields, toggles, counters)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useEffect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perform side effects (e.g., data fetching, subscriptions, timers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useContext&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Access shared/global state without prop drilling (e.g., theme, auth)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useRef&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reference DOM elements or store mutable values across renders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useReducer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manage complex state logic or state transitions (e.g., form wizard, cart)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useMemo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optimize performance by memoizing expensive calculations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useCallback&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memoize functions to prevent unnecessary re-renders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;useLayoutEffect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute synchronously after DOM changes but before browser paint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Example Use Cases:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;useState&lt;/code&gt; for toggling modals or tracking form values.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useEffect&lt;/code&gt; to fetch data from an API when a component mounts.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useContext&lt;/code&gt; to access user authentication info across components.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useReducer&lt;/code&gt; to manage complex multi-step form data with validation.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useMemo&lt;/code&gt; to avoid recalculating filtered lists or sorting operations.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useCallback&lt;/code&gt; when passing callback props to memoized child components.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useLayoutEffect&lt;/code&gt; to measure layout before browser paint (e.g., animations or positioning).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>reactnative</category>
      <category>web</category>
    </item>
    <item>
      <title>What is Dangling DNS? (And How It Can Lead to Domain Takeovers)</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Wed, 09 Jul 2025 02:00:00 +0000</pubDate>
      <link>https://forem.com/davinceleecode/what-is-dangling-dns-and-how-it-can-lead-to-domain-takeovers-2m46</link>
      <guid>https://forem.com/davinceleecode/what-is-dangling-dns-and-how-it-can-lead-to-domain-takeovers-2m46</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ever deleted a cloud app and forgot to clean up your DNS? &lt;br&gt;
You might be leaving the door open for attackers.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  👀 What is a Dangling DNS?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;dangling DNS record&lt;/strong&gt; occurs when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;DNS record (like a CNAME or A record)&lt;/strong&gt; still points to a &lt;strong&gt;cloud service&lt;/strong&gt; (e.g. Azure App Service, AWS S3, GitHub Pages)&lt;/li&gt;
&lt;li&gt;But the &lt;strong&gt;resource has already been deleted&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leaves the DNS record “dangling” — pointing to a hostname &lt;strong&gt;that no longer exists&lt;/strong&gt;, but &lt;strong&gt;could be claimed by someone else&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧨 Why is it Dangerous?
&lt;/h2&gt;

&lt;p&gt;An attacker can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identify the orphaned DNS entry&lt;/strong&gt; (e.g. &lt;code&gt;blog.yoursite.com&lt;/code&gt; → &lt;code&gt;yourapp.azurewebsites.net&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claim the deleted resource name&lt;/strong&gt; (e.g. create a new App Service with that exact name)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Host malicious content under your subdomain&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This allows them to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Impersonate your brand&lt;/li&gt;
&lt;li&gt;Steal user data&lt;/li&gt;
&lt;li&gt;Inject phishing pages&lt;/li&gt;
&lt;li&gt;Break your site's security reputation (e.g. email domain spoofing)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 Real Example
&lt;/h2&gt;

&lt;p&gt;Let’s say you had:&lt;br&gt;
CNAME  &lt;code&gt;blog.yourdomain.com&lt;/code&gt; → &lt;code&gt;yourblog.azurewebsites.net&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deleted the App Service &lt;code&gt;yourblog&lt;/code&gt; on Azure&lt;/li&gt;
&lt;li&gt;But forgot to remove the CNAME from your DNS provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now an attacker registers &lt;code&gt;yourblog.azurewebsites.net&lt;/code&gt; (if available), and &lt;strong&gt;your &lt;code&gt;blog.yourdomain.com&lt;/code&gt; will start pointing to them!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ How to Prevent Dangling DNS
&lt;/h2&gt;

&lt;p&gt;✅ Always do these:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clean up DNS records&lt;/strong&gt; when deleting cloud services
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit your DNS regularly&lt;/strong&gt; for unused entries
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use DNS monitoring tools&lt;/strong&gt; to detect dangling links
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable ownership validation&lt;/strong&gt; on platforms that support it (e.g. GitHub, Netlify)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;💡 On Azure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you delete an App Service and used a custom domain, &lt;strong&gt;remove the A/CNAME/TXT records immediately&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📌 TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dangling DNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A DNS record pointing to a deleted or unowned cloud resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subdomain takeover, phishing, brand impersonation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delete unused DNS entries after decommissioning services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Have you ever found a dangling DNS record in your project? Let me know in the comments — and don’t forget to audit your DNS zones today!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>dns</category>
      <category>cybersecurity</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>🛡️ OWASP Top 10 (2021 Edition) — Explained</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Tue, 01 Jul 2025 16:00:00 +0000</pubDate>
      <link>https://forem.com/davinceleecode/owasp-top-10-2021-edition-explained-4a6g</link>
      <guid>https://forem.com/davinceleecode/owasp-top-10-2021-edition-explained-4a6g</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A01&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Broken Access Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Users can access resources or perform actions they're not supposed to.&lt;/td&gt;
&lt;td&gt;A regular user can access admin-only pages or APIs like &lt;code&gt;/admin/deleteUser&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A02&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cryptographic Failures&lt;/strong&gt; &lt;em&gt;(was A03)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Weak or missing encryption of sensitive data.&lt;/td&gt;
&lt;td&gt;Login page uses HTTP instead of HTTPS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A03&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Injection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Untrusted data sent to an interpreter (e.g., SQL, shell, LDAP).&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;'; DROP TABLE Users --&lt;/code&gt; in a login form.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A04&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Insecure Design&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security was not considered during system design.&lt;/td&gt;
&lt;td&gt;No rate limiting on login → brute-force attack succeeds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A05&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Security Misconfiguration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Insecure default settings or exposed debug info.&lt;/td&gt;
&lt;td&gt;Error pages show stack traces or server version.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A06&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vulnerable and Outdated Components&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Using old or insecure libraries and frameworks.&lt;/td&gt;
&lt;td&gt;App runs an outdated jQuery version with a known XSS bug.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A07&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Identification and Authentication Failures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Poor login/session handling or password policy.&lt;/td&gt;
&lt;td&gt;No account lockout after 10 failed login attempts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A08&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Software and Data Integrity Failures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trusting code or updates from untrusted sources.&lt;/td&gt;
&lt;td&gt;Auto-loading a plugin from an insecure 3rd-party server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A09&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Security Logging and Monitoring Failures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No logging, alerting, or visibility into attacks.&lt;/td&gt;
&lt;td&gt;Failed logins or admin actions are not logged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Server-Side Request Forgery (SSRF)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;App can be tricked into making requests to internal systems.&lt;/td&gt;
&lt;td&gt;Attacker sends URL to internal resource like &lt;code&gt;http://localhost/admin&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>dotnet</category>
      <category>owasp</category>
    </item>
    <item>
      <title>Supercharging Entity Framework Core: Efficient Bulk Inserts Without Loops or Raw SQL</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Fri, 27 Jun 2025 02:00:00 +0000</pubDate>
      <link>https://forem.com/davinceleecode/supercharging-entity-framework-core-efficient-bulk-inserts-without-loops-or-raw-sql-1356</link>
      <guid>https://forem.com/davinceleecode/supercharging-entity-framework-core-efficient-bulk-inserts-without-loops-or-raw-sql-1356</guid>
      <description>&lt;p&gt;When working with large datasets in .NET, it's tempting to use &lt;code&gt;foreach&lt;/code&gt; loops or raw SQL to insert records. But in Entity Framework Core (EF Core), there's a better way — efficient, clean, and scalable.&lt;/p&gt;

&lt;p&gt;This guide shows how to handle &lt;strong&gt;bulk inserts in EF Core&lt;/strong&gt; the right way — especially when inserting &lt;strong&gt;hundreds or thousands&lt;/strong&gt; of records.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Common Pitfalls (What NOT to Do)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ 1. Insert One-by-One in a Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChanges&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Very slow, one DB call per insert&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;Causes N separate database calls&lt;/li&gt;
&lt;li&gt;Slows down drastically as data grows&lt;/li&gt;
&lt;li&gt;Risk of transaction bloat and timeouts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ 2. Manually Build Raw SQL
&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;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;Products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'B'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;-- ❌ Hard to maintain&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Risk of SQL injection if not parameterized&lt;/li&gt;
&lt;li&gt;No benefit from EF tracking&lt;/li&gt;
&lt;li&gt;Difficult to integrate with domain logic&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Recommended Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Use AddRange() + SaveChanges()
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="k"&gt;for&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;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Product &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10.0m&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Single batch insert&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Fast and clean&lt;/li&gt;
&lt;li&gt;One DB round-trip&lt;/li&gt;
&lt;li&gt;Works well for up to ~10,000 rows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Handling Very Large Datasets (Chunking)
&lt;/h3&gt;

&lt;p&gt;When inserting more than 10,000 records, chunk your data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;batchSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Chunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;batchSize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// .NET 6+&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChangeTracker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 🚀 Prevent memory bloat&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;Keeps memory usage low&lt;/li&gt;
&lt;li&gt;Avoids EF tracking overload&lt;/li&gt;
&lt;li&gt;Improves throughput for very large inserts&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;.Chunk()&lt;/code&gt; is available in .NET 6+. For earlier versions, use your own batching logic.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ✅ Tips
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AddRange + SaveChanges&lt;/td&gt;
&lt;td&gt;Up to ~10k inserts&lt;/td&gt;
&lt;td&gt;Safe and simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chunked batches&lt;/td&gt;
&lt;td&gt;10k+ records&lt;/td&gt;
&lt;td&gt;Prevents memory leaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFCore.BulkExtensions&lt;/td&gt;
&lt;td&gt;High-performance bulk ops (100k+)&lt;/td&gt;
&lt;td&gt;External lib, extremely fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COPY (PostgreSQL) / TVPs&lt;/td&gt;
&lt;td&gt;DB-level jobs or imports&lt;/td&gt;
&lt;td&gt;Not EF-based, advanced use case&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  ✅ Prevent Abuse in APIs
&lt;/h3&gt;

&lt;p&gt;To avoid overload from users uploading massive data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Limit payloads to 100–1000 items per request&lt;/li&gt;
&lt;li&gt;✅ Use ModelState or middleware to reject oversized payloads&lt;/li&gt;
&lt;li&gt;✅ Apply rate-limiting to prevent abuse&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📎 Summary
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;EF Core can handle large inserts efficiently — if you use it right.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;AddRange()&lt;/code&gt; for natural batching&lt;/li&gt;
&lt;li&gt;Avoid per-record inserts and raw SQL&lt;/li&gt;
&lt;li&gt;Split into chunks for massive loads&lt;/li&gt;
&lt;li&gt;Clear the change tracker after each batch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you found this helpful, consider supporting my work at &lt;a href="https://buymeacoffee.com/davinceleecode" rel="noopener noreferrer"&gt;☕ Buy Me a Coffee&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>csharp</category>
      <category>database</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
