<?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: davinceleecode</title>
    <description>The latest articles on DEV Community by davinceleecode (@davinceleecode).</description>
    <link>https://dev.to/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>DEV Community: davinceleecode</title>
      <link>https://dev.to/davinceleecode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davinceleecode"/>
    <language>en</language>
    <item>
      <title>Code Coverage .NET</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Sat, 23 May 2026 13:17:45 +0000</pubDate>
      <link>https://dev.to/davinceleecode/code-coverage-net-2ai0</link>
      <guid>https://dev.to/davinceleecode/code-coverage-net-2ai0</guid>
      <description>&lt;h2&gt;
  
  
  Code Coverage .NET
&lt;/h2&gt;

&lt;p&gt;For .NET projects, the most common manual way is using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;coverlet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or built-in &lt;code&gt;dotnet test --collect:"XPlat Code Coverage"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simplest first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--collect&lt;/span&gt;:&lt;span class="s2"&gt;"XPlat Code Coverage"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running, you’ll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Attachments:
.../coverage.cobertura.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That XML file contains the coverage result.&lt;/p&gt;

&lt;p&gt;Then install the report generator globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; dotnet-reportgenerator-globaltool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate an HTML report:&lt;/p&gt;

&lt;p&gt;If this is not working target directly the result file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reportgenerator &lt;span class="nt"&gt;-reports&lt;/span&gt;:&lt;span class="k"&gt;**&lt;/span&gt;/coverage.cobertura.xml &lt;span class="nt"&gt;-targetdir&lt;/span&gt;:coveragereport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;target result file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reportgenerator &lt;span class="nt"&gt;-reports&lt;/span&gt;:TestResults/&lt;span class="o"&gt;{&lt;/span&gt;ID&lt;span class="o"&gt;}&lt;/span&gt;/coverage.cobertura.xml &lt;span class="nt"&gt;-targetdir&lt;/span&gt;:coveragereport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;coveragereport/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Line coverage&lt;/li&gt;
&lt;li&gt;Branch coverage&lt;/li&gt;
&lt;li&gt;Covered/not covered lines&lt;/li&gt;
&lt;li&gt;Per class/service/controller coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typical enterprise flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt;
-&amp;gt; code coverage
-&amp;gt; stryker mutation &lt;span class="nb"&gt;test&lt;/span&gt;
-&amp;gt; CI/CD quality gate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Question
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is the official steps after setting-up above?
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--collect&lt;/span&gt;:&lt;span class="s2"&gt;"XPlat Code Coverage"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;If this is not working target directly the result file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reportgenerator &lt;span class="nt"&gt;-reports&lt;/span&gt;:&lt;span class="k"&gt;**&lt;/span&gt;/coverage.cobertura.xml &lt;span class="nt"&gt;-targetdir&lt;/span&gt;:coveragereport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;target result file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reportgenerator &lt;span class="nt"&gt;-reports&lt;/span&gt;:TestResults/&lt;span class="o"&gt;{&lt;/span&gt;ID&lt;span class="o"&gt;}&lt;/span&gt;/coverage.cobertura.xml &lt;span class="nt"&gt;-targetdir&lt;/span&gt;:coveragereport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;coveragereport/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  COVERLET
&lt;/h2&gt;

&lt;p&gt;Coverlet is the more common approach in real .NET projects now because it integrates nicely with CI/CD and gives flexible reporting.&lt;/p&gt;

&lt;p&gt;Here’s the normal flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install Coverlet in your TEST project
&lt;/h3&gt;

&lt;p&gt;Inside your test project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package coverlet.msbuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds the MSBuild integration of Coverlet.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Run coverage manually
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; /p:CollectCoverage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running, you’ll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+--------+------+--------+--------+
| Module | Line | Branch | Method |
+--------+------+--------+--------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and a generated file:&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="err"&gt;coverage.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Generate HTML report (better UI)
&lt;/h3&gt;

&lt;p&gt;Usually we use Cobertura format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; /p:CollectCoverage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; /p:CoverletOutputFormat&lt;span class="o"&gt;=&lt;/span&gt;cobertura
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then generate HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reportgenerator &lt;span class="nt"&gt;-reports&lt;/span&gt;:coverage.cobertura.xml &lt;span class="nt"&gt;-targetdir&lt;/span&gt;:coveragereport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;coveragereport/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Future workflow now
&lt;/h2&gt;

&lt;p&gt;Whenever code changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; /p:CollectCoverage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; /p:CoverletOutputFormat&lt;span class="o"&gt;=&lt;/span&gt;cobertura
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;reportgenerator &lt;span class="nt"&gt;-reports&lt;/span&gt;:coverage.cobertura.xml &lt;span class="nt"&gt;-targetdir&lt;/span&gt;:coveragereport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Difference from built-in collector
&lt;/h3&gt;

&lt;p&gt;Built-in collector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--collect&lt;/span&gt;:&lt;span class="s2"&gt;"XPlat Code Coverage"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Coverlet MSBuild:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; /p:CollectCoverage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both are valid.&lt;/p&gt;

&lt;p&gt;But Coverlet gives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;easier CI/CD integration&lt;/li&gt;
&lt;li&gt;thresholds&lt;/li&gt;
&lt;li&gt;filtering&lt;/li&gt;
&lt;li&gt;merging reports&lt;/li&gt;
&lt;li&gt;multiple formats&lt;/li&gt;
&lt;li&gt;more enterprise flexibility&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt; /p:CollectCoverage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; /p:Threshold&lt;span class="o"&gt;=&lt;/span&gt;80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This FAILS the build if coverage goes below 80%.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>testing</category>
      <category>devops</category>
      <category>code</category>
    </item>
    <item>
      <title>Fastest Way to Understand Stryker</title>
      <dc:creator>davinceleecode</dc:creator>
      <pubDate>Fri, 22 May 2026 14:57:01 +0000</pubDate>
      <link>https://dev.to/davinceleecode/fastest-way-to-understand-stryker-2hd0</link>
      <guid>https://dev.to/davinceleecode/fastest-way-to-understand-stryker-2hd0</guid>
      <description>&lt;h2&gt;
  
  
  FASTEST WAY TO UNDERSTAND STRYKER
&lt;/h2&gt;

&lt;p&gt;We'll create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Console App
   ↓
Class Library
   ↓
Unit Test Project
   ↓
Run Stryker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;solution structure&lt;/li&gt;
&lt;li&gt;testing flow&lt;/li&gt;
&lt;li&gt;mutation testing&lt;/li&gt;
&lt;li&gt;enterprise-level quality tooling&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  STEP 1 - Create Solution
&lt;/h3&gt;

&lt;p&gt;Open terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;StrykerDemo
&lt;span class="nb"&gt;cd &lt;/span&gt;StrykerDemo

dotnet new sln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  STEP 2 - Create Class Library
&lt;/h3&gt;

&lt;p&gt;This contains business logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new classlib &lt;span class="nt"&gt;-n&lt;/span&gt; StrykerDemo.Core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet sln add StrykerDemo.Core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  STEP 3 - Create Test Project
&lt;/h3&gt;

&lt;p&gt;Use xUnit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new xunit &lt;span class="nt"&gt;-n&lt;/span&gt; StrykerDemo.Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet sln add StrykerDemo.Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reference Core project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add StrykerDemo.Tests reference StrykerDemo.Core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  STEP 4 - Create Actual Logic
&lt;/h3&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Create:&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;namespace&lt;/span&gt; &lt;span class="nn"&gt;StrykerDemo.Core&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&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="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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  STEP 5 - Create Unit Test
&lt;/h3&gt;

&lt;p&gt;Inside test project:&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;using&lt;/span&gt; &lt;span class="nn"&gt;StrykerDemo.Core&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;StrykerDemo.Tests&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CalculatorTests&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fact&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Add_Should_Return_Correct_Value&lt;/span&gt;&lt;span class="p"&gt;()&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;calculator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Calculator&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;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculator&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="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&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="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;
  
  
  STEP 6 - Verify Tests
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Passed!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  STEP 7 - Install Stryker
&lt;/h3&gt;

&lt;p&gt;Install globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; dotnet-stryker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet stryker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  STEP 8 — RUN STRYKER
&lt;/h3&gt;

&lt;p&gt;Go to test project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;StrykerDemo.Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet stryker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  WHAT HAPPENS NOW
&lt;/h3&gt;

&lt;p&gt;Stryker will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find your code&lt;/li&gt;
&lt;li&gt;Mutate it&lt;/li&gt;
&lt;li&gt;Run tests repeatedly&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Original:&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="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a - b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your test expects:&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="m"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mutated result:&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="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test fails.&lt;/p&gt;

&lt;p&gt;Mutation killed ✅&lt;/p&gt;




&lt;h3&gt;
  
  
  NOW LET’S SEE A SURVIVING MUTATION
&lt;/h3&gt;

&lt;p&gt;Change test to weak test:&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="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;True&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;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of:&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="n"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now rerun Stryker.&lt;/p&gt;

&lt;p&gt;Some mutations may survive because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subtraction may still return positive&lt;/li&gt;
&lt;li&gt;your assertion is too generic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;THIS is where mutation testing becomes powerful.&lt;/p&gt;




&lt;h3&gt;
  
  
  Viewing the Stryker HTML Report
&lt;/h3&gt;

&lt;p&gt;After running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet stryker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stryker automatically generates an HTML report inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;StrykerOutput/&amp;lt;timestamp&amp;gt;/reports/mutation-report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;StrykerOutput/2026-05-23.14-56-48/reports/mutation-report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also automatically open the report in your browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet stryker &lt;span class="nt"&gt;--open-report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet stryker &lt;span class="nt"&gt;-o&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  THE BIG ENTERPRISE INSIGHT
&lt;/h3&gt;

&lt;p&gt;In real enterprise systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code coverage can say 90%&lt;/li&gt;
&lt;li&gt;but mutation score may say 40%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meaning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;tests execute code but don’t truly verify behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s why mature engineering teams use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unit tests&lt;/li&gt;
&lt;li&gt;integration tests&lt;/li&gt;
&lt;li&gt;mutation testing&lt;/li&gt;
&lt;li&gt;quality gates in CI/CD&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  HOW THIS LOOKS IN GITHUB
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Actions
    ↓
dotnet test
    ↓
dotnet stryker
    ↓
Fail pipeline if mutation score low
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where you begin seeing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real engineering ownership&lt;/li&gt;
&lt;li&gt;architecture visibility&lt;/li&gt;
&lt;li&gt;DevOps quality flow&lt;/li&gt;
&lt;li&gt;not just user story implementation&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  WHAT YOU SHOULD DO NEXT
&lt;/h3&gt;

&lt;p&gt;After this basic example:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add more methods&lt;/li&gt;
&lt;li&gt;Add edge cases&lt;/li&gt;
&lt;li&gt;Purposely create weak tests&lt;/li&gt;
&lt;li&gt;Watch mutations survive&lt;/li&gt;
&lt;li&gt;Improve tests&lt;/li&gt;
&lt;li&gt;Re-run Stryker
That loop teaches more than tutorials.&lt;/li&gt;
&lt;/ol&gt;




</description>
      <category>programming</category>
      <category>unittest</category>
      <category>beginners</category>
      <category>csharp</category>
    </item>
    <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://dev.to/davinceleecode/azure-integration-services-complete-guide-5c64</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/sql-normalization-vs-denormalization-explained-with-1nf-2nf-and-3nf-2gpa</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/ai-genie-a-multimodal-qa-assistant-with-google-gemini-3dnb</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/-1096</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/this-is-a-submission-for-the-midnight-network-privacy-first-challenge-41m1</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/major-algorithm-types-cheat-sheet-1meo</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/time-complexity-big-o-notation-in-algorithms-22lf</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/common-challenges-for-developers-and-learners-hm2</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/when-to-use-which-hook-1700</link>
      <guid>https://dev.to/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://dev.to/davinceleecode/what-is-dangling-dns-and-how-it-can-lead-to-domain-takeovers-2m46</link>
      <guid>https://dev.to/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>
  </channel>
</rss>
