<?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: Medam Mahesh</title>
    <description>The latest articles on DEV Community by Medam Mahesh (@memahesh).</description>
    <link>https://dev.to/memahesh</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%2F268482%2F4bf46419-f6fa-40e0-b10a-8cbf5639bc14.jpg</url>
      <title>DEV Community: Medam Mahesh</title>
      <link>https://dev.to/memahesh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/memahesh"/>
    <language>en</language>
    <item>
      <title>Optimizing Pagination: Range-Based Queries with Cursors and Happy Databases 🚀</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Sat, 23 Sep 2023 15:38:12 +0000</pubDate>
      <link>https://dev.to/memahesh/optimizing-pagination-range-based-queries-and-happy-databases-77b</link>
      <guid>https://dev.to/memahesh/optimizing-pagination-range-based-queries-and-happy-databases-77b</guid>
      <description>&lt;h2&gt;
  
  
  👋 Introduction:
&lt;/h2&gt;

&lt;p&gt;Pagination is used when you have a lot of records in your database collection. Since you can't just dump all the records on the screen, we give a bunch of the records and tell the client how to get the next bunch !!🔄&lt;/p&gt;

&lt;p&gt;For the longest time, I had thought offset-based pagination was the way to do this (Haven't we all seen the page number section before ?). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qp1JBTEq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hre0iljx1slab4x02wyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qp1JBTEq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hre0iljx1slab4x02wyi.png" alt="Yahoo Search" width="348" height="50"&gt;&lt;/a&gt;&lt;/p&gt;
Using Yahoo Search here cause &lt;a href="https://twitter.com/Google/status/1599889522380120078?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1599889522380120078%7Ctwgr%5E43a23c2c716270d5559b4855cf12e5582d261c52%7Ctwcon%5Es1_&amp;amp;ref_url=https%3A%2F%2Fwww.theverge.com%2F2022%2F12%2F6%2F23495973%2Fgoogle-search-desktop-continuous-scrolling"&gt;Google disabled it&lt;/a&gt;



&lt;p&gt;It comes naturally that when each page has 10 records and you click on &lt;strong&gt;Page 3&lt;/strong&gt;, you have to skip the 30 records and return (31-40). If you translate the above to a DB query, it is as below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"$skip"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"$limit"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&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;p&gt;Turns out MongoDB is not optimized for that sort of query. As the page number keeps increasing (say 2,000), we will keep skipping more records (skipping 2,000*10 = 20,000 records). For each page, MongoDB scans the result set based on your filter and starts skipping the records (after skipping 20,000 records) to get to the records in your final result. The time taken for this process increases with the number of records skipped.📈 &lt;/p&gt;

&lt;p&gt;On a MongoDB collection containing 100,000 records, the time taken by offset pagination looks as below:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YwyATZk8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xao1tpg4yn2m4mfvlz0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YwyATZk8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xao1tpg4yn2m4mfvlz0m.png" alt="Latency with the increase in offsets" width="468" height="301"&gt;&lt;/a&gt;&lt;/p&gt;
Time taken (in µs) vs Records skipped [&lt;a href="https://github.com/maheshmedam/offset-vs-range-pagination"&gt;Code&lt;/a&gt;]




&lt;h2&gt;
  
  
  🔍 Range-based Pagination:
&lt;/h2&gt;

&lt;p&gt;If you look at what all the big-wigs are doing, they seem to be using cursors, and they seem to be not facing this performance issue at all. If you look deeply, they are more or less using Range-based pagination.&lt;br&gt;
&lt;a href="https://slack.engineering/evolving-api-pagination-at-slack"&gt;Slack API&lt;/a&gt; &lt;a href="https://developer.twitter.com/en/docs/twitter-api/v1/pagination"&gt;Twitter API&lt;/a&gt; &lt;a href="https://developers.facebook.com/docs/graph-api/results"&gt;Facebook API&lt;/a&gt; &lt;a href="https://disqus.com/api/docs/cursors/"&gt;Disqus API&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🤔 Cursor, what's that?
&lt;/h3&gt;

&lt;p&gt;A cursor is nothing but an identifier to fetch your next set of results. The client should not care what it means. In offset-based pagination, the offset(or page number) can be called your cursor. Don't confuse it with &lt;a href="https://www.mongodb.com/docs/manual/reference/method/js-cursor"&gt;MongoDB cursors&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;An ideal cursor for Range-based pagination has to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unique and&lt;/li&gt;
&lt;li&gt;You are OK with sorting on it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep in mind that you also have to create an appropriate index on this cursor field for the magic to happen.😜&lt;br&gt;
If you do not have such a field in your collection schema, you can still use range-based pagination (detailed at the end).&lt;/p&gt;

&lt;p&gt;Range-based pagination is not some out-of-the-world algorithm that you need to rack your brains out. It is just a small twist on your normal thought process to &lt;strong&gt;take advantage of the database indexes&lt;/strong&gt;. Let's take a deeper look.&lt;/p&gt;
&lt;h3&gt;
  
  
  👨🏻‍💻 Querying Pattern:
&lt;/h3&gt;

&lt;p&gt;Let's take the cursor as &lt;code&gt;id&lt;/code&gt; which is an actual field on your database. Send this to the client so that they can query for the next set of results. You can choose to hide what your cursor means by having an encryption layer before sending it to the client. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Querying first time:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([{&lt;/span&gt;
  &lt;span class="s"&gt;"$limit"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s"&gt;"$sort"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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;p&gt;&lt;strong&gt;Query Nth time&lt;/strong&gt;&lt;br&gt;
Use the value of &lt;code&gt;id&lt;/code&gt; from the last document in the previous result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"$match"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s"&gt;"$gt"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;Last value of id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"$sort"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"$limit"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&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;p&gt;What makes range-based pagination more scalable is that the query pattern can be indexed, thus reducing the result set and skipping the latency-introducing &lt;code&gt;$skip&lt;/code&gt; step.&lt;/p&gt;

&lt;h3&gt;
  
  
  🙈 What if you don't have the ideal cursor? Make the not-so-ideal one, I guess.
&lt;/h3&gt;

&lt;p&gt;You almost always have the ideal cursor (i.e. a primary key) on your collection. For some reason, you can't use it. Maybe because you want to provide options to your client on what they can sort by.&lt;br&gt;
In that case, you can make your cursor a compound field by using the ideal cursor field (say &lt;code&gt;id&lt;/code&gt; field) as the secondary sort and primary sort on the client's requested sort (&lt;code&gt;title&lt;/code&gt; field).&lt;br&gt;
The query pattern becomes like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="s"&gt;"$match"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="s"&gt;"$or"&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="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"$gt"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;Last value of id&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
           &lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"$eq"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;Last value of title&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
         &lt;span class="p"&gt;},&lt;/span&gt;
         &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"$gt"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;Last value of title&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
         &lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="p"&gt;]&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="s"&gt;"$sort"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note: The promise of latency reduction here may change on a case-to-case basis when you are making cursor from multiple fields.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📊 Comparison with Offset-based pagination
&lt;/h3&gt;

&lt;p&gt;Offset works best for the first few pages but time-taken increases as the offset gets bigger whereas range-based pagination with indexes keeps the time taken almost constant. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BD36WV3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bnbhj4kgyus5o57g3qn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BD36WV3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bnbhj4kgyus5o57g3qn7.png" alt="Offset vs. Range-based Pagination" width="540" height="327"&gt;&lt;/a&gt;&lt;/p&gt;
 Time taken as we iterate through database [&lt;a href="https://github.com/maheshmedam/offset-vs-range-pagination"&gt;Code&lt;/a&gt;]



&lt;p&gt;TLDR: Range-based pagination takes advantage of database indexes to keep the performance from deteriorating even when iterating through the complete collection 🏆.&lt;/p&gt;

&lt;h3&gt;
  
  
  It may not be for you if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need offset-based random access:&lt;/strong&gt; With range-based pagination, we do not have a concept of pages and total count as we are always fetching next to the cursor. If random access is a strong design requirement for you, then range-based pagination may not be for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You have complex sorting and uniqueness requirements:&lt;/strong&gt; You have a lot of fields you want to sort on and you do not wish to create an index on all of them (or if the indexing does not work as expected 😟).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You do not need far-away records:&lt;/strong&gt; Your client audience does not really require you to get far-away records. Maybe you provide a search as a feature and thus only the first few pages are enough. Like when have we visited the 2nd page of Google Search Result? While this is no reason to not implement cursor-based pagination, you can say I do not really have to 🫣.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>database</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>Full Stack Interview Help</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Fri, 03 Dec 2021 12:36:53 +0000</pubDate>
      <link>https://dev.to/memahesh/full-stack-interview-help-1g4h</link>
      <guid>https://dev.to/memahesh/full-stack-interview-help-1g4h</guid>
      <description>&lt;p&gt;Hi all,&lt;/p&gt;

&lt;p&gt;I have a Interview with Full Stack which requires NodeJS and ReactJs next weekend. I have worked with them for Freelance projects up until a year ago.&lt;/p&gt;

&lt;p&gt;The interview has pair coding round it seems. Now, I want to know the &lt;strong&gt;best coding practices to used for let's say a MERN stack&lt;/strong&gt; application. Any good open source projects for coding practices will be helpful.&lt;/p&gt;

&lt;p&gt;Also a good resource for interview questions preparation will be very helpful.&lt;/p&gt;

&lt;p&gt;Thanks in advance,&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Discount Engine Opensource Alternative</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Wed, 17 Feb 2021 15:13:26 +0000</pubDate>
      <link>https://dev.to/memahesh/discount-engine-opensource-alternative-246j</link>
      <guid>https://dev.to/memahesh/discount-engine-opensource-alternative-246j</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I am looking to add a discount engine for Buy 2 Get 1 and similar discounts to my shopping cart calculator. I would like to know about any Opensource options available in this space.&lt;/p&gt;

&lt;p&gt;This is a custom website I am building, not with a third party like Wordpress, Woocommerce etc.,.&lt;/p&gt;

&lt;p&gt;Thanks in advance,&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Making Shopify App installable</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Tue, 12 Jan 2021 09:25:58 +0000</pubDate>
      <link>https://dev.to/memahesh/making-shopify-app-a-pwa-2p0h</link>
      <guid>https://dev.to/memahesh/making-shopify-app-a-pwa-2p0h</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I want to make my Shopify Website installable. I do not intend to make it a complete PWA. Just having a 'Add To Home Screen' would suffice for me. I do not want to go much into cache and offline behaviour also. &lt;br&gt;
I know how to make this for a self-developed website (i.e. Linking with manifest.json). I tried to edit the theme files and achieve the same result but it didn't work. I am getting the 'start_url' error.&lt;/p&gt;

&lt;p&gt;P.S. I do not want to use any third party Shopify apps for this.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>10 VS Code Keyboard Shortcuts for Productivity Boost</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Tue, 01 Dec 2020 12:35:10 +0000</pubDate>
      <link>https://dev.to/memahesh/10-vs-code-keyboard-shortcuts-for-productivity-boost-53j8</link>
      <guid>https://dev.to/memahesh/10-vs-code-keyboard-shortcuts-for-productivity-boost-53j8</guid>
      <description>&lt;p&gt;Each and every one of us uses keyboard shortcuts to some extent like Cut (&lt;code&gt;Ctrl\Cmd + X&lt;/code&gt;), Copy (&lt;code&gt;Ctrl\Cmd + C&lt;/code&gt;) and Paste (&lt;code&gt;Ctrl\Cmd + V&lt;/code&gt;). Please don't stop reading because I mentioned those three.&lt;/p&gt;

&lt;p&gt;I promise you this blog will only discuss shortcuts a cut above the basics and only those which are beneficial to the devs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Keyboard Shortcuts ?
&lt;/h2&gt;

&lt;p&gt;Firstly, Keyboard Shortcuts are just efficient. Especially when it comes to coding IDE like VS Code and IntelliJ, keyboard shortcuts are a boon to coders. While it is not that easy to get used to these shortcuts, you will definitely thank yourself for putting the effort once you get used to them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shortcuts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multi-cursor
&lt;/h3&gt;

&lt;p&gt;This is the first keyboard shortcut I mastered. And also the most helpful one especially when on HTML (adding classes used to be such a pain 😭 ).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Just &lt;code&gt;Ctrl&lt;/code&gt; click at all the places where you want to start writing. You will see multiple cursors popping up. And when you type, all of them start writing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;Ctrl/Cmd + Mouse Left Click&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Global Search
&lt;/h3&gt;

&lt;p&gt;Some of you might already be familiar with how to do this by using mouse as it is a very very important feature when working on big projects with loads of interconnected code. But did you know that you could do that with keyboard shortcut in a snap.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Now most of us are already familiar with &lt;code&gt;Ctrl/Cmd + F&lt;/code&gt; for searching inside a file. Now taking it to the next level by pressing &lt;code&gt;Ctrl/Cmd + Shift + F&lt;/code&gt;, you can do a global search on your entire project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;Ctrl/Cmd + Shift + F&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Moving By Words Not Letters
&lt;/h3&gt;

&lt;p&gt;While we can move around the extremes of the line using &lt;code&gt;Home&lt;/code&gt; and &lt;code&gt;End&lt;/code&gt;, what if we want to quickly change attributes in HTML / edit arguments in function calls ? 🤔🤔 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; We know that we can move the cursor by letter with &lt;code&gt;Arrow Keys&lt;/code&gt; but if you want to move the cursor by words, you have to &lt;code&gt;Ctrl/Cmd + [Left/Right Arrow Keys]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;Ctrl/Cmd + [Left/Right Arrow Keys]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Delete Words
&lt;/h3&gt;

&lt;p&gt;Following the footsteps of previous shortcut, would it not make stuff easier if you could quick delete words as well 🤩🤩&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Now, this is a two step thing. Firstly, select the word where your cursor is with &lt;code&gt;Ctrl/Cmd + D&lt;/code&gt;. Next, click &lt;code&gt;Delete&lt;/code&gt; or start writing what you need in place of word selected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; Select Word (&lt;code&gt;Ctrl/Cmd + D&lt;/code&gt;) and then start typing away&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Moving Between Open Files
&lt;/h3&gt;

&lt;p&gt;Most of us know how to move between different applications on our machine (i.e. &lt;code&gt;Alt + Tab&lt;/code&gt;). In a similar fashion when it comes to big projects, we have to move between some files very often. And using mouse to do this is not very productive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; You can switch between open files this using using &lt;code&gt;Ctrl/Cmd + Tab&lt;/code&gt; (right) and &lt;code&gt;Ctrl/Cmd + Shift + Tab&lt;/code&gt;(left) to make this movement quick.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;Right Open File : &lt;code&gt;Ctrl/Cmd + Tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Left Open File : &lt;code&gt;Ctrl/Cmd + Shift + Tab&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Quick Comment / Uncomment
&lt;/h3&gt;

&lt;p&gt;This is the most often used keyboard shortcut while I code. The best part of it is that it is language agnostic i.e. automatically comments code in the proper syntax. Also commenting and uncommenting is also used as a quick debug technique. Commenting is a good coder's duty and to do it productively, here is a shortcut.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Make a selection and &lt;code&gt;Ctrl/Cmd + /&lt;/code&gt; for a multi-line comment. Or just press &lt;code&gt;Ctrl/Cmd + /&lt;/code&gt; to comment the current line the cursor is on. To uncomment, repeat the process again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;Ctrl/Cmd + /&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Jump To Function
&lt;/h3&gt;

&lt;p&gt;When you have a code project, it is very likely that you are using code from other files a lot. And ability to quickly move to different pieces of code is a major help.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Just take the cursor to the function call and press &lt;code&gt;F12&lt;/code&gt; or &lt;code&gt;Fn + F12&lt;/code&gt; based on the keyboard. The file with the function is opened with your cursor at the definition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;F12&lt;/code&gt; or &lt;code&gt;Fn + F12&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Open Project Files (Not &lt;code&gt;Ctrl/Cmd + O&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;I am not going to discuss the normal &lt;em&gt;Open File&lt;/em&gt; and you chose the file from the &lt;em&gt;File Explorer&lt;/em&gt;. This is a shortcut to quickly open files from the project without using mouse.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Press &lt;code&gt;Ctrl/Cmd + P&lt;/code&gt; and start typing the file name. A dropdown with all possible files you might be referring to in the project shows up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;Ctrl/Cmd + P&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9. Code Completion / Auto Complete / Quick Import
&lt;/h3&gt;

&lt;p&gt;Having a quick suggestion related to what you might be typing is always a big help. Let it be the variable name (or) function definition. You can also quick import from different files using these shortcuts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Press &lt;code&gt;Ctrl/Cmd + Space&lt;/code&gt; to see possible suggestions and use &lt;code&gt;Ctrl/Cmd + Shift + Space&lt;/code&gt; to view the function definition where you are typing to get an understanding of its parameters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt; &lt;code&gt;Ctrl/Cmd + Space&lt;/code&gt; or &lt;code&gt;Ctrl/Cmd + Shift + Space&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10. Expand / Collapse Functions
&lt;/h3&gt;

&lt;p&gt;Even though we understand that we should break our code into files for ease of re-use and easy understanding. Sometimes we can not help but see that our files are growing in size. Traversing through large files is a very time-consuming task. Would it not be easier if you could collapse all the functions and only expand those that you need ? And that's what this shortcut has to offer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How to use it :&lt;/strong&gt; Press &lt;code&gt;Ctrl/Cmd + K&lt;/code&gt; and then &lt;code&gt;Ctrl/Cmd + 0&lt;/code&gt; to collapse all sub regions. And &lt;code&gt;Ctrl/Cmd + K&lt;/code&gt; and then &lt;code&gt;Ctrl/Cmd + J&lt;/code&gt; to expand all sub regions. To collapse the current (where the cursor is) sub region, press &lt;code&gt;Ctrl/Cmd + Shift + [&lt;/code&gt; and to expand the current sub region, press &lt;code&gt;Ctrl/Cmd + Shift + ]&lt;/code&gt;. Here sub region means a block of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Keyboard Shortcut :&lt;/em&gt;&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Expand All : &lt;code&gt;Ctrl/Cmd + K&lt;/code&gt; and then &lt;code&gt;Ctrl/Cmd + J&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Collapse All : &lt;code&gt;Ctrl/Cmd + K&lt;/code&gt; and then &lt;code&gt;Ctrl/Cmd + 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Collapse Current : &lt;code&gt;Ctrl/Cmd + Shift + [&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Expand Current : &lt;code&gt;Ctrl/Cmd + Shift + ]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also VS Code Official Cheat Sheet : &lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf"&gt;https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf"&gt;https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf&lt;/a&gt;&lt;br&gt;
Or just use another keyboard shortcut, press &lt;code&gt;Ctrl/Cmd + Shift + P&lt;/code&gt; to search other keyboard shortcuts&lt;/p&gt;

&lt;p&gt;[Featured Image taken from &lt;a href="https://code.visualstudio.com/"&gt;https://code.visualstudio.com/&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>vscode</category>
      <category>shortcuts</category>
    </item>
    <item>
      <title>How to store user data in Shopify App ?</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Sun, 30 Aug 2020 16:23:55 +0000</pubDate>
      <link>https://dev.to/memahesh/how-to-store-user-data-in-shopify-app-2m86</link>
      <guid>https://dev.to/memahesh/how-to-store-user-data-in-shopify-app-2m86</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I have recently started looking into shopify app development. I know how to build UI for Shopify App for now. &lt;/p&gt;

&lt;p&gt;My App Idea uses an API which provides an &lt;code&gt;api_key&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now when a Shopify Customer installs my app, he enters this API key on the Frontend Form that I had created and tries to submit. &lt;/p&gt;

&lt;h2&gt;
  
  
  DOUBT
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;How and where to store this information ? How to retrieve this information once saved ?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I have been burning the midnight oil for this. So, if any experienced people are present. Please lend me a hand.&lt;/em&gt;&lt;br&gt;
I am very much willing to clarify any doubt in my explanation.&lt;/p&gt;

&lt;p&gt;Thanks in advance,&lt;/p&gt;

</description>
      <category>help</category>
      <category>shopify</category>
      <category>shopifyapps</category>
    </item>
    <item>
      <title>How to protect your JS ?</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Mon, 13 Jul 2020 16:20:51 +0000</pubDate>
      <link>https://dev.to/memahesh/how-to-protect-your-js-5h1l</link>
      <guid>https://dev.to/memahesh/how-to-protect-your-js-5h1l</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I am looking for a way to secure my JS code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Edit: I do not want my code to be run by others in their local by cloning my API behaviour. Secondly, if Obfuscation is OK, is there any best practices other than going to an online obfuscator&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;I know there is Obfuscating JS. But, I do not know how safe it is.&lt;/p&gt;

&lt;p&gt;It'd be great if someone can answer these for me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is Obfuscation safe ?&lt;/li&gt;
&lt;li&gt;How to properly Obfuscate your JS ?&lt;/li&gt;
&lt;li&gt;Are there any techniques to secure JS apart from Obfuscate ?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>help</category>
      <category>discuss</category>
      <category>security</category>
    </item>
    <item>
      <title>How to get started with Spring Boot ?</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Sun, 12 Jul 2020 06:36:44 +0000</pubDate>
      <link>https://dev.to/memahesh/how-to-get-started-with-spring-boot-4olo</link>
      <guid>https://dev.to/memahesh/how-to-get-started-with-spring-boot-4olo</guid>
      <description>&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;I am a fresher at a company where they work on Java based frameworks like SpringBoot.&lt;br&gt;
I am an experienced developer in MERN stack and Flask based applications. But, I never worked with something related to Java. Are there any go to places to learn SpringBoot ? As I am fairly new to Java as well, I think a more ground up learning will be better for me. &lt;br&gt;
It'd be great if you can refer something from your experience.&lt;br&gt;
Thanks in advance 😊,&lt;/p&gt;

</description>
      <category>help</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to make a API Call to Heroku from Chrome Extension</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Mon, 29 Jun 2020 14:35:19 +0000</pubDate>
      <link>https://dev.to/memahesh/how-to-make-a-api-call-to-heroku-from-chrome-extension-2bnk</link>
      <guid>https://dev.to/memahesh/how-to-make-a-api-call-to-heroku-from-chrome-extension-2bnk</guid>
      <description>&lt;p&gt;Hi Dev,&lt;/p&gt;

&lt;p&gt;So, I am stuck here trying to make this API Call to a Heroku project from a Chrome Extension I am developing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YuWyHBnN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/om6cbyj1dpmigfn7vb7i.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YuWyHBnN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/om6cbyj1dpmigfn7vb7i.PNG" alt="Alt Text" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am familiar with Flask and NodeJs. &lt;br&gt;
I understand this has something to do with headers somewhere.&lt;br&gt;
I tried searching but could not find a point solution.&lt;/p&gt;

&lt;p&gt;Help me solve this problem.&lt;/p&gt;

&lt;p&gt;Thanks in advance,&lt;/p&gt;

</description>
      <category>help</category>
      <category>heroku</category>
      <category>chromeextension</category>
    </item>
    <item>
      <title>Which SaaS is your favourite ?</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Mon, 22 Jun 2020 17:37:31 +0000</pubDate>
      <link>https://dev.to/memahesh/which-saas-is-your-favourite-k94</link>
      <guid>https://dev.to/memahesh/which-saas-is-your-favourite-k94</guid>
      <description>&lt;p&gt;Hello fellow Dev,&lt;/p&gt;

&lt;p&gt;Hope you are having a fun day going through exciting Git Repos, working on your side project and lastly reading fun DEV.to posts.&lt;/p&gt;

&lt;p&gt;Even if you do not want to tell me about it, I know you are involved in a SaaS activity :P.&lt;/p&gt;

&lt;h1&gt;
  
  
  Here is a little fun activity,
&lt;/h1&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;Score that SaaS&lt;/code&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Does it save your ass (Productivity) - 1 points&lt;/li&gt;
&lt;li&gt;My day does not end without it (Part of Compulsory Routine) - 10 points&lt;/li&gt;
&lt;li&gt;It's my livelihood (Work in/related to SaaS) - 100 points&lt;/li&gt;
&lt;li&gt;Add 1000 more for any other use you feel like.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I think every piece of information you (the reader) contributes will go a long way for others. So, I urge you not to hesitate.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Why am I asking this ?
&lt;/h1&gt;

&lt;p&gt;I feel everyone has right to have the knowledge that can help them. I am planning on laying out a series discussing how a particular &lt;code&gt;SaaS&lt;/code&gt; can help lift someone's daily burdens or open a new avenue for them.&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AwesomeCSS #1 | Apply Image Filters Just Using CSS</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Mon, 22 Jun 2020 16:24:01 +0000</pubDate>
      <link>https://dev.to/memahesh/awesomecss-1-apply-image-filters-just-using-css-2g6o</link>
      <guid>https://dev.to/memahesh/awesomecss-1-apply-image-filters-just-using-css-2g6o</guid>
      <description>&lt;p&gt;This was something awesome that I had stumbled upon last week. &lt;/p&gt;

&lt;p&gt;I am not much of a social butterfly but I do know that there is always a lot of buzz about &lt;em&gt;filters&lt;/em&gt; going on in the social media. Coincidentally, the technique of this also revolves around a CSS property called &lt;code&gt;filter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Incase you are interested in watching video :&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/GmgvpMT2BJM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Interesting Finds
&lt;/h1&gt;

&lt;h2&gt;
  
  
  CSS &lt;code&gt;filter&lt;/code&gt; property
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The filter property defines visual effects (like blur and saturation) to an element (often &lt;a href="" class="article-body-image-wrapper"&gt;&lt;img&gt;&lt;/a&gt;). &lt;br&gt;
~ W3 Schools &lt;a href="https://www.w3schools.com/cssref/css3_pr_filter.asp"&gt;Link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  CSS &lt;code&gt;mix-blend-mode&lt;/code&gt; property
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The mix-blend-mode property specifies how an element's content should blend with its direct parent background.&lt;br&gt;
~ W3 Schools &lt;a href="https://www.w3schools.com/cssref/pr_mix-blend-mode.asp"&gt;Link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Checkout the Codepen :&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/memahesh219/embed/ExPWOvv?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Thanks for reading till the end,&lt;/p&gt;

&lt;p&gt;[Please have a look at my YouTube Channel. I post interesting web-related videos on it : &lt;a href="https://www.youtube.com/channel/UCvf5cqRQk6aOmFZrgoU6K-Q"&gt;https://www.youtube.com/channel/UCvf5cqRQk6aOmFZrgoU6K-Q&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>css</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Intro Post</title>
      <dc:creator>Medam Mahesh</dc:creator>
      <pubDate>Sun, 21 Jun 2020 15:36:40 +0000</pubDate>
      <link>https://dev.to/memahesh/intro-post-3f86</link>
      <guid>https://dev.to/memahesh/intro-post-3f86</guid>
      <description>&lt;p&gt;Well, this is a little embarrassing to do because I have been on DEV.to for the past 6 months or so. But, I feel it is necessary to let others in the community know about me and my experience. &lt;/p&gt;

&lt;h1&gt;
  
  
  The Intro
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;I am Medam Mahesh. &lt;br&gt;
My coding journey started 4 years ago.&lt;br&gt;
I am good at Frontend and Backend Development, Machine Learning, Artificial Intelligence and owing to my past experience&lt;br&gt;
I love to chat about literally anything and everything new as long as it is related to coding.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  My Experience with DEV
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;It has been very awesome. The community is active, great and sensible to newcomers. You do not see a lot of hate speech going on which is great.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thanks for being such a great community, DEV.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>motivation</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
