<?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: Excel Nwachukwu</title>
    <description>The latest articles on DEV Community by Excel Nwachukwu (@trillionclues).</description>
    <link>https://dev.to/trillionclues</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%2F887215%2F760aa2ec-d711-465c-9c6f-c08b2c031ded.jpg</url>
      <title>DEV Community: Excel Nwachukwu</title>
      <link>https://dev.to/trillionclues</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/trillionclues"/>
    <language>en</language>
    <item>
      <title>You don't know JavaScript reduce() method</title>
      <dc:creator>Excel Nwachukwu</dc:creator>
      <pubDate>Fri, 19 Aug 2022 09:55:00 +0000</pubDate>
      <link>https://dev.to/trillionclues/you-dont-know-javascript-reduce-method-1nh2</link>
      <guid>https://dev.to/trillionclues/you-dont-know-javascript-reduce-method-1nh2</guid>
      <description>&lt;p&gt;Do you know you could actually use the same reduce method you have always used to return the sum for chaining together your promises or to even compose functions?&lt;/p&gt;

&lt;p&gt;The reduce method is one of the most powerful array methods used in JavaScript alongside fellow avengers - the filter and map method.&lt;/p&gt;

&lt;p&gt;Being this powerful also means it's rarely understood by budding developers like me while being scarcely adopted by mainstream JavaScript developers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lBH6N3zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nee37qux5lrpfb40cj0j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lBH6N3zl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nee37qux5lrpfb40cj0j.png" alt="Javascript developers thinking" width="800" height="905"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, we're taking a look at its traditional usage for summing up values as well as two more interesting use cases later in the article.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Reduce Method?
&lt;/h2&gt;

&lt;p&gt;According to &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce"&gt;MDN&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The reduce() method executes a user-supplied "reducer" callback function on each element of the array, in order, passing in the return value from the calculation on the preceding element.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Similar to map, filter, and forEach, the reduce method allows us to iterate through our array, taking a callback function on each item and then returning a &lt;strong&gt;single value&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Interestingly, this single value can be anything from - number, array, or even an object.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Accumulator Function
&lt;/h2&gt;

&lt;p&gt;Obviously, the most common example known to man!&lt;/p&gt;

&lt;p&gt;Now, saying this is common might be relative but, this has to be the most basic use case of the reduce method out there on the web.&lt;/p&gt;

&lt;p&gt;Let's say we have an array of objects and we are looking to get the sum of the salary so we can make a decision on why the intern is getting $30 while the boss takes home $400.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Array of objects
const staff = [
  {name: 'bob', age: 20, position: 'developer', salary: 100},
  {name: 'peter', age: 25, position: 'designer', salary: 300},
  {name: 'susy', age: 30, position: 'CEO', salary: 400},
  {name: 'anna', age: 35, position: 'intern', salary: 30}
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's one way to use the reduce method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const totalSalary = staff.reduce((total, currSalary) =&amp;gt; {
  total = total + currSalary.salary
  return total
}, 0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NB: Always return the first parameter!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here, we are creating a new variable with the name &lt;code&gt;totalSalary&lt;/code&gt; and using the reduce method which takes two parameters - total, currSalary.&lt;/p&gt;

&lt;p&gt;Now, these two parameters can be named anything but essentially, the accumulator - &lt;code&gt;total&lt;/code&gt; and &lt;code&gt;currSalary&lt;/code&gt; refers to the sum of iteration and the current item being iterated at a given time respectively.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;total&lt;/code&gt; exists to hold the sum of each round of iteration while &lt;code&gt;currSalary&lt;/code&gt; identifies the next item in the loop to be iterated on.&lt;/p&gt;

&lt;p&gt;We also have to define the starting position of our loop and that's why we have 0 at the end of our callback function so our count starts from.&lt;/p&gt;

&lt;p&gt;In essence, here's what we're getting as a result from the function above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// console.log(total); 0, 100, 400, 800, 830
// console.log(currSalary.salary); 100, 300, 400, 30
console.log(totalSalary), // 830
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And just like that, you have the sum of salary paid out to employees in little to no code.&lt;/p&gt;

&lt;p&gt;However things get interesting from here :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LIar2qgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tavf6qba5lxamcpemfw7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LIar2qgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tavf6qba5lxamcpemfw7.jpg" alt="Javascript developers tutorials" width="680" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  More reduce method plsss...
&lt;/h3&gt;

&lt;p&gt;If you've only known and used the reduce to return the sum of values in an array, then check this space onwards for some magic!&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Chaining Together Promises
&lt;/h2&gt;

&lt;p&gt;The async keyword when managing long-running tasks might be the best thing that ever happened to JavaScript.&lt;/p&gt;

&lt;p&gt;In the way that it helps us group individual task in a function which can be passed into the next function.&lt;/p&gt;

&lt;p&gt;But, what of a situation you intend to use something asides the async keyword, and intend to achieve a clean code devoid of the popular callback hell.&lt;/p&gt;

&lt;p&gt;Using the reduce method in your function can be an option in achieving same purpose and ultimately helps you manage the different phase of each task iteration?&lt;/p&gt;

&lt;p&gt;Let's say we have local api containing some IDs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let itemIDs = [1, 2, 3, 4, 5]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One way we could chain together our promises without using the regular &lt;code&gt;.then&lt;/code&gt; function is this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const itemSum = itemIDs.reduce(async (promise, itemID) =&amp;gt; {
  const item = await promise
  return item.deleteItem(itemID)
}, Promise.resolve())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, essentially what we are doing is nothing more than your regular chain of .then commands like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Promise.resolve()
  .then((item) =&amp;gt; item.deleteItem(1))
  .then((item) =&amp;gt; item.deleteItem(2))
  .then((item) =&amp;gt; item.deleteItem(3))
  .then((item) =&amp;gt; item.deleteItem(4))
  .then((item) =&amp;gt; item.deleteItem(5))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Composing Functions
&lt;/h2&gt;

&lt;p&gt;The reduce method can also be used to compose our functions i.e define how and what direction we want the iteration to work.&lt;/p&gt;

&lt;p&gt;The reduce method is popularly known for acting as an accumulator but the gimmick is, that it always sorts the array from left to right.&lt;/p&gt;

&lt;p&gt;How about we define this in our own way by composing a function using reduce() and passing along the result to the next running function?&lt;/p&gt;

&lt;p&gt;This example is one I've jacked from &lt;a href="https://medium.com/@bojangbusiness/javascript-functional-programming-map-filter-and-reduce-846ff9ba492d"&gt;Bojan Gvozderac&lt;/a&gt; and his post on reduce, filter and map methods.&lt;/p&gt;

&lt;p&gt;We could have something interesting as this;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let double = [1, 2, 3, 4, 5]

const compose =
  (...double) =&amp;gt;
  (n) =&amp;gt;
    double.reduceRight((v, f) =&amp;gt; f(v), n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, this is really mind-blowing, which I've had quite a tough time grasping.&lt;/p&gt;

&lt;p&gt;But, this is the trick:&lt;/p&gt;

&lt;p&gt;We have a variable compose - which is partially applied using the rest parameter so that we can compose as many functions as we want and all of them will be put in the &lt;code&gt;double&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;Next, we pass an initial value &lt;code&gt;n&lt;/code&gt; after which we now use the &lt;code&gt;reduceRight&lt;/code&gt; together with the initial value &lt;code&gt;n&lt;/code&gt; to define the starting position of or composed function.&lt;/p&gt;

&lt;p&gt;It might get confusing but, this is the same as the &lt;code&gt;reduce&lt;/code&gt; method in the first example only that the accumulator starts counting from the end of the array and then moves to the start using the &lt;code&gt;(f, v)&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;Awesome confusion right!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wgZtGU12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfjtlenwlr10clew024k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wgZtGU12--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hfjtlenwlr10clew024k.jpg" alt="Javascript developers confused" width="787" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The reduce method is one hell of a method to use in different ways and with JavaScript without a definite structure, your guess...&lt;/p&gt;

&lt;p&gt;However, the amazing thing is that it passes the result of the callback function to the next allowing us to manipulate array data in different ways.&lt;/p&gt;

&lt;p&gt;Now, we have looked at really awesome use cases of the reduce method as well as a viable practice to employ when working with Api data.&lt;/p&gt;

&lt;p&gt;However, I would love to know which of these you have applied in a project of yours before.&lt;/p&gt;

&lt;p&gt;Also, If you know more fun and creative ways to use the reduce method, I’d really be glad to know about them in the comments😊&lt;/p&gt;

&lt;p&gt;If you liked this article, consider giving me a follow and also check out my &lt;a href="https://twitter.com/trillionclues"&gt;Twitter&lt;/a&gt; as I take you through my journey learning JavaScript’ for frontend development.&lt;br&gt;
&lt;a href="https://github.com/trillionclues"&gt;https://github.com/trillionclues&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading!❤️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>HTTP Response Status Codes: A Beginner Guide</title>
      <dc:creator>Excel Nwachukwu</dc:creator>
      <pubDate>Tue, 05 Jul 2022 08:54:16 +0000</pubDate>
      <link>https://dev.to/trillionclues/http-response-status-codes-a-beginner-guide-1k13</link>
      <guid>https://dev.to/trillionclues/http-response-status-codes-a-beginner-guide-1k13</guid>
      <description>&lt;p&gt;Last week, I had a torrid time making my first request from an API and passing the data to the DOM. Though it turned out a success at last, It wasn't until after numerous errors and fail responses and having to figure out with error meant what.&lt;/p&gt;

&lt;p&gt;So, I've decided to make a list of all the HTTP responses you are likely to encounter when consuming an API. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QiS1G-bB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9iiwhu3m9zr5xpkyyo1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QiS1G-bB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9iiwhu3m9zr5xpkyyo1j.png" alt="HTTP Process" width="880" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But then, if you are like me and you are thinking...&lt;/p&gt;

&lt;h2&gt;
  
  
  What are APIs?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;API is an acronym that stands for Application Programming Interface.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They are essentially just set of protocols used to create software and applications. It can be a type of system like a web-based system, operating system, or database system.&lt;/p&gt;

&lt;p&gt;Just a little analogy here...&lt;/p&gt;

&lt;p&gt;Remember when you visit a website, maybe an online store to buy new Nike Airforce shoes, you are always required to type the URL of said website into the browser?&lt;/p&gt;

&lt;p&gt;Have you ever imagined what goes on behind the scenes to make sure that only content from the Nike website is served to you and not that of Puma?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--syQGbjbL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/biomtn8opjultb3p4278.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--syQGbjbL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/biomtn8opjultb3p4278.png" alt="HTTP client machine transfer" width="880" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your request is processed by an API, usually chunk of codes acting as a bridge between you(client) &amp;amp; the computer (machine) for shoe content details to be fetched from the Nike website. It does this by searching through the server which responds with three-digit HTTP codes and ultimately serving the content that you were trying to access.&lt;/p&gt;

&lt;p&gt;Usually a fail or success response!&lt;/p&gt;

&lt;p&gt;So, that brings us to our main course.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTTP status codes, what are they?
&lt;/h2&gt;

&lt;p&gt;As a continuation with our analogy above, let's say you love Nike so much you have come to know their website off-hand. SO, one of these days, you decide to enter in the URL but, instead of Nike you had Nikke.&lt;/p&gt;

&lt;p&gt;You browser will receive a set of three-digit status codes from the server that either the above request successfully fetched Nike.com or another website that isn't Nike.&lt;/p&gt;

&lt;p&gt;This HTTP code is not seen by the client(nike fanboy) if the server can restore the content requested by the browser and there is no error. In the event that something goes wrong, the server will return an HTTP status code indicating that something isn't operating properly or it couldn't make that request successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LxPe5Snn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nze1x7gtsyhijmh5hycs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LxPe5Snn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nze1x7gtsyhijmh5hycs.png" alt="HTTP error response" width="401" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, &lt;code&gt;404-Not Found&lt;/code&gt; and &lt;code&gt;502-Bad Gateway&lt;/code&gt; errors are two common response codes that users encounter when browsing through websites or apps using the wrong or broken URL. However, there are numerous server status codes apart from this.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTTP Response Status Codes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4eUpL59Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iafgok3ckzdffuhnwf31.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4eUpL59Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iafgok3ckzdffuhnwf31.jpeg" alt="HTTP response codes" width="880" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, there are five different categories of HTTP response code. The first digit of the HTTP code is usually an identifier of the type of response to be expected with the interpretations usually; informative, successful, redirection, error browsers, or server errors.&lt;/p&gt;

&lt;p&gt;Just a little spoiler here, anything asides a status 200 response is an error. So without further Ado...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. 1xx Status Codes: Informational&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This are the first range of status code responses to expect when making requests. It is not an error response but usually an indicator that the request has been received, understood and currently processed. They are purely informational and, some status codes that fall under this column are 100, 102, and 103.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 2xx Status Code: Success&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The 2xx status code responses are the joy of any developer, apparently!!! They usually depict that the client's request was successfully received, processed and served without any hiccups. Success requests here can be anything from; OK, Created, Accepted, Reset Content, etc. Some of the codes to expect here are; 200, 201, 202, 203, 204, 205, 206, 207, 208, and 226&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 3xx Status Code: Redirection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This class of status code responses is always an indicator for the client to take additional action to complete the request, usually in the case of a URL redirection. The redirect actions may be carried out automatically by the browser or may require extra user interaction especially whenever you try leaving a website eg Twitter to access another link on another server. Some of the response codes here are; 300, 301, 302, 303, 304, 305, 306, 307, 308.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 4xx Status Code: Client Error&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The response classification with the most HTTP status codes, and every user and developer nightmare. They represent everything wrong with the website or App; from a page been deleted, redirected, or if a URL or link has been supplied incorrectly. The many response codes until this category are; 400, 401, 402, 403, 404, 405 down to 451. Not SEO friendly in any way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. 5xx Status Code: Server Error&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The final category of HTTP status code response is the 5xx status codes. These type of status codes usually indicate error in which the server is aware that it has encountered an error and incapable of fulfilling the request. The errors can be caused by anything from a faulty connection or even the browser itself. The status codes under this class are; 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, and 511.&lt;/p&gt;

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

&lt;p&gt;HTTP is the protocol used by search engine crawlers and websites and HTTPS status code responses are an integral part of web development and SEO as it not only guarantees seamless access to website or app content but, also brings and retains organic traffic to your site.&lt;/p&gt;

&lt;p&gt;You want a dozen of the 2xx returned whenever user request content from the server&lt;/p&gt;

&lt;p&gt;You don't want HTTP status codes 5xx and 4xx to be returned&lt;/p&gt;

&lt;p&gt;And also, the 3xx are not bad but a lot of them does no good.&lt;/p&gt;

&lt;p&gt;To avoid all the bad eggs, there are some internet tools to always verify what status code response is been passed by your content on request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some HTTP Status Code Checkers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://search.google.com/search-console/about"&gt;Google Search Console&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google's search tool to not only make SEO analysis but also, identify broken URLs, look at the Crawl and Crawl Error reports.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.screamingfrog.co.uk/seo-spider/"&gt;Screaming Frog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Screaming frog is a UK-based SEO and their seo spider tool can come in handy to analyze website and app logs and domain URLs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.deepcrawl.com/"&gt;Deep Crawl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deep crawl works almost identical to the Screaming Frog tool, with the added benefit of cloud-based software and the flexibility to handle larger domains.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
    </item>
  </channel>
</rss>
