<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: ST1LLWATER</title>
    <description>The latest articles on Forem by ST1LLWATER (@st1llwater).</description>
    <link>https://forem.com/st1llwater</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%2F729170%2F2c6a97a7-fb03-455b-a8ad-abaf8e272ca4.png</url>
      <title>Forem: ST1LLWATER</title>
      <link>https://forem.com/st1llwater</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/st1llwater"/>
    <language>en</language>
    <item>
      <title>I got the need for speed...</title>
      <dc:creator>ST1LLWATER</dc:creator>
      <pubDate>Thu, 23 May 2024 12:20:48 +0000</pubDate>
      <link>https://forem.com/st1llwater/i-got-the-need-for-speed-143i</link>
      <guid>https://forem.com/st1llwater/i-got-the-need-for-speed-143i</guid>
      <description>&lt;h2&gt;
  
  
  &lt;u&gt;Databases&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Databases, with no doubts are considered a critical part of an application. Data I/O speeds can be considered a direct factor deciding app's performance and hence the user experience.&lt;/p&gt;

&lt;p&gt;I'd not say we need an external caching implementation on any system until it is on a considerable scale with visible performance degradation because databases themselves have tricks up their for speeding their I/O.. Didnt knew that? Damn! read this:&lt;br&gt;
-&amp;gt;  Frequently accessed data pages are cached in memory to reduce disk I/O and improve query performance.&lt;br&gt;
-&amp;gt; Even recurrent query plans are cached by database to reduce overheads of repeated query planning!&lt;/p&gt;

&lt;p&gt;Indeed databases are one interesting topics to look into.&lt;br&gt;
Anyways getting back to what we shall discuss here, The following article will probable tell you something or two about the caching patterns followed in three-tier web architecture systems (client, server, database) or even similar systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;What is database caching?&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;By its simplest definition, a technique to store frequently used data in a temporary memory.&lt;br&gt;
A good caching strategy will ease the load on your database by routing the frequently used queries to read from cache before hitting our database.&lt;/p&gt;

&lt;p&gt;A cache layer can exist at&lt;br&gt;
-&amp;gt; Database layer (Internal)&lt;br&gt;
-&amp;gt; Application layer (External)&lt;br&gt;
-&amp;gt; A separate service layer (External)&lt;/p&gt;

&lt;p&gt;So why cache? Coz we want things &lt;em&gt;faster, faster, faster&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Performance
&lt;/h4&gt;

&lt;p&gt;Since it stores frequently accessed data separately, reduces the latency in data lookup and even the amount of work to be done by database&lt;/p&gt;

&lt;h4&gt;
  
  
  Availability
&lt;/h4&gt;

&lt;p&gt;Not calling it as a backup plan but don't you think in case our database fails, we would have our cache with our data to not cause 100% downtime?&lt;/p&gt;

&lt;h4&gt;
  
  
  Scalability
&lt;/h4&gt;

&lt;p&gt;I think if you understood the above points, you can perfectly imagine how caching can improve scalability of your application! Reduces workload on database, faster query responses blah blah.. yeah you got it right!&lt;/p&gt;

&lt;p&gt;Let's move to the design patterns of caching!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;The Caching Strategies&lt;/u&gt; &lt;br&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cache-aside
&lt;/h3&gt;

&lt;p&gt;Checks cache first for incoming query, if cache hit (found) responds with it else queries database -&amp;gt; responds -&amp;gt; updates caches.&lt;br&gt;
A good general purpose caching strategy works for most cases.&lt;br&gt;
Disadvantages? Yeah a window of inconsistency of data between db and cache.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvui1saayxwzk9qxuxqa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvui1saayxwzk9qxuxqa.png" alt="cache-aside" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;h3&gt;
  
  
  Read-through
&lt;/h3&gt;

&lt;p&gt;Sits between application and database, difference? application always reads from cache, in case of cache miss, data is populated to cache and then returned to client. The writes are always performed on database btw.&lt;br&gt;
Disadvantages? Time delay of filling the cache first in case of miss and then returning the data.&lt;br&gt;
Quick solution? Devs warm up the cache i.e refresh cache time to time with most in demand data, ik not the best solution out there but saves the day!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ih86bilnuu2mm4b3hfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ih86bilnuu2mm4b3hfs.png" alt="read-through" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;h3&gt;
  
  
  Write-through
&lt;/h3&gt;

&lt;p&gt;Sites between client and database same as usual.. then the difference? maybe you can guess... yep data is first written to cache which immediately writes to database.&lt;br&gt;
Benefit? New data is always available to cache.&lt;br&gt;
Disadvantages can be the write latencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0o7urumjwd4symbgt6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0o7urumjwd4symbgt6p.png" alt="write-through" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;h3&gt;
  
  
  Write-back
&lt;/h3&gt;

&lt;p&gt;Exactly same as write-through but but but... data is not immediately written back to db but is done at a delay.&lt;br&gt;
This reduces the pressure and the load on the cache in a write-heavy workload.&lt;br&gt;
It improves overall performance too if the delayed writes are batched up together (database will be happy too).&lt;br&gt;
P.S. If cache fails in wrong window, you might lose your new written data which was not yet written to db.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9wuv2tdtbkv4rjkfvh3v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9wuv2tdtbkv4rjkfvh3v.png" alt="write-back" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;h3&gt;
  
  
  Write-around
&lt;/h3&gt;

&lt;p&gt;Usually coupled with cache-aside or read-through, one of the flows can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data read through cache.&lt;/li&gt;
&lt;li&gt;If miss, its read from database.

&lt;ul&gt;
&lt;li&gt;Cache is also updated for next time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Best when there is less write workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w7qe95qthstyxu99hbe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w7qe95qthstyxu99hbe.png" alt="write-around" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;We discussed various strategies for database caching which might one day &lt;br&gt;
help you scale your application to new horizons!! (Well umm maybe not horizons but to better limits). Even if you're not implementing cache now, I'd say its better to know your cards well so you can play it right when time comes.&lt;/p&gt;

&lt;p&gt;Thanks for your time, hope you learnt something new.&lt;/p&gt;

</description>
      <category>database</category>
      <category>speed</category>
      <category>cache</category>
    </item>
    <item>
      <title>The = operator is an imposter ඞ</title>
      <dc:creator>ST1LLWATER</dc:creator>
      <pubDate>Fri, 03 Feb 2023 18:41:10 +0000</pubDate>
      <link>https://forem.com/st1llwater/the-operator-is-an-imposter-ng-1jpk</link>
      <guid>https://forem.com/st1llwater/the-operator-is-an-imposter-ng-1jpk</guid>
      <description>&lt;p&gt;I think we are all aware of the assignment operator, yeahh the old &lt;code&gt;=&lt;/code&gt; symbol we all have been using everywhere in programming🤩. You all must have done something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;int&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to assign values to variables, but not today😮.&lt;/p&gt;

&lt;p&gt;I've always picked up programming languages quite quickly until I arrived at elixir.&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%2Fith1ymrq53gnqnbdkbed.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%2Fith1ymrq53gnqnbdkbed.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elixir was my first encounter with functional programming too, so not only the impostor operator but the whole methodologies were quite fascinating.&lt;/p&gt;

&lt;p&gt;Ahh so judging things here assignment operator works differently in elixir... but how?&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%2Fsy6x60i8g4grq19zde3f.gif" 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%2Fsy6x60i8g4grq19zde3f.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Assignment Operator
&lt;/h2&gt;

&lt;p&gt;So in elixir we have this thing called pattern matching, so lets jump to pattern matching first 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern matching
&lt;/h2&gt;

&lt;p&gt;So in layman language, pattern matching is matching the data on the right to the pattern specified on left and binding them if matches (filling variables on left) 🤗 duh.&lt;/p&gt;

&lt;p&gt;so back to the assignment operator&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%2Fysujqaxmz2vbwrijtwck.gif" 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%2Fysujqaxmz2vbwrijtwck.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;when we use the assignment operator somewhat like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the compiler checks the left side has a pattern like the right so bam💥let's bind dem 😎.&lt;/p&gt;

&lt;p&gt;since we are pattern matching so writing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ain't giving us errors either.&lt;/p&gt;

&lt;p&gt;and ofc this also works for other data structures too like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]=[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but writing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;y&lt;/span&gt;&lt;span class="p"&gt;]=[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is making compiler 😡🤬 coz Pattern(RHS ≠ LHS)&lt;br&gt;
This wouldn't have given us any errors in languages like javascript, it would have just destructured first two values from the list and stored them to x &amp;amp; y.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PS. overwriting variables is a thing so we can reassign values but then our above snippet will raise an exception saying RHS doesn't match LHS hehe i.e ( (MatchError) no match of right hand side value)!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PPS. We can prevent reassignments and make compiler give us error if assigning new value is ≠ old but that's a topic for another day.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;So in conclusion all I have to say is that even if we know things from our past experiences. There can always be someone amogthem ඞ who has a new story to tell.&lt;/p&gt;

&lt;p&gt;Hope this was interesting ✨&lt;/p&gt;

&lt;p&gt;Do Like ❤️, Save 🔖 &amp;amp; Share 📈&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Selecting The RIGHT way in CSS!! 🎨</title>
      <dc:creator>ST1LLWATER</dc:creator>
      <pubDate>Wed, 05 Jan 2022 10:21:52 +0000</pubDate>
      <link>https://forem.com/st1llwater/selecting-the-right-way-in-css-3oej</link>
      <guid>https://forem.com/st1llwater/selecting-the-right-way-in-css-3oej</guid>
      <description>&lt;p&gt;For all those frontend enthusiasts out there, I have provided this brief and as clearly as possible description of all CSS selectors and combinators. Do not hesitate to try them out because practice makes perfect! 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Selectors 🤌
&lt;/h2&gt;

&lt;p&gt;Selectors in CSS are used to select the appropriate HTML element you want to style. 🥸&lt;br&gt;
Several CSS selectors exist for versatility in selection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class Selector ( . )
&lt;/h3&gt;

&lt;p&gt;Eg: .outer&lt;/p&gt;

&lt;p&gt;Selects all elements which have the given class. (Outer class in our example)&lt;/p&gt;

&lt;h3&gt;
  
  
  ID Selector ( #️ )
&lt;/h3&gt;

&lt;p&gt;Eg: #name&lt;/p&gt;

&lt;p&gt;Selects the HTML element which has the given id. (name in our example case)&lt;br&gt;
(Quick Fact: ID is unique in whole document unlike classes)&lt;/p&gt;

&lt;h3&gt;
  
  
  Element/Type Selector 🏷️
&lt;/h3&gt;

&lt;p&gt;Eg: h1&lt;br&gt;
Directly select all the specified HTML element on the document.&lt;/p&gt;

&lt;h3&gt;
  
  
  Universal Selector ( * )
&lt;/h3&gt;

&lt;p&gt;Selector: *&lt;/p&gt;

&lt;p&gt;Universal Selector! Selects Everything!!&lt;/p&gt;

&lt;h3&gt;
  
  
  Attribute Selector ( 🏷️[attribute] )
&lt;/h3&gt;

&lt;p&gt;Eg: img[href]&lt;/p&gt;

&lt;p&gt;Selects the given attribute of the given tag from DOM.&lt;br&gt;
(Quick Tip: You can even specify the attribute value to select a particular element.&lt;/p&gt;

&lt;p&gt;For Eg: a[href="&lt;code&gt;https://example.com&lt;/code&gt;"]&lt;br&gt;
This selects all anchor tags which have the given href!)&lt;/p&gt;

&lt;h3&gt;
  
  
  Pseudo Class Selector ( : )
&lt;/h3&gt;

&lt;p&gt;Eg: button:hover&lt;/p&gt;

&lt;p&gt;Pseudo classes are special keywords which specify a special state of an element. Like hover state on button, focus state on input etc. (Our example targets the hover state of all buttons on the DOM).&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Check &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes"&gt;this&lt;/a&gt; to know more about all types of pseudo classes!&lt;/p&gt;

&lt;h3&gt;
  
  
  Pseudo Element Selector ( :: )
&lt;/h3&gt;

&lt;p&gt;Eg: p::first-letter&lt;/p&gt;

&lt;p&gt;Pseudo element selector are those which let you target a &lt;em&gt;specific&lt;/em&gt; part of an element.&lt;br&gt;
(Given example targets the first letter of all paragraph tags present in our DOM)&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Check &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements"&gt;this&lt;/a&gt; to know more about all types of pseudo classes!&lt;/p&gt;

&lt;h2&gt;
  
  
  Combinators 👈
&lt;/h2&gt;

&lt;p&gt;Combinators are used to specify relationship between two selectors. 🤝&lt;/p&gt;

&lt;h3&gt;
  
  
  Descendant Combinator ⬇️
&lt;/h3&gt;

&lt;p&gt;Eg: h1 p ( space ) 🌌&lt;/p&gt;

&lt;p&gt;The descendant combinator targets all the second mentioned elements (p in our example) who are the descendant or in other words have the first mentioned element as a parent or ancestor.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
(Given example selects all p tags which have h1 as their parent or ancestor)&lt;/p&gt;

&lt;h3&gt;
  
  
  Child Combinator ( &amp;gt; ) 🧒
&lt;/h3&gt;

&lt;p&gt;Eg: ul &amp;gt; li&lt;/p&gt;

&lt;p&gt;This selects only those elements matched by the second selector that are the direct children of elements matched by the first.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
(Given example selects all li elements which are direct children of ul)&lt;/p&gt;

&lt;h3&gt;
  
  
  Adjacent Sibling Combinator
&lt;/h3&gt;

&lt;p&gt;Eg: h1 + p ( + ) 🧑‍🤝‍🧑&lt;/p&gt;

&lt;p&gt;This combinator separates two selectors and matches the second element only if it immediately follows the first element, and both are children of the same parent.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
(Example selects p tags if its followed by a h1 tag and both belongs to a same parent)&lt;/p&gt;

&lt;h3&gt;
  
  
  General Sibling Combinator ( ~ ) 👨‍👦
&lt;/h3&gt;

&lt;p&gt;Eh: h1 ~ p&lt;/p&gt;

&lt;p&gt;This matches all iterations of the second element, that are following the first element (though not necessarily immediately), and are children of the same parent.&lt;br&gt;
&lt;br&gt;&lt;br&gt;
(Our example selects all the p tags which are following h1 tag (can be multiple p tags) unlike the Adjacent sibling selector which selects only the first occurrence)&lt;/p&gt;

&lt;h3&gt;
  
  
  Now go get some experience with these selectors by trying them yourself! 🤓😎
&lt;/h3&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>design</category>
    </item>
  </channel>
</rss>
