<?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: tawseef nabi</title>
    <description>The latest articles on DEV Community by tawseef nabi (@tawseef).</description>
    <link>https://dev.to/tawseef</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%2F153034%2F3c64c751-647b-4fab-a664-66d9097870c3.jpg</url>
      <title>DEV Community: tawseef nabi</title>
      <link>https://dev.to/tawseef</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tawseef"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>tawseef nabi</dc:creator>
      <pubDate>Mon, 06 Oct 2025 12:29:33 +0000</pubDate>
      <link>https://dev.to/tawseef/-111h</link>
      <guid>https://dev.to/tawseef/-111h</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sagar/level-up-your-sprints-how-im-using-ai-to-plan-like-a-boss-1lj0" class="crayons-story__hidden-navigation-link"&gt;Level Up Your Sprints: How I'm Using AI to Plan Like a Boss&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/sagar" class="crayons-avatar  crayons-avatar--l  "&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%2F81664%2Fc08a6b5d-14ae-48ba-b808-2d977d9cc358.jpg" alt="sagar profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sagar" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sagar
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sagar
                
              
              &lt;div id="story-author-preview-content-2844525" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sagar" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F81664%2Fc08a6b5d-14ae-48ba-b808-2d977d9cc358.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sagar&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sagar/level-up-your-sprints-how-im-using-ai-to-plan-like-a-boss-1lj0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 14 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sagar/level-up-your-sprints-how-im-using-ai-to-plan-like-a-boss-1lj0" id="article-link-2844525"&gt;
          Level Up Your Sprints: How I'm Using AI to Plan Like a Boss
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/sagar/level-up-your-sprints-how-im-using-ai-to-plan-like-a-boss-1lj0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/sagar/level-up-your-sprints-how-im-using-ai-to-plan-like-a-boss-1lj0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Clustering in Node.JS</title>
      <dc:creator>tawseef nabi</dc:creator>
      <pubDate>Tue, 16 Aug 2022 14:28:43 +0000</pubDate>
      <link>https://dev.to/tawseef/clustering-in-nodejs-4pgn</link>
      <guid>https://dev.to/tawseef/clustering-in-nodejs-4pgn</guid>
      <description>&lt;p&gt;An instance of Node.js runs in a single thread which means that on a multi-core system (which most computers are these days), not all cores will be utilized by the app. To take advantage of the other available cores, you can launch a cluster of Node.js processes and distribute the load between them.&lt;/p&gt;

&lt;p&gt;Having multiple threads to handle requests improves the throughput (requests/second) of your server as several clients can be served concurrently. We'll see how to create child processes with the Node.js cluster module and then later, we'll take a look at how to manage clustering with the PM2 Process Manager.&lt;br&gt;
With multiple processes, if one process is busy with a relatively CPU-intensive operation, other processes can take up the other requests coming in, utilizing the other CPUs/cores available. This is the power of the cluster module where workers share the load and the app does not come to a stop due to high load.&lt;/p&gt;

&lt;p&gt;The master process can distribute the load to the child process in two ways. The first (and default) is a round-robin fashion. The second way is the master process listens to a socket and sends the work to interested workers. The workers then process the incoming requests.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building a simple Express server without clustering:
&lt;/h2&gt;

&lt;p&gt;We will start by creating a simple Express server. This server will do a relatively heavy computational task which will deliberately block the event loop. Our first example will be without any clustering.&lt;/p&gt;

&lt;p&gt;To get Express set up in a new project we can run the following on the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir nodejs-cluster-module
cd nodejs-cluster-module/
npm init -y
npm install --save express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we will create a file called &lt;code&gt;no-cluster.js&lt;/code&gt; on the root of the project like below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjok0w6v6blkmw13gxrxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjok0w6v6blkmw13gxrxk.png" alt="projetc-structure-no-cluster" width="541" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The contents of the &lt;code&gt;no-cluster.js&lt;/code&gt; file will be as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require("express");
const app = express();
const port = 3000;
console.log(`Worker ${process.pid} started`);
app.get("/", (req, res) =&amp;gt; {
  res.send("Hello World!");
});

app.get("/api/:n", function (req, res) {
  console.time('no-cluster')
  let n = parseInt(req.params.n);
  let count = 0;

  if (n &amp;gt; 5000000000) n = 5000000000;

  for (let i = 0; i &amp;lt;= n; i++) {
    count += i;
  }
  console.timeEnd('no-cluster')
  console.log("Final count is ", count)
  res.send(`Final count is ${count}`);
});

app.listen(port, () =&amp;gt; {
  console.log(`App listening on port ${port}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the app contains two routes — &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a root route that returns the string "Hello World" &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;another route that takes a route parameter &lt;code&gt;n&lt;/code&gt; and adds numbers up to n to a variable count before returning a string containing the final count.&lt;br&gt;
The operation is an 0(n) operation so it offers us easy way to simulate long-running operations on the server — if we feed it a large enough value for n. We cap n off at 5,000,000,000 — let's spare our computer from having to run so many operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run the app with node app.js and pass it a decently small value for n (e.g. &lt;a href="http://localhost:3000/api/50" rel="noopener noreferrer"&gt;http://localhost:3000/api/50&lt;/a&gt;), it will execute quickly and return a response almost immediately. The root route (&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;) also returns a response quickly.&lt;br&gt;
we can see response time below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F5t4u181nalb81ih22ecw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F5t4u181nalb81ih22ecw.jpg" alt="no-cluster-for-n-50" width="280" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if we increase the value of n, we can see API response takes time. On increasing the value of n, the problem with single thread is clearly visible&lt;br&gt;
e.g  if n=5,000,000,000, the App will take few seconds to complete the response  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fguzrnsojvzwp5ylnaxlw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fguzrnsojvzwp5ylnaxlw.jpg" alt="no-cluster-for-n-50000000" width="309" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As seen above, the API took 5.179s for n=50000000000  to finish as per our profiling added with console.time and console.timeEnd calls.&lt;/p&gt;
&lt;h2&gt;
  
  
  Adding Node.js clustering to an Express server
&lt;/h2&gt;

&lt;p&gt;Now, let's use the cluster module in the app to spawn some child processes and see how that improves things.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require("express");
const port = 3000;
const cluster = require("cluster");
const totalCPUs = require("os").cpus().length;

if (cluster.isMaster) {
  console.log(`Number of CPUs is ${totalCPUs}`);
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i &amp;lt; totalCPUs; i++) {
    cluster.fork();
  }

  cluster.on("exit", (worker, code, signal) =&amp;gt; {
    console.log(`worker ${worker.process.pid} died`);
    console.log("Let's fork another worker!");
    cluster.fork();
  });
} else {
  const app = express();
  console.log(`Worker ${process.pid} started`);

  app.get("/", (req, res) =&amp;gt; {
    res.send("Hello World!");
  });

  app.get("/api/:n", function (req, res) {
    console.time("cluster")
    let n = parseInt(req.params.n);
    let count = 0;

    if (n &amp;gt; 5000000000) n = 5000000000;

    for (let i = 0; i &amp;lt;= n; i++) {
      count += i;
    }
    console.timeEnd("cluster")
    console.log("Final count is ", count)
    res.send(`Final count is ${count}`);
  });

  app.listen(port, () =&amp;gt; {
    console.log(`App listening on port ${port}`);
  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app does the same thing as before, but this time, we are spawning up several child processes that will all share port 3000 and that will be able to handle requests sent to this port. The worker processes are spawned using the child_process.fork() method. The method returns a ChildProcess object that has a built-in communication channel that allows messages to be passed back and forth between the child and its parent.&lt;br&gt;
we get the number of CPUs available with &lt;code&gt;require('os').cpus().length&lt;/code&gt;&lt;br&gt;
If it is not the master process, it is the child process, and there we call the startExpress function. This function is the same as the Express server in the previous example without clustering.&lt;br&gt;
We create as many child processes as there are CPU cores on the machine the app is running. It is recommended to not create more workers than there are logical cores on the computer as this can cause an overhead in terms of scheduling costs. This happens because the system will have to schedule all the created processes so that each gets a turn on the few cores.&lt;/p&gt;

&lt;p&gt;The workers are created and managed by the master process. When the app first runs, we check to see if it's a master process with isMaster. This is determined by the process.env.NODE_UNIQUE_ID variable. If process.env.NODE_UNIQUE_ID is undefined, then isMaster will be true.&lt;/p&gt;

&lt;p&gt;If the process is a master, we then call cluster.fork() to spawn several processes. We log the master and worker process IDs. Below, you can see the output from running the app on a four-core system. When a child process dies, we spawn a new one to keep utilizing the available CPU cores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fuagdinp5h15f5sxq4ot2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fuagdinp5h15f5sxq4ot2.jpg" alt="cluster" width="676" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can see, all eight CPUs have eight relevant workers running ready to take up any requests coming in. If we hit &lt;a href="http://localhost:3000/api/:n" rel="noopener noreferrer"&gt;http://localhost:3000/api/:n&lt;/a&gt; we will see the following output, identical to the output from the previous non-clustering server&lt;/p&gt;
&lt;h2&gt;
  
  
  Load testing servers with and without clustering
&lt;/h2&gt;

&lt;p&gt;To load test our Node.js servers with and without clustering, we will use the &lt;a href="https://www.npmjs.com/package/loadtest" rel="noopener noreferrer"&gt;loadtest&lt;/a&gt;  tool. Other options can be the &lt;a href="https://geshan.com.np/blog/2020/09/vegeta-load-testing-primer-with-examples/" rel="noopener noreferrer"&gt;Vegeta load testing&lt;/a&gt;  or the &lt;a href="https://httpd.apache.org/docs/2.4/programs/ab.html" rel="noopener noreferrer"&gt;Apache benchmark tool&lt;/a&gt; as well.&lt;br&gt;
The loadtest package allows you to simulate a large number of concurrent connections to your API so that you can measure its performance.&lt;br&gt;
To use loadtest, first install it globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g loadtest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the app that you want to test with node app.js. We'll start by testing the version that doesn't use clustering.&lt;/p&gt;

&lt;p&gt;With the app running, open another Terminal and run the following load test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; loadtest http://localhost:3000/api/500000 -n 1000 -c 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above command will send 1000 requests to the given URL, of which 100 are concurrent. The following is the output from running the above command:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fr0nx410zwu5iqv5594c2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fr0nx410zwu5iqv5594c2.jpg" alt="non-cluster" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We see that with the same request (with n = 500000) the server was able to handle 786 requests per second with a mean latency of 121 milliseconds (the average time it took to complete a single request).&lt;/p&gt;

&lt;p&gt;Let's try it again but with more requests this time (and with no clusters):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
 loadtest http://localhost:3000/api/5000000 -n 1000 -c 100&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fvap4sj3ea1cn7yfrsnnr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fvap4sj3ea1cn7yfrsnnr.jpg" alt="non-cluster" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With a request where n = 5000000 the server was able to handle 183 requests per second with a mean latency of 517.1 milliseconds.&lt;/p&gt;

&lt;p&gt;Let's compare this result with that of the app that uses clusters.&lt;/p&gt;

&lt;p&gt;Below are the results for testing for &lt;a href="http://localhost:3000/api/500000:" rel="noopener noreferrer"&gt;http://localhost:3000/api/500000:&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F1n4wmr73czrvepglcw2w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F1n4wmr73czrvepglcw2w.jpg" alt="cluster" width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tested with the same requests (when n = 500000), the app that uses clustering was able to handle 1051 requests per second — a significant increase, compared to the 788 requests per second of the app with no clusters. The mean latency of the clustered app is 91.2 milliseconds, compared to 121 of the app with no clusters. You can clearly see the improvement that clustering added to the app.&lt;/p&gt;

&lt;p&gt;We'll run two more tests for each of our apps. We'll test requests that aren't CPU-intensive and that run fairly quickly without overloading the Event Loop.&lt;/p&gt;

&lt;p&gt;With the no-cluster app running, execute the following test:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
loadtest http://localhost:3000/api/50 -n 1000 -c 100&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F4jl5ao1lgp8eylzxccdz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F4jl5ao1lgp8eylzxccdz.jpg" alt="non-cluster" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the same no-cluster app still running, execute the following test:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
loadtest http://localhost:3000/api/5000 -n 1000 -c 100&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Here are the summarized results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fq8d5bw9qry2ssvzm3jl7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fq8d5bw9qry2ssvzm3jl7.jpg" alt="non-cluster" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the cluster app running, execute the following test:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
loadtest http://localhost:3000/api/50 -n 1000 -c 100&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
The summarized results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F2n2f9rqp8tx88lg4upc1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2n2f9rqp8tx88lg4upc1.jpg" alt="cluster" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The clustered app ran 1482 requests per second compared to 1481 of the no-cluster one and had a mean latency of 64.2 milliseconds compared to 64.3 of the no-cluster one.&lt;/p&gt;

&lt;p&gt;Let's run the other test. With the same cluster app still running, execute the test below:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
loadtest http://localhost:3000/api/5000 -n 1000 -c 100&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
The summarized results:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fdetnmdp1g805q9gxpppo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fdetnmdp1g805q9gxpppo.jpg" alt="cluster" width="344" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, the clustered app ran 1475 requests per second compared to 1465 of the no-cluster one and had a mean latency of 65.2 milliseconds compared to 64.6 of the no-cluster one.&lt;/p&gt;

&lt;p&gt;Based on those tests, you can see that clustering didn't offer much improvement to the app's performance. In fact, the clustered app performed a bit worse compared to the one that doesn't use clusters. How come?&lt;/p&gt;

&lt;p&gt;In the tests above, we call our API with a fairly small value for n, which means that the number of times the loop in our code will run is considerably small. The operation won't be that CPU-intensive. Clustering shines when it comes to CPU-intensive tasks. When your app is likely to run such tasks, then clustering will offer an advantage in terms of the number of such tasks it can run at a time.&lt;/p&gt;

&lt;p&gt;However, if your app isn't running a lot of CPU-intensive tasks, then it might not be worth the overhead to spawn up so many workers. Remember, each process you create has its own memory and V8 instance. Because of the additional resource allocations, spawning a large number of child Node.js processes is not always recommended.&lt;/p&gt;

&lt;p&gt;In our example, the clustered app performs a bit worse than the no-cluster app because we are paying the overhead for creating several child processes that don't offer much advantage. In a real-world situation, you can use this to determine which apps in your microservice architecture could benefit from clustering — run tests to check if the benefits for the extra complexity are worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.appsignal.com/2021/02/03/improving-node-application-performance-with-clustering.html" rel="noopener noreferrer"&gt;https://blog.appsignal.com/2021/02/03/improving-node-application-performance-with-clustering.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.logrocket.com/optimize-node-js-performance-with-clustering/" rel="noopener noreferrer"&gt;https://blog.logrocket.com/optimize-node-js-performance-with-clustering/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Modifiers in solidity</title>
      <dc:creator>tawseef nabi</dc:creator>
      <pubDate>Mon, 24 Jan 2022 15:05:58 +0000</pubDate>
      <link>https://dev.to/tawseef/modifiers-in-solidity-do1</link>
      <guid>https://dev.to/tawseef/modifiers-in-solidity-do1</guid>
      <description>&lt;p&gt;Modifiers can be used to change the behavior of functions in a declarative way. &lt;br&gt;
For example, you can use a modifier to automatically check a condition prior to executing the function. they can be used for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Restrict access&lt;/li&gt;
&lt;li&gt;Validate inputs&lt;/li&gt;
&lt;li&gt;Guard against reentrancy hack&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;use the &lt;code&gt;modifier&lt;/code&gt; in the declaration of a function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modifier to check that the caller is the owner of the contract&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;modifier onlyOwner &lt;span class="o"&gt;{&lt;/span&gt;
   require&lt;span class="o"&gt;(&lt;/span&gt;msg.sender &lt;span class="o"&gt;==&lt;/span&gt; owner&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     // Underscore is a special character only used inside
     // a &lt;span class="k"&gt;function &lt;/span&gt;modifier and it tells Solidity to
     // execute the rest of the code.
   _&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modifiers can take inputs. This modifier checks that the address passed in is not the zero address.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; modifier validAddress&lt;span class="o"&gt;(&lt;/span&gt;address _addr&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       require&lt;span class="o"&gt;(&lt;/span&gt;_addr &lt;span class="o"&gt;!=&lt;/span&gt; address&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="s2"&gt;"Not valid address"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
       _&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;changeOwner&lt;span class="o"&gt;(&lt;/span&gt;address _newOwner&lt;span class="o"&gt;)&lt;/span&gt; public onlyOwner validAddress&lt;span class="o"&gt;(&lt;/span&gt;_newOwner&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       owner &lt;span class="o"&gt;=&lt;/span&gt; _newOwner&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modifiers can be called before and / or after a function.This modifier prevents a function from being called while,it is still executing.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; modifier noReentrancy&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   require&lt;span class="o"&gt;(!&lt;/span&gt;locked, &lt;span class="s2"&gt;"No reentrancy"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     locked &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     _&lt;span class="p"&gt;;&lt;/span&gt;
     locked &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;

 &lt;span class="k"&gt;function &lt;/span&gt;decrement&lt;span class="o"&gt;(&lt;/span&gt;uint i&lt;span class="o"&gt;)&lt;/span&gt; public noReentrancy &lt;span class="o"&gt;{&lt;/span&gt;
   x -&lt;span class="o"&gt;=&lt;/span&gt; i&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;i &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
     decrement&lt;span class="o"&gt;(&lt;/span&gt;i - 1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>solidity</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>function</category>
    </item>
    <item>
      <title>Mapping in solidity</title>
      <dc:creator>tawseef nabi</dc:creator>
      <pubDate>Sat, 22 Jan 2022 07:29:52 +0000</pubDate>
      <link>https://dev.to/tawseef/mapping-in-solidity-63</link>
      <guid>https://dev.to/tawseef/mapping-in-solidity-63</guid>
      <description>&lt;p&gt;Mapping in Solidity acts like a hash table or dictionary in any other language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mapping(key =&amp;gt; value) &amp;lt;access specifier&amp;gt; &amp;lt;name&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;keys are mapped to a value. Data isn't stored in a mapping, only its hash value.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;key: any built-in types like &lt;code&gt;uint&lt;/code&gt; , &lt;code&gt;bytes&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;  except  for a &lt;code&gt;mapping&lt;/code&gt;, &lt;code&gt;a dynamically sized array&lt;/code&gt;, a &lt;code&gt;contract&lt;/code&gt;, an &lt;code&gt;enum&lt;/code&gt; and a &lt;code&gt;struct&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;value: any type including &lt;code&gt;mapping&lt;/code&gt;, &lt;code&gt;struct&lt;/code&gt;, &lt;code&gt;arrays&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They don't have a length and you can't iterate through the mapping.&lt;br&gt;
e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// mapping declaration
mapping&lt;span class="o"&gt;(&lt;/span&gt;uint &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; string &lt;span class="o"&gt;)&lt;/span&gt;public people

// update mapping
 people[10] &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Mark'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; // assigns a value
people[12] &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Andrew'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

 // reading  values

people[1] // reads a value

 people[unknown_key]    //will &lt;span class="k"&gt;return &lt;/span&gt;the default value of the &lt;span class="nb"&gt;type&lt;/span&gt;, i.e &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;string or 0 &lt;span class="k"&gt;for &lt;/span&gt;unint

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Assign an array as a map value&lt;/strong&gt;&lt;br&gt;
We can assign an array as a value type to a map and can access them as we would an array like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract Mapping {

    mapping(address =&amp;gt; uint[]) scores;    

    function manipulateArrayMap() external {
        scores[msg.sender].push(1);             //assign a value; 
        scores[msg.sender].push(2);             //assign another element

        scores[msg.sender][0];                  //access the element in the map array

        scores[msg.sender][1] = 5;              //update an element in the map array in index 1

        delete scores[msg.sender][0];           //delete the element in the index 0 of the map array
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Assign another map as a map value&lt;/strong&gt;&lt;br&gt;
We can also assign another map as a map value and can access them as we would access a map like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract Mapping {

    mapping(address =&amp;gt; uint) balances;
    mapping(address =&amp;gt; mapping(address =&amp;gt; bool)) approved;

    function manipulateMapOfMap(spender) external {
        approved[msg.sender][spender] = true                     //assign a value to the approved map
        approved[msg.sender][spender];                           //get the value of the map

        delete approved[msg.sender][spender]                     //delete the reference
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common Use case&lt;/strong&gt;&lt;br&gt;
associate unique Ethereum addresses with associated unique values&lt;/p&gt;

</description>
      <category>solidity</category>
      <category>web3</category>
      <category>mapping</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Require vs Assert in Solidity</title>
      <dc:creator>tawseef nabi</dc:creator>
      <pubDate>Sun, 02 Jan 2022 07:51:02 +0000</pubDate>
      <link>https://dev.to/tawseef/require-vs-assert-in-solidity-5e9d</link>
      <guid>https://dev.to/tawseef/require-vs-assert-in-solidity-5e9d</guid>
      <description>&lt;p&gt;in Solidity version 0.4.10, the &lt;strong&gt;assert()&lt;/strong&gt;, &lt;strong&gt;require()&lt;/strong&gt;and &lt;strong&gt;revert()&lt;/strong&gt; functions were introduced.&lt;br&gt;
&lt;strong&gt;assert&lt;/strong&gt; and &lt;strong&gt;require&lt;/strong&gt; are convenience functions that check for conditions. In cases when conditions are not met, they throw exceptions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;require&lt;/strong&gt; is used to validate inputs and conditions before execution. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;assert&lt;/strong&gt; is used to check for code that should never be false. Failing assertion probably means that there is a bug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;revert()&lt;/strong&gt; is used  abort execution and revert state changes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Syntax
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;assert(bool condition)&lt;/code&gt; causes a &lt;code&gt;Panic&lt;/code&gt; error and thus state change reversion if the condition is not met - to be used for internal errors.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;require(bool condition)&lt;/code&gt; reverts if the condition is not met - to be used for errors in inputs or external components.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;require(bool condition, string memory message)&lt;/code&gt; reverts if the condition is not met - to be used for errors in inputs or external components. Also provides an error message.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;revert()&lt;/code&gt; abort execution and revert state changes&lt;/p&gt;

&lt;p&gt;&lt;code&gt;revert(string memory reason)&lt;/code&gt; abort execution and revert state changes, providing an explanatory string&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

contract Error {
    function testRequire(uint _i) public pure {
        // Require should be used to validate conditions such as:
        // - inputs
        // - conditions before execution
        // - return values from calls to other functions
        require(_i &amp;gt; 10, "Input must be greater than 10");
    }

    function testRevert(uint _i) public pure {
        // Revert is useful when the condition to check is complex.
        // This code does the exact same thing as the example above
        if (_i &amp;lt;= 10) {
            revert("Input must be greater than 10");
        }
    }

    uint public num;

    function testAssert() public view {
        // Assert should only be used to test for internal errors,
        // and to check invariants.

        // Here we assert that num is always equal to 0
        // since it is impossible to update the value of num
        assert(num == 0);
    }

    // custom error
    error InsufficientBalance(uint balance, uint withdrawAmount);

    function testCustomError(uint _withdrawAmount) public view {
        uint bal = address(this).balance;
        if (bal &amp;lt; _withdrawAmount) {
            revert InsufficientBalance({balance: bal, withdrawAmount: _withdrawAmount});
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Main Differences Between Assert vs Require In Solidity&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; ** Behavior of assert and require functions**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;assert() **and&lt;/strong&gt; require() **functions are a part of the error handling aspect in Solidity. Solidity makes use of state-reverting error handling exceptions. &lt;/p&gt;

&lt;p&gt;This means all changes made to the contract on that call or any sub-calls are undone if an error is thrown. It also flags an error.&lt;br&gt;
They are quite similar as both check for conditions and if they are not met, would throw an error.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Gas Utility&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The big difference between the two is that the **assert() **function when false, uses up all the remaining gas and reverts all the changes made.&lt;/p&gt;

&lt;p&gt;Meanwhile, a** require() **function when false, also reverts back all the changes made to the contract but does refund all the remaining gas fees we offered to pay. &lt;br&gt;
This is the most common Solidity function used by developers for debugging and error handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To handle errors, Solidity undoes changes that might have caused issues.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;assert&lt;/strong&gt; checks for internal errors. &lt;strong&gt;require&lt;/strong&gt; analyzes conditions.&lt;/li&gt;
&lt;li&gt;Exceptions that Solidity &lt;strong&gt;revert&lt;/strong&gt; generates can contain error strings&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>web3</category>
      <category>solidity</category>
      <category>errors</category>
    </item>
  </channel>
</rss>
