<?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: Husni Adil Makmur</title>
    <description>The latest articles on DEV Community by Husni Adil Makmur (@husniadil).</description>
    <link>https://dev.to/husniadil</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%2F534083%2Fdf4def6e-1831-4c51-bcaf-3ee965f84c1a.jpg</url>
      <title>DEV Community: Husni Adil Makmur</title>
      <link>https://dev.to/husniadil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/husniadil"/>
    <language>en</language>
    <item>
      <title>Cache-Aside Pattern</title>
      <dc:creator>Husni Adil Makmur</dc:creator>
      <pubDate>Sat, 12 Dec 2020 07:29:45 +0000</pubDate>
      <link>https://dev.to/husniadil/cache-aside-pattern-559f</link>
      <guid>https://dev.to/husniadil/cache-aside-pattern-559f</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When you develop an app that uses database as storage, i.e. MySQL, you probably need to use a cache layer to help your application serve data more quickly, especially for serving data that's not changed too often. Whether you stored it in application memory or external cache server, i.e. Redis. This is called cache-aside pattern.&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%2Fi%2Fwaop2o50ozhvohmrofre.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%2Fi%2Fwaop2o50ozhvohmrofre.png" alt="Cache-Aside Pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When your app receives a request, it'll try to find the data in the cache layer first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the data is in the cache (cache hit), it uses that data instead of requesting to database.&lt;/li&gt;
&lt;li&gt;If the data is not in the cache (cache miss), it will get the data from database.&lt;/li&gt;
&lt;li&gt;Write the copy of data that's obtained from the database into cache layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cached data lifetime&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When you're using this strategy, you need to define the lifetime of cached data by defining TTL (Time to live). You need to set the TTL value correctly for getting the most of caching benefit. If you set the period too short, your app may hit your database too often and this could increase latency. In the other hand, when you set the period too long, your app may be in the inconsistent state since it serves stale data. There's no one correct setting for all cases, so you need to find a correct setting that suits your use case.&lt;/p&gt;


&lt;div class="ltag__wikipedia--container"&gt;
  &lt;div class="ltag__wikipedia--header"&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%2Fassets%2Fwikipedia-logo-0a3e76624c7b1c3ccdeb9493ea4add6ef5bd82d7e88d102d5ddfd7c981efa2e7.svg" class="ltag__wikipedia--logo" alt="Wikipedia Logo"&gt;
    &lt;a href="https://en.wikipedia.org/wiki/Time_to_live" rel="noopener noreferrer"&gt;Time to live&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="ltag__wikipedia--extract"&gt;&lt;p&gt;
&lt;b&gt;Time to live&lt;/b&gt; (&lt;b&gt;TTL&lt;/b&gt;) or &lt;b&gt;hop limit&lt;/b&gt; is a mechanism which limits the lifespan or lifetime of data in a computer or network. TTL may be implemented as a counter or timestamp attached to or embedded in the data. Once the prescribed event count or timespan has elapsed, data is discarded or revalidated. In computer networking, TTL prevents a data packet from circulating indefinitely. In computing applications, TTL is commonly used to improve the performance and manage the caching of data.&lt;/p&gt;&lt;/div&gt;
  &lt;div class="ltag__wikipedia--btn--container"&gt;
      &lt;a class="ltag__wikipedia--btn" href="https://en.wikipedia.org/wiki/Time_to_live" rel="noopener noreferrer"&gt;View on Wikipedia&lt;/a&gt;&amp;gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Data eviction policies&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In some cases, you may be considering and using the data eviction policy in case the cache storage is full. This is very useful when you need to store many objects in the cache on a limited amount of cache storage/memory. There are many policies out there, for example FIFO, LIFO, LRU, ARC, etc. You may choose one that suits for your needs.&lt;/p&gt;


&lt;div class="ltag__wikipedia--container"&gt;
  &lt;div class="ltag__wikipedia--header"&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%2Fassets%2Fwikipedia-logo-0a3e76624c7b1c3ccdeb9493ea4add6ef5bd82d7e88d102d5ddfd7c981efa2e7.svg" class="ltag__wikipedia--logo" alt="Wikipedia Logo"&gt;
    &lt;a href="https://en.wikipedia.org/wiki/Cache_replacement_policies" rel="noopener noreferrer"&gt;Cache replacement policies&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="ltag__wikipedia--extract"&gt;&lt;p&gt;
In computing, &lt;b&gt;cache replacement policies&lt;/b&gt; are optimizing instructions or algorithms which a computer program or hardware-maintained structure can utilize to manage a cache of information. Caching improves performance by keeping recent or often-used data items in memory locations which are faster, or computationally cheaper to access, than normal memory stores. When the cache is full, the algorithm must choose which items to discard to make room for new data.&lt;/p&gt;&lt;/div&gt;
  &lt;div class="ltag__wikipedia--btn--container"&gt;
      &lt;a class="ltag__wikipedia--btn" href="https://en.wikipedia.org/wiki/Cache_replacement_policies" rel="noopener noreferrer"&gt;View on Wikipedia&lt;/a&gt;&amp;gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If you choose to use Redis, you might want to read the &lt;a href="https://docs.redislabs.com/latest/rc/concepts/data-eviction-policies/" rel="noopener noreferrer"&gt;Redis Data Eviction Policies&lt;/a&gt; as well.&lt;/p&gt;

&lt;p&gt;Another additional mechanism you might need to implement is to manually evict corresponding cached data when there's a write in the database for a particular data.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;In-memory cache vs external cache&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Choosing caching strategy is always depending on the use case. Both strategies (in-memory cache or external cache) have their own strength.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Using In-memory cache&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Cheap, no need to spawn cache server instance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Different cache state when your application has two or more instances, since every instance will have their own managed cache data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Using external cache&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Pros
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Shared state, means consistent cached data accross multiple app instances.&lt;/li&gt;
&lt;li&gt;Your app doesn't need additional memory to hold all cached data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cons
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Might be expensive. You have to spend more bucks for having external layers, i.e. Redis servers/clusters.&lt;/li&gt;
&lt;li&gt;Additional effort if you manage the servers yourselves.&lt;/li&gt;
&lt;li&gt;Network latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to use
&lt;/h2&gt;

&lt;p&gt;There is no silver bullet on solving app performance problem. This is being one of many patterns you can use. All is depending on the use case. You might consider this pattern when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your database doesn't have built-in cache layer&lt;/li&gt;
&lt;li&gt;Your existing cache layer doesn't have a built-in read-through or write-through operation to the database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But then again, you need to look up on your use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caching static data
&lt;/h2&gt;

&lt;p&gt;If your app only depends on static data, it may not be suitable for using cache-aside pattern. Instead, you may consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loading the data on app startup if possible.&lt;/li&gt;
&lt;li&gt;Setting the cached data to never expire.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Cache-aside pattern in Go&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let's go with some coding in Go to demonstrate this pattern.&lt;/p&gt;

&lt;p&gt;Since this is a simulation, We're not actually using a real MySQL or Redis instances. Instead, we'll have some simulation. And by the way, this is a very simple example that demonstrate how cache-aside pattern works.&lt;/p&gt;

&lt;p&gt;First of all, we need to have an interface that you're gonna use it for simulating a repository that we can implement it later as a MySQL and Redis repositories.&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="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Repository&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&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;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&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;We have one method here. Both MySQL and Redis implementation should implements this method.&lt;/p&gt;

&lt;p&gt;Now we're gonna create the MySQL repository that's responsible for handling communication with MySQL.&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="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"errors"&lt;/span&gt;
  &lt;span class="s"&gt;"fmt"&lt;/span&gt;
  &lt;span class="s"&gt;"sync"&lt;/span&gt;
  &lt;span class="s"&gt;"time"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;MySQLRepository&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;mysqldb&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewMySQLRepository&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;Repository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;MySQLRepository&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mysqldb&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&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="c"&gt;// demonstrate an expensivev query or frequently accessed query&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MySQLRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&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;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rawData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysqldb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rawData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"record not found"&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;So here we're using &lt;code&gt;sync.Map&lt;/code&gt; package to simulate the mysql client. Instead of reading from and writing to real database, we're actually reading from and writing to the &lt;code&gt;Map&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And now, the Redis part.&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="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"fmt"&lt;/span&gt;
  &lt;span class="s"&gt;"time"&lt;/span&gt;

  &lt;span class="s"&gt;"github.com/bluele/gcache"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;RedisRepository&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;redis&lt;/span&gt; &lt;span class="n"&gt;gcache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cache&lt;/span&gt;
  &lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="n"&gt;Repository&lt;/span&gt;
  &lt;span class="n"&gt;ttl&lt;/span&gt;   &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewRedisRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="n"&gt;Repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Repository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;RedisRepository&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gcache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LRU&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ttl&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="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;RedisRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&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;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;rawData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;rawData&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// if the data is in redis, return it&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cache hit for id: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rawData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// in case of error, do not return&lt;/span&gt;
    &lt;span class="c"&gt;// have a try reading from database&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cache miss for id: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c"&gt;// if the data is not in the cache yet,&lt;/span&gt;
  &lt;span class="c"&gt;// get it from database&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c"&gt;// and eventually store the value to cache&lt;/span&gt;
  &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetWithExpire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttl&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;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This part is more complex than the MySQL. The Redis repository depends on MySQL repository as the source of truth.&lt;/p&gt;

&lt;p&gt;So basically this adheres to our previous diagram. Let me paste it here so you don't need to scroll up.&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%2Fi%2Fwaop2o50ozhvohmrofre.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%2Fi%2Fwaop2o50ozhvohmrofre.png" alt="Cache-Aside Pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When your app receives a request, it'll try to find the data in the cache layer first.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If the data is in the cache (cache hit), it uses that data instead of requesting to database.&lt;/li&gt;
&lt;li&gt;If the data is not in the cache (cache miss), it will get the data from database.&lt;/li&gt;
&lt;li&gt;Write the copy of data that's obtained from the database into cache layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And then we'll have a main function to call them. Notice that we're using decorator pattern to achieve this.&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="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"fmt"&lt;/span&gt;
  &lt;span class="s"&gt;"time"&lt;/span&gt;

  &lt;span class="s"&gt;"github.com/husniadil/cache-aside-pattern/repository"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;

  &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewMySQLRepository&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRedisRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"2c1b7cd2-0420-4b73-a3f9-734504842fb9"&lt;/span&gt;

  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error loading [%s]: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c"&gt;// wait for cache expiration and we'll see a cache miss&lt;/span&gt;
  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-------------- waiting cache expiration --------------&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error loading [%s]: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&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;It prints:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

-------------- waiting cache expiration --------------

Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Cache hit for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Result: [Husni Husni Husni Husni Husni Husni Husni Husni Husni Husni]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;At the first hit, since we don't have a cached version of the data, it hits the database, and subsequent calls will hit the cache layer.&lt;/p&gt;

&lt;p&gt;All code above is hosted on &lt;a href="https://github.com/husniadil/cache-aside-pattern" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. I added some additional logs to simulate the latency.&lt;/p&gt;

&lt;p&gt;You can browse the code or run the simulation here.&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@husniadil/simple-cache-aside-pattern?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Cache stampede problem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There is another beast to tame when you're working on cache-aside pattern, it's the cache stampede problem. If we quote it from Wikipedia, it says:&lt;/p&gt;


&lt;div class="ltag__wikipedia--container"&gt;
  &lt;div class="ltag__wikipedia--header"&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%2Fassets%2Fwikipedia-logo-0a3e76624c7b1c3ccdeb9493ea4add6ef5bd82d7e88d102d5ddfd7c981efa2e7.svg" class="ltag__wikipedia--logo" alt="Wikipedia Logo"&gt;
    &lt;a href="https://en.wikipedia.org/wiki/Cache_stampede" rel="noopener noreferrer"&gt;Cache stampede&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="ltag__wikipedia--extract"&gt;&lt;p&gt;A &lt;b&gt;cache stampede&lt;/b&gt; is a type of cascading failure that can occur when massively parallel computing systems with caching mechanisms come under a very high load. This behaviour is sometimes also called &lt;b&gt;dog-piling&lt;/b&gt;.&lt;/p&gt;&lt;/div&gt;
  &lt;div class="ltag__wikipedia--btn--container"&gt;
      &lt;a class="ltag__wikipedia--btn" href="https://en.wikipedia.org/wiki/Cache_stampede" rel="noopener noreferrer"&gt;View on Wikipedia&lt;/a&gt;&amp;gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;So, for a real world example, let's say we have an e-commerce site, and we're sending some promotions directly via push notification. It means that most of our users are clicking the notification on their phone directly at the same time.&lt;/p&gt;

&lt;p&gt;Let's say we'll have 1000 users opening the app at the same time, at the same second. Just a little time prior to the traffic burst, our cache layer is on a cold state, it means that some of the cached data are already expired. In this scenario all sudden traffic is likely hitting the database directly -- cache miss. The database is under very high load at this time.&lt;/p&gt;

&lt;p&gt;Our code above does not withstand the cache stampede when we're simulating parallel execution.&lt;/p&gt;

&lt;p&gt;Let's change the code to simulate parallel execution.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="c"&gt;// ............&lt;/span&gt;
  &lt;span class="s"&gt;"sync"&lt;/span&gt;
  &lt;span class="c"&gt;// ............&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// ............&lt;/span&gt;
  &lt;span class="c"&gt;// ............&lt;/span&gt;

  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"2c1b7cd2-0420-4b73-a3f9-734504842fb9"&lt;/span&gt;

  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;wg&lt;/span&gt; &lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WaitGroup&lt;/span&gt;
  &lt;span class="n"&gt;wg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;wg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Done&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;redisRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoAnExpensiveQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Error loading [%s]: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;wg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wait&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Result:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&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;It prints:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9
Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9
Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9
Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9
Cache miss for id: 2c1b7cd2-0420-4b73-a3f9-734504842fb9

Result: [Husni Husni Husni Husni Husni]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can browse the code or run the simulation here.&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@husniadil/cache-stampede-simulation?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;As you can see, all of them is cache miss. Our MySQL database is now working hard to serve all the same data. So how can we solve it?&lt;/p&gt;

&lt;p&gt;There are some different ways to handle this problem, I'll cover it in the next posts.&lt;/p&gt;

&lt;p&gt;I hope this article is clear enough and easy to digest. If you have some feedbacks, let me know in the comment section below.&lt;/p&gt;




&lt;p&gt;&lt;small&gt;Cover image: &lt;a href="https://unsplash.com/@tylerdaviaux?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Tyler Daviaux&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/ram?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>mysql</category>
      <category>redis</category>
      <category>cache</category>
    </item>
    <item>
      <title>Dev.to Editor Kitchen Sink</title>
      <dc:creator>Husni Adil Makmur</dc:creator>
      <pubDate>Thu, 10 Dec 2020 08:02:35 +0000</pubDate>
      <link>https://dev.to/husniadil/dev-to-editor-kitchen-sink-41d8</link>
      <guid>https://dev.to/husniadil/dev-to-editor-kitchen-sink-41d8</guid>
      <description>&lt;p&gt;Learn More: &lt;a href="https://dev.to/p/editor_guide"&gt;https://dev.to/p/editor_guide&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Markdown&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Bold &amp;amp; Italic&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Renders&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;**double asterisks** or __double underscores__&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;double asterisks&lt;/strong&gt; or &lt;strong&gt;double underscores&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*asterisks* or _underscores_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;asterisks&lt;/em&gt; or &lt;em&gt;underscores&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Links&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Renders&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[I'm an inline link](https://dev.to)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to"&gt;I'm an inline link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;a name="anchored"&amp;gt;Anchored links&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a&gt;Anchored links&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Table Of Contents
  * [Chapter 1](#chapter-1)
  * [Chapter 2](#chapter-2)

### Chapter 1 &amp;lt;a name="chapter-1"&amp;gt;&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Renders:&lt;/p&gt;
&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chapter 1&lt;/li&gt;
&lt;li&gt;Chapter 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Chapter 1 &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Inline Images&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;![example image, with sloan](https://res.cloudinary.com/practicaldev/image/fetch/s--OsLaFSo9--/c_fill,f_auto,fl_progressive,h_220,q_auto,w_220/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/31047/af153cd6-9994-4a68-83f4-8ddf3e13f0bf.jpg)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lP-to7Dw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--OsLaFSo9--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_220%2Cq_auto%2Cw_220/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/31047/af153cd6-9994-4a68-83f4-8ddf3e13f0bf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lP-to7Dw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--OsLaFSo9--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_220%2Cq_auto%2Cw_220/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/31047/af153cd6-9994-4a68-83f4-8ddf3e13f0bf.jpg" alt="example image, with sloan" width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;figcaption&amp;gt; You can even add a caption using the HTML &amp;lt;code&amp;gt;figcaption&amp;lt;/code&amp;gt; tag!&amp;lt;/figcaption&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders:&lt;/p&gt;
 You can even add a caption using the HTML &lt;code&gt;figcaption&lt;/code&gt; tag!




&lt;h3&gt;
  
  
  &lt;strong&gt;Headers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# One '#' for a h1 header
## Two '#'s for a h2 header
### Three '#'s for a h3 header
#### Four '#'s for a h4 header
##### Five '#'s for a h5 header
###### Six '#'s for a h6 header
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Renders:&lt;/p&gt;
&lt;h1&gt;
  
  
  One '#' for a h1 header
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Two '#'s for a h2 header
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Three '#'s for a h3 header
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Four '#'s for a h4 header
&lt;/h4&gt;
&lt;h5&gt;
  
  
  Five '#'s for a h5 header
&lt;/h5&gt;
&lt;h6&gt;
  
  
  Six '#'s for a h6 header
&lt;/h6&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Author Notes/Comments&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;&amp;lt;!-- This won't show up in the content! --&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders:&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;🌊 Liquid Tags&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;DEV Article/Post Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% https://dev.to/thepracticaldev/welcome-thread-v103-4dap %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/thepracticaldev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zg3sT9Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--vHKcEiTe--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/3/13d3b32a-d381-4549-b95e-ec665768ce8f.png" alt="thepracticaldev"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thepracticaldev/welcome-thread-v103-4dap" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Welcome Thread - v103&lt;/h2&gt;
      &lt;h3&gt;dev.to staff ・ Dec 9 '20 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#welcome&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;p&gt;Code: &lt;code&gt;{% link thepracticaldev/welcome-thread-v103-4dap %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/thepracticaldev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zg3sT9Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--vHKcEiTe--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/3/13d3b32a-d381-4549-b95e-ec665768ce8f.png" alt="thepracticaldev"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thepracticaldev/welcome-thread-v103-4dap" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Welcome Thread - v103&lt;/h2&gt;
      &lt;h3&gt;dev.to staff ・ Dec 9 '20 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#welcome&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% post https://dev.to/thepracticaldev/welcome-thread-v103-4dap %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/thepracticaldev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zg3sT9Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--vHKcEiTe--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/3/13d3b32a-d381-4549-b95e-ec665768ce8f.png" alt="thepracticaldev"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thepracticaldev/welcome-thread-v103-4dap" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Welcome Thread - v103&lt;/h2&gt;
      &lt;h3&gt;dev.to staff ・ Dec 9 '20 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#welcome&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% post thepracticaldev/welcome-thread-v103-4dap %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/thepracticaldev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zg3sT9Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--vHKcEiTe--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/3/13d3b32a-d381-4549-b95e-ec665768ce8f.png" alt="thepracticaldev"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thepracticaldev/welcome-thread-v103-4dap" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Welcome Thread - v103&lt;/h2&gt;
      &lt;h3&gt;dev.to staff ・ Dec 9 '20 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#welcome&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;DEV User Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% user thepracticaldev %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__3"&gt;
    &lt;a href="/thepracticaldev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zg3sT9Js--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--vHKcEiTe--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/3/13d3b32a-d381-4549-b95e-ec665768ce8f.png" alt="thepracticaldev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/thepracticaldev"&gt;dev.to staff&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/thepracticaldev"&gt;The hardworking team behind dev.to ❤️&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;DEV Tag Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% tag git %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__tag ltag__tag__id__29"&gt;
    &lt;div class="ltag__tag__content"&gt;
      &lt;h2&gt;#&lt;a href="https://dev.to/t/git" class="ltag__tag__link"&gt;git&lt;/a&gt; Follow
&lt;/h2&gt;
      &lt;div class="ltag__tag__summary"&gt;
        Software for tracking changes in any set of files, usually used for coordinating work among programmers collaboratively developing source code during software development.
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;DEV Comment Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% comment 18nkn %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="liquid-comment"&gt;
    &lt;div class="details"&gt;
      &lt;a href="/husniadil"&gt;
        &lt;img class="profile-pic" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_5ok9XKX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--aFS5GAy4--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_50%2Cq_auto%2Cw_50/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/534083/df4def6e-1831-4c51-bcaf-3ee965f84c1a.jpg" alt="husniadil profile image"&gt;
      &lt;/a&gt;
      &lt;a href="/husniadil"&gt;
        &lt;span class="comment-username"&gt;Husni Adil Makmur&lt;/span&gt;
      &lt;/a&gt;
      &lt;span class="color-base-30 px-2 m:pl-0"&gt;•&lt;/span&gt;

&lt;a href="https://dev.to/husniadil/comment/18nkn" class="comment-date crayons-link crayons-link--secondary fs-s"&gt;
  &lt;time&gt;
    Dec 6 '20
  &lt;/time&gt;

&lt;/a&gt;

    &lt;/div&gt;
    &lt;div class="body"&gt;
      &lt;p&gt;I didn't know that this is a community powered site until I saw the &lt;code&gt;Sign Up&lt;/code&gt; button and registered.&lt;/p&gt;


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





&lt;h3&gt;
  
  
  &lt;strong&gt;DEV Podcast Episode Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% podcast https://dev.to/syntax/react-hooks %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="podcastliquidtag"&gt;
  &lt;div class="podcastliquidtag__info"&gt;
    &lt;a href="/syntax/react-hooks"&gt;
      &lt;h1 class="podcastliquidtag__info__episodetitle"&gt;React Hooks&lt;/h1&gt;
    &lt;/a&gt;
    &lt;a href="/syntax"&gt;
      &lt;h2 class="podcastliquidtag__info__podcasttitle"&gt;
        Syntax - Tasty Web Development Treats
      &lt;/h2&gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div id="record-react-hooks" class="podcastliquidtag__record"&gt;
    &lt;img class="button play-butt" id="play-butt-react-hooks" src="https://res.cloudinary.com/practicaldev/image/fetch/s--1SirfZpJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/playbutt-5e444a2eae28832efea0dec3342ccf28a228b326c47f46700d771801f75d6b88.png" alt="play"&gt;
    &lt;img class="button pause-butt" id="pause-butt-react-hooks" src="https://res.cloudinary.com/practicaldev/image/fetch/s--8YU2a2mP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/pausebutt-bba7cb5f432cfb16510e78835378fa22f45fa6ae52a624f7c9794fefa765c384.png" alt="pause"&gt;
    &lt;img class="podcastliquidtag__podcastimage" id="podcastimage-react-hooks" alt="Syntax - Tasty Web Development Treats" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ag54e4FZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--C1GnJEhk--/c_fill%2Cf_auto%2Cfl_progressive%2Cq_auto/https://dev-to-uploads.s3.amazonaws.com/uploads/podcast/image/51/fde96616-3607-4656-8ea2-a1756d0aaff1.png"&gt;
  &lt;/div&gt;

  &lt;div class="hidden-audio" id="hidden-audio-react-hooks"&gt;
  
    
    Your browser does not support the audio element.
  
  &lt;div id="progressBar" class="audio-player-display"&gt;
    &lt;a href="/syntax/react-hooks"&gt;
      &lt;img id="episode-profile-image" alt="React Hooks" width="420" height="420" src="https://res.cloudinary.com/practicaldev/image/fetch/s--N15HgvU7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--uxGMABS5--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_420%2Cq_auto%2Cw_420/https://dev-to-uploads.s3.amazonaws.com/uploads/podcast/image/51/fde96616-3607-4656-8ea2-a1756d0aaff1.png"&gt;
      &lt;img id="animated-bars" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZzrPEFmt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev.to/assets/animated-bars-4e8c57c8b58285fcf7d123680ad8af034cd5cd43b4d9209fe3aab49d1e9d77b3.gif" alt="animated volume bars"&gt;
    &lt;/a&gt;
    &lt;span id="barPlayPause"&gt;
      &lt;img class="butt play-butt" alt="play" src="https://res.cloudinary.com/practicaldev/image/fetch/s--1SirfZpJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/playbutt-5e444a2eae28832efea0dec3342ccf28a228b326c47f46700d771801f75d6b88.png"&gt;
      &lt;img class="butt pause-butt" alt="pause" src="https://res.cloudinary.com/practicaldev/image/fetch/s--8YU2a2mP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/pausebutt-bba7cb5f432cfb16510e78835378fa22f45fa6ae52a624f7c9794fefa765c384.png"&gt;
    &lt;/span&gt;
    &lt;span id="volume"&gt;
      &lt;span id="volumeindicator" class="volume-icon-wrapper showing"&gt;
        &lt;span id="volbutt"&gt;
          &lt;img alt="volume" class="icon-img" height="16" width="16" src="https://res.cloudinary.com/practicaldev/image/fetch/s--vTou7JP3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/volume-cd20707230ae3fc117b02de53c72af742cf7d666007e16e12f7ac11ebd8130a7.png"&gt;
        &lt;/span&gt;
        &lt;span class="range-wrapper"&gt;
          
        &lt;/span&gt;
      &lt;/span&gt;
      &lt;span id="mutebutt" class="volume-icon-wrapper hidden"&gt;
        &lt;img alt="volume-mute" class="icon-img" height="16" width="16" src="https://res.cloudinary.com/practicaldev/image/fetch/s--OX5NjT0t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/volume-mute-8f08ec668105565af8f8394eb18ab63acb386adbe0703afe3748eca8f2ecbf3b.png"&gt;
      &lt;/span&gt;
      &lt;span class="speed" id="speed"&gt;1x&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class="buffer-wrapper" id="bufferwrapper"&gt;
      &lt;span id="buffer"&gt;&lt;/span&gt;
      &lt;span id="progress"&gt;&lt;/span&gt;
      &lt;span id="time"&gt;initializing...&lt;/span&gt;
      &lt;span id="closebutt"&gt;×&lt;/span&gt;
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;DEV Listing Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% listing https://dev.to/listings/education/learn-typescript-this-weekend-free-video-course-258o %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__listing"&gt;
  &lt;div class="ltag__listing-content"&gt;
    &lt;h3&gt;
      &lt;a href="/listings"&gt;
        This listing has expired.
      &lt;/a&gt;
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% listing education/learn-typescript-this-weekend-free-video-course-258o %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__listing"&gt;
  &lt;div class="ltag__listing-content"&gt;
    &lt;h3&gt;
      &lt;a href="/listings"&gt;
        This listing has expired.
      &lt;/a&gt;
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Details Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% details summary %} content {% enddetails %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: 
  summary
  &lt;p&gt;content &lt;/p&gt;

&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% spoiler summary %} content {% endspoiler %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: 
  summary
  &lt;p&gt;content &lt;/p&gt;

&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% collapsible summary %} content {% endcollapsible %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: 
  summary
  &lt;p&gt;content &lt;/p&gt;

&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Twitter Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% twitter 834439977220112384 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sm5LLI1U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/C5SGdGwUcAAlut_.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4n78LmH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/881896578633445376/j_dhfgoj_normal.jpg" alt="The Practical Dev profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        The Practical Dev
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="mentioned-user" href="https://dev.to/thepracticaldev"&gt;@thepracticaldev&lt;/a&gt;
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      ‌‌ &lt;br&gt;As promised— FREE STICKERS FOR ALL&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/AijhZVWdFm"&gt;dev.to/freestickers&lt;/a&gt;&lt;br&gt;‌‌ 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:29 PM - 22 Feb 2017
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=834439977220112384" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=834439977220112384" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=834439977220112384" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Twitter Timeline&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% twitter_timeline https://twitter.com/NYTNow/timelines/576828964162965504 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_twitter_timeline-liquid-tag"&gt;
  &lt;div class="twitter-timeline-thread"&gt;
    &lt;div class="ltag-twitter-timeline-body"&gt;
      &lt;a class="twitter-timeline" href="https://twitter.com/NYTNow/timelines/576828964162965504"&gt;&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="tt-btn-container"&gt;&lt;a class="tt-btn" href="https://twitter.com/NYTNow/timelines/576828964162965504"&gt;View on Twitter&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Glitch embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% glitch earthy-course %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/earthy-course?path=index.html" alt="earthy-course on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;GitHub Repo Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% github forem/forem %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/forem"&gt;
        forem
      &lt;/a&gt; / &lt;a href="https://github.com/forem/forem"&gt;
        forem
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      For empowering community 🌱
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;br&gt;
  &lt;h1&gt;
Forem 🌱
&lt;/h1&gt;
  &lt;strong&gt;For Empowering Community&lt;/strong&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a href="https://app.travis-ci.com/github/forem/forem" rel="nofollow"&gt;
    &lt;img src="https://camo.githubusercontent.com/7777955364c25b7fa5653d6ed995e776f485cbfea725a59de54c2a23d2822936/68747470733a2f2f6170692e7472617669732d63692e636f6d2f666f72656d2f666f72656d2e7376673f6272616e63683d6d61696e" alt="Build Status"&gt;
  &lt;/a&gt;
  &lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/64b9f7c7c5f41ec22113b61235256435cd61779a0554b0595b88b6011f94c60b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d"&gt;&lt;img src="https://camo.githubusercontent.com/64b9f7c7c5f41ec22113b61235256435cd61779a0554b0595b88b6011f94c60b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d" alt="GitHub commit activity"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/forem/forem/issues?q=is%3Aissue+is%3Aopen+label%3A%22ready+for+dev%22"&gt;
    &lt;img src="https://camo.githubusercontent.com/52c57e03799f9e9d02e90651d5eb43cb30ef547ba0023e2835ff1aaf752a3878/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f666f72656d2f666f72656d2f726561647920666f7220646576" alt="GitHub issues ready for dev"&gt;
  &lt;/a&gt;
  &lt;a href="https://gitpod.io/#https://github.com/forem/forem" rel="nofollow"&gt;
    &lt;img src="https://camo.githubusercontent.com/63c6e800af1de7d75c99e61d64a1f1dd1972471f778b4290c98886f35ee4170c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73657475702d6175746f6d617465642d626c75653f6c6f676f3d676974706f64" alt="GitPod badge"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Welcome to the &lt;a href="https://forem.com" rel="nofollow"&gt;Forem&lt;/a&gt; codebase, the platform that powers
&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt;. We are so excited to have you. With your help, we can
build out Forem’s usability, scalability, and stability to better serve our
communities.&lt;/p&gt;
&lt;h2&gt;
What is Forem?&lt;/h2&gt;
&lt;p&gt;Forem is open source software for building communities. Communities for your
peers, customers, fanbases, families, friends, and any other time and space
where people need to come together to be part of a collective
&lt;a href="https://dev.to/devteam/for-empowering-community-2k6h" rel="nofollow"&gt;See our announcement post&lt;/a&gt;
for a high-level overview of what Forem is.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt; (or just DEV) is hosted by Forem. It is a community of
software developers who write articles, take part in discussions, and build
their professional profiles. We value supportive and constructive dialogue in
the pursuit of great code and career growth for all members. The ecosystem spans
from beginner to advanced developers, and all are welcome to find their place…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/forem/forem"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% github forem/forem no-readme %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/forem"&gt;
        forem
      &lt;/a&gt; / &lt;a href="https://github.com/forem/forem"&gt;
        forem
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      For empowering community 🌱
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;GitHub Issue, Pull request or Comment Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% github https://github.com/forem/forem/issues/9 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/forem/forem/issues/9"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Interactive code snippets
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#9&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/viebel"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--WKhUQGdQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://avatars1.githubusercontent.com/u/955710%3Fv%3D4" alt="viebel avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/viebel"&gt;viebel&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/forem/forem/issues/9"&gt;&lt;time&gt;Dec 15, 2016&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;&lt;code&gt;Dev.to&lt;/code&gt; looks awesome.
Congrats!&lt;/p&gt;
&lt;p&gt;I was thinking of an integration of the &lt;a href="https://github.com/viebel/klipse"&gt;klipse plugin&lt;/a&gt; into dev.to to allow blog writers to have interactive code snippets in javascript, ruby, python, scheme or ocaml.&lt;/p&gt;
&lt;p&gt;And write cool blog posts like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.jrheard.com/procedural-dungeon-generation-drunkards-walk-in-clojurescript" rel="nofollow"&gt;http://blog.jrheard.com/procedural-dungeon-generation-drunkards-walk-in-clojurescript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://exupero.org/hazard/post/islands/" rel="nofollow"&gt;http://exupero.org/hazard/post/islands/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://untangled.io/immutable-js-an-introduction-with-examples-written-for-humans/" rel="nofollow"&gt;http://untangled.io/immutable-js-an-introduction-with-examples-written-for-humans/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do you say?&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/forem/forem/issues/9"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;GitHub Gist Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% gist https://gist.github.com/CristinaSolana/1885435 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% gist https://gist.github.com/CristinaSolana/1885435 file=gistfile1.md %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% gist https://gist.github.com/suntong/3a31faf8129d3d7a380122d5a6d48ff6/f77d01e82defbf736ebf4879a812cf9c916a9252 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% gist https://gist.github.com/suntong/3a31faf8129d3d7a380122d5a6d48ff6/f77d01e82defbf736ebf4879a812cf9c916a9252 file=Images.tmpl %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;GitPitch Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% gitpitch https://gitpitch.com/gitpitch/in-60-seconds %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe height="450" src="https://gitpitch.com/gitpitch/in-60-seconds"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Video Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% youtube dQw4w9WgXcQ %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe width="710" height="399" src="https://www.youtube.com/embed/dQw4w9WgXcQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% vimeo 193110695 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://player.vimeo.com/video/193110695" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% twitch ClumsyPrettiestOilLitFam %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://clips.twitch.tv/embed?clip=ClumsyPrettiestOilLitFam&amp;amp;parent=dev.to&amp;amp;autoplay=false" height="399" width="710"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Medium Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% medium https://medium.com/s/story/boba-science-how-can-i-drink-a-bubble-tea-to-ensure-that-i-dont-finish-the-tea-before-the-bobas-7fc5fd0e442d %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/s/story/boba-science-how-can-i-drink-a-bubble-tea-to-ensure-that-i-dont-finish-the-tea-before-the-bobas-7fc5fd0e442d" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sSiaB97V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/fit/c/96/96/1%2AFnr5ZEpdkc7Q0wodWUgF6A.jpeg" alt="Krist Wongsuphasawat"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/s/story/boba-science-how-can-i-drink-a-bubble-tea-to-ensure-that-i-dont-finish-the-tea-before-the-bobas-7fc5fd0e442d" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How Can I Drink Bubble Tea Without Finishing the Tea Before the Bobas? | by Krist Wongsuphasawat | Medium&lt;/h2&gt;
      &lt;h3&gt;Krist Wongsuphasawat ・ &lt;time&gt;Oct 16, 2018&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hnDHPsJs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/medium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;SlideShare Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% slideshare d5rGkEgXFDRN17 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://www.slideshare.net/slideshow/embed_code/key/d5rGkEgXFDRN17" alt="d5rGkEgXFDRN17 on slideshare.net" width="100%" height="487"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;CodePen Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% codepen https://codepen.io/twhite96/pen/XKqrJX %}&lt;/code&gt;&lt;br&gt;
&lt;code&gt;default-tab&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders &lt;iframe height="600" src="https://codepen.io/twhite96/embed/XKqrJX?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;code&gt;&lt;br&gt;
&lt;/code&gt;default-tab&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% codepen https://codepen.io/twhite96/pen/XKqrJX default-tab=js,result %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe height="600" src="https://codepen.io/twhite96/embed/XKqrJX?height=600&amp;amp;default-tab=js,result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Kotlin Playground&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% kotlin https://pl.kotl.in/owreUFFUG?theme=darcula&amp;amp;from=3&amp;amp;to=6&amp;amp;readOnly=true %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://pl.kotl.in/owreUFFUG?theme=darcula&amp;amp;from=3&amp;amp;to=6&amp;amp;readOnly=true"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;RunKit Embed&lt;/strong&gt;
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% runkit
// hidden setup JavaScript code goes in this preamble area
const hiddenVar = 42
%}
// visible, reader-editable JavaScript code goes here
console.log(hiddenVar)
{% endrunkit %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Renders:&lt;/p&gt;


&lt;div class="runkit-element"&gt;
  &lt;code&gt;
    
// hidden setup JavaScript code goes in this preamble area
const hiddenVar = 42

  &lt;/code&gt;
  &lt;code&gt;
    
// visible, reader-editable JavaScript code goes here
console.log(hiddenVar)

  &lt;/code&gt;
&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;KaTeX Embed&lt;/strong&gt;
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% katex %}
 c = \pm\sqrt{a^2 + b^2}
{% endkatex %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Renders:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;c=±a2+b2
 c = \pm\sqrt{a^2 + b^2}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;±&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{% katex inline %}
 c = \pm\sqrt{a^2 + b^2}
{% endkatex %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Renders:&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;c=±a2+b2
 c = \pm\sqrt{a^2 + b^2}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;c&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;±&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Stackblitz Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% stackblitz ball-demo %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://stackblitz.com/edit/ball-demo?" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% stackblitz ball-demo view=preview %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://stackblitz.com/edit/ball-demo?view=preview" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% stackblitz ball-demo file=style.css %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://stackblitz.com/edit/ball-demo?file=style.css" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;CodeSandbox Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% codesandbox ppxnl191zx %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://codesandbox.io/embed/ppxnl191zx"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% codesandbox ppxnl191zx initialpath=/initial/load/path %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://codesandbox.io/embed/ppxnl191zx?initialpath=/initial/load/path"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% codesandbox ppxnl191zx module=/path/to/module %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://codesandbox.io/embed/ppxnl191zx?module=/path/to/module"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% codesandbox ppxnl191zx runonclick=1 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://codesandbox.io/embed/ppxnl191zx?runonclick=1"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;JSFiddle Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% jsfiddle https://jsfiddle.net/link2twenty/v2kx9jcd %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://jsfiddle.net/link2twenty/v2kx9jcd/embedded//dark" width="100%" height="600"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% jsfiddle https://jsfiddle.net/webdevem/Q8KVC result,html,css %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://jsfiddle.net/webdevem/Q8KVC/embedded/result,html,css//dark" width="100%" height="600"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;JSitor Liquid Tag&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% jsitor https://jsitor.com/embed/B7FQ5tHbY %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe height="400" src="https://jsitor.com/embed/B7FQ5tHbY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% jsitor https://jsitor.com/embed/B7FQ5tHbY?html&amp;amp;js&amp;amp;css&amp;amp;result&amp;amp;light %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe height="400" src="https://jsitor.com/embed/B7FQ5tHbY?html&amp;amp;js&amp;amp;css&amp;amp;result&amp;amp;light"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% jsitor B7FQ5tHbY %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe height="400" src="https://jsitor.com/embed/B7FQ5tHbY"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% jsitor B7FQ5tHbY?html&amp;amp;js&amp;amp;css&amp;amp;result&amp;amp;light %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe height="400" src="https://jsitor.com/embed/B7FQ5tHbY?html&amp;amp;js&amp;amp;css&amp;amp;result&amp;amp;light"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;repl.it Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% replit @WigWog/PositiveFineOpensource %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@WigWog/PositiveFineOpensource?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Stackery Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% stackery deeheber lambda-layer-example master %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe title="stackery editor" src="//app.stackery.io/editor/design?owner=deeheber&amp;amp;repo=lambda-layer-example&amp;amp;ref=master" width="100%" height="400"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Next Tech Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Renders: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BAAHwBUa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/r449xp8cay3383i139qv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BAAHwBUa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/r449xp8cay3383i139qv.png" alt="Share Replit sandbox" width="753" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code: &lt;code&gt;{% nexttech https://nt.dev/s/6ba1fffbd09e %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://next.tech/projects/6ba1fffbd09e/embed"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Instagram Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% instagram BXgGcAUjM39 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="instagram-position"&gt;
  &lt;iframe id="instagram-liquid-tag" src="https://www.instagram.com/p/BXgGcAUjM39/embed/captioned/"&gt;
  &lt;/iframe&gt;
  
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Speakerdeck Tag&lt;/strong&gt;
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Given this embed link:
&amp;lt;script async class="speakerdeck-embed"
    data-id="7e9f8c0fa0c949bd8025457181913fd0"
    data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"&amp;gt;&amp;lt;/script&amp;gt;
{% speakerdeck 7e9f8c0fa0c949bd8025457181913fd0 %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Renders:&lt;/p&gt;



&lt;p&gt;&lt;iframe class="speakerdeck-iframe ltag_speakerdeck" src="https://speakerdeck.com/player/7e9f8c0fa0c949bd8025457181913fd0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Soundcloud Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% soundcloud https://soundcloud.com/jabs-badut/iwan-fals-kesaksian %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe width="100%" height="166" src="https://w.soundcloud.com/player/?url=https://soundcloud.com/jabs-badut/iwan-fals-kesaksian&amp;amp;auto_play=false&amp;amp;color=%23000000&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;show_teaser=true"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Spotify Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% spotify spotify:album:4RuzGKLG99XctuBMBkFFOC %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe src="https://open.spotify.com/embed/album/4RuzGKLG99XctuBMBkFFOC" width="100%" height="380px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;Blogcast Tag&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% blogcast 1234 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_blogcast"&gt;
  &lt;iframe id="blogcast_1234" src="https://app.blogcast.host/embed/1234"&gt;&lt;/iframe&gt;
&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;Parler Tag&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% parler https://www.parler.io/audio/73240183203/ab59b90c45cd1f2144291f1a1cfd69894f87aabf.e466ec75-50e8-47c9-b376-55122f2e3a08.mp3 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;iframe width="710" height="120" src="https://api.parler.io/ss/player?url=https://www.parler.io/audio/73240183203/ab59b90c45cd1f2144291f1a1cfd69894f87aabf.e466ec75-50e8-47c9-b376-55122f2e3a08.mp3"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Stack Exchange / Stack Overflow Tag&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% stackoverflow 24789130 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Gn-iPj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/24789130/colors-in-irb-rails-console" rel="noopener noreferrer"&gt;
            Colors in irb / rails console
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jul 16 '14&lt;/span&gt;
            &lt;span&gt;Comments: 1&lt;/span&gt;
            &lt;span&gt;Answers: 1&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/24789130/colors-in-irb-rails-console" rel="noopener noreferrer"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9mJpuJP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          4
        &lt;/div&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wif5Zq3z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I'm testing a gem that outputs color in the terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module Color
    def self.colorize(text, color_code)
        "#{color_code}#{text}e[0m"
    end

    def self.red(text)
        self.colorize(text, "\033[1;31;12m")
    end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I have a testing file in the same directory, called color_test.rb:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require_relative 'color.rb'

puts Color.red('I should be red')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This results in the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ruby color_test.rb
I&lt;/code&gt;&lt;/pre&gt;…
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/24789130/colors-in-irb-rails-console" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% stackexchange 169988 diy %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bJom1uOC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-logo-37d4118c1280b00533496a8c870284b2c0d08fac862f7cf964b9469b9db96984.svg" alt=""&gt;
          &lt;a href="https://diy.stackexchange.com/questions/169988/base-for-refrigerator-wine-shelf" rel="noopener noreferrer"&gt;
            Base for refrigerator wine shelf
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jul 27 '19&lt;/span&gt;
            &lt;span&gt;Comments: 2&lt;/span&gt;
            &lt;span&gt;Answers: 3&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://diy.stackexchange.com/questions/169988/base-for-refrigerator-wine-shelf" rel="noopener noreferrer"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9mJpuJP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          1
        &lt;/div&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wif5Zq3z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I have a wine refrigerator that has shelves for wine bottles - image on this question.&lt;/p&gt;
&lt;p&gt;I want to use this refrigerator and its shelves as a regular refrigerator. So I need to put something on the shelf to make it flat so it can hold anything. The inner (usable)…&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://diy.stackexchange.com/questions/169988/base-for-refrigerator-wine-shelf" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% stackexchange 170185 diy %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bJom1uOC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-logo-37d4118c1280b00533496a8c870284b2c0d08fac862f7cf964b9469b9db96984.svg" alt=""&gt;
          &lt;a href="https://diy.stackexchange.com/questions/169988/base-for-refrigerator-wine-shelf/170185#170185" rel="noopener noreferrer"&gt;
            &lt;span class="title-flare"&gt;answer&lt;/span&gt; re: Base for refrigerator wine shelf
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jul 30 '19&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://diy.stackexchange.com/questions/169988/base-for-refrigerator-wine-shelf/170185#170185" rel="noopener noreferrer"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9mJpuJP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          1
        &lt;/div&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wif5Zq3z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;What about an aluminum baking sheet pan? They come in sizes VERY close to what you want and are easily cleaned.&lt;/p&gt;

&lt;p&gt;Example of a close size:
&lt;a href="https://rads.stackoverflow.com/amzn/click/com/B001CIEJQU" rel="nofollow noreferrer"&gt;https://www.amazon.com/Winware-ALXP-1622-16-Inch-22-Inch-Aluminum/dp/B001CIEJQU&lt;/a&gt;&lt;/p&gt;

    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://diy.stackexchange.com/questions/169988/base-for-refrigerator-wine-shelf/170185#170185" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Answer&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Wikipedia Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% wikipedia https://en.wikipedia.org/wiki/Wikipedia %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__wikipedia--container"&gt;
  &lt;div class="ltag__wikipedia--header"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sew3uq9H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/wikipedia-logo-0a3e76624c7b1c3ccdeb9493ea4add6ef5bd82d7e88d102d5ddfd7c981efa2e7.svg" class="ltag__wikipedia--logo" alt="Wikipedia Logo" width="128" height="128"&gt;
    &lt;a href="https://en.wikipedia.org/wiki/Wikipedia" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="ltag__wikipedia--extract"&gt;&lt;p&gt;&lt;b&gt;Wikipedia&lt;/b&gt; is a multilingual free online encyclopedia written and maintained by a community of volunteers through open collaboration and a wiki-based editing system. Individual contributors, also called editors, are known as Wikipedians. Wikipedia is the largest and most-read reference work in history. It is consistently one of the 15 most popular websites ranked by Alexa; as of 2022, Wikipedia was ranked the 10th most popular site. It is hosted by the Wikimedia Foundation, an American non-profit organization funded mainly through donations.&lt;/p&gt;&lt;/div&gt;
  &lt;div class="ltag__wikipedia--btn--container"&gt;
    
      &lt;a href="https://en.wikipedia.org/wiki/Wikipedia" rel="noopener noreferrer"&gt;View on Wikipedia&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% wikipedia https://en.wikipedia.org/wiki/Wikipedia#Diversity %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__wikipedia--container"&gt;
  &lt;div class="ltag__wikipedia--header"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sew3uq9H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/wikipedia-logo-0a3e76624c7b1c3ccdeb9493ea4add6ef5bd82d7e88d102d5ddfd7c981efa2e7.svg" class="ltag__wikipedia--logo" alt="Wikipedia Logo" width="128" height="128"&gt;
    &lt;a href="https://en.wikipedia.org/wiki/Wikipedia#Diversity" rel="noopener noreferrer"&gt;Wikipedia - Diversity&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="ltag__wikipedia--extract"&gt;

&lt;p&gt;Several studies have shown that most Wikipedia contributors are male. Notably, the results of a Wikimedia Foundation survey in 2008 showed that only 13 percent of Wikipedia editors were female.&lt;span class="mw-ref reference" id="cite_ref-139"&gt;&amp;lt;span class="mw-reflink-text"&amp;gt;[134]&amp;lt;/span&amp;gt;&lt;/span&gt; Because of this, universities throughout the United States tried to encourage women to become Wikipedia contributors. Similarly, many of these universities, including Yale and Brown, gave college credit to students who create or edit an article relating to women in science or technology.&lt;span class="mw-ref reference" id="cite_ref-140"&gt;&amp;lt;span class="mw-reflink-text"&amp;gt;[135]&amp;lt;/span&amp;gt;&lt;/span&gt; Andrew Lih, a professor and scientist, wrote in &lt;i&gt;The New York Times&lt;/i&gt; that the reason he thought the number of male contributors outnumbered the number of females so greatly was because identifying as a woman may expose oneself to "ugly, intimidating behavior".&lt;span class="mw-ref reference" id="cite_ref-141"&gt;&amp;lt;span class="mw-reflink-text"&amp;gt;[136]&amp;lt;/span&amp;gt;&lt;/span&gt; Data has shown that Africans are underrepresented among Wikipedia editors.&lt;span class="mw-ref reference" id="cite_ref-memeb_142-0"&gt;&amp;lt;span class="mw-reflink-text"&amp;gt;[137]&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/p&gt;


&lt;/div&gt;
  &lt;div class="ltag__wikipedia--btn--container"&gt;
    
      &lt;a href="https://en.wikipedia.org/wiki/Wikipedia#Diversity" rel="noopener noreferrer"&gt;View on Wikipedia&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Asciinema Embed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% asciinema 239367 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;


&lt;p&gt;Code: &lt;code&gt;{% asciinema https://asciinema.org/a/239367 %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;





&lt;h3&gt;
  
  
  &lt;strong&gt;Reddit Tag&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Code: &lt;code&gt;{% reddit https://www.reddit.com/r/aww/comments/ag3s4b/ive_waited_28_years_to_finally_havr_my_first_pet %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Renders: &lt;/p&gt;
&lt;div class="ltag__reddit--container"&gt;
  &lt;div class="ltag__reddit--title-container"&gt;
    
      &lt;div class="ltag__reddit--title"&gt;
        &lt;h1&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bCqI7Yj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/reddit-icon-c6851eed10026b5707e2e8c814b5bbcbb4823de68d5b611a6f4b99c8beed6f05.svg" alt="Reddit Logo"&gt;
          &lt;a href="https://www.reddit.com/r/aww/comments/ag3s4b/ive_waited_28_years_to_finally_havr_my_first_pet" rel="noopener noreferrer"&gt;
            I've waited 28 years to finally havr my first pet. Everyone, meet Mycroft.
          &lt;/a&gt;
        &lt;/h1&gt;
        &lt;div class="ltag__reddit--post-metadata"&gt;
          &lt;span&gt;Jan 15 '19&lt;/span&gt;
          &lt;span&gt;Author: Miaogua007&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__reddit--body"&gt;
    &lt;p&gt;
        &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JSptTKwF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://b.thumbs.redditmedia.com/iE2-RIbThs-9_TaeZb8eFsCge_mn1MHd6uirdou8H3o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JSptTKwF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://b.thumbs.redditmedia.com/iE2-RIbThs-9_TaeZb8eFsCge_mn1MHd6uirdou8H3o.jpg" alt="I've waited 28 years to finally havr my first pet. Everyone, meet Mycroft."&gt;&lt;/a&gt;
    &lt;/p&gt;
  &lt;/div&gt;
  &lt;div class="ltag__reddit--btn--container"&gt;
    
      &lt;a href="https://www.reddit.com/r/aww/comments/ag3s4b/ive_waited_28_years_to_finally_havr_my_first_pet" rel="noopener noreferrer"&gt;See Full Post&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Learn More: &lt;a href="https://dev.to/p/editor_guide"&gt;https://dev.to/p/editor_guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sandbox</category>
      <category>kitchensink</category>
      <category>devto</category>
      <category>markdown</category>
    </item>
  </channel>
</rss>
