<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Michael Lee 🍕</title>
    <description>The latest articles on Forem by Michael Lee 🍕 (@michael).</description>
    <link>https://forem.com/michael</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%2F16614%2F1678b62a-8043-4b1d-ba9b-a3b2a24a4113.png</url>
      <title>Forem: Michael Lee 🍕</title>
      <link>https://forem.com/michael</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/michael"/>
    <language>en</language>
    <item>
      <title>Why is it you can execute a function on the right side of an AND &amp;&amp; operator in JavaScript</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Thu, 31 Mar 2022 18:39:56 +0000</pubDate>
      <link>https://forem.com/michael/why-is-it-you-can-execute-a-function-on-the-right-side-of-an-and-operator-in-javascript-3npk</link>
      <guid>https://forem.com/michael/why-is-it-you-can-execute-a-function-on-the-right-side-of-an-and-operator-in-javascript-3npk</guid>
      <description>&lt;p&gt;I always assumed that operators like &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; and &lt;code&gt;||&lt;/code&gt; are for comparing &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;false&lt;/code&gt; statements on both sides.&lt;/p&gt;

&lt;p&gt;But I'm seeing a pattern in React where, on the right side is a function and the left is a truthy statement that will then allow the right to be executed.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truthy&lt;/span&gt; &lt;span class="nx"&gt;statement&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I understand that JavaScript will check this from left to right, so left being true will then allow it to check the right. But my assumption is the right should expect a &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt; statement, but in this case it's just a function.&lt;/p&gt;

&lt;p&gt;I'm so used to seeing the &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator in this context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Execute this&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;execute&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works at all.&lt;/p&gt;

&lt;p&gt;I guess my assumption is that JavaScript will just evaluate anything next to an operator whether it returns a &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>explainlikeimfive</category>
    </item>
    <item>
      <title>Add a YouTube stats widget to your iPhone with JavaScript</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Tue, 26 Jan 2021 03:45:01 +0000</pubDate>
      <link>https://forem.com/michael/add-a-youtube-stats-widget-to-your-iphone-with-javascript-52di</link>
      <guid>https://forem.com/michael/add-a-youtube-stats-widget-to-your-iphone-with-javascript-52di</guid>
      <description>&lt;p&gt;In this article, I'll be showing you how to add a YouTube widget to your iPhone that pulls in a couple of stats from your YouTube channel—total subscribers and total views.&lt;/p&gt;

&lt;h2&gt;
  
  
  What will it look like on my phone?!
&lt;/h2&gt;

&lt;p&gt;Great question, here's a screenshot of the widget on my phone with my &lt;em&gt;excellent&lt;/em&gt; channel stats 🥳&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F731hka6ztpzz97z7e97m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F731hka6ztpzz97z7e97m.png" alt="Screenshot of iPhone Home Screen with YouTube widget" width="800" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks nice right? You want one on your phone too, you say? Well let me show you how!&lt;/p&gt;

&lt;h2&gt;
  
  
  What it won't do
&lt;/h2&gt;

&lt;p&gt;Wait...before we get started let me tell you what the widget won't do for you. It &lt;strong&gt;won't&lt;/strong&gt; create new videos for you. It &lt;strong&gt;won't&lt;/strong&gt; give you more subscribers. It &lt;strong&gt;won't&lt;/strong&gt; make you a YouTube sensation.&lt;/p&gt;

&lt;p&gt;Unfortunately, you'll have to still put in the work to make all your YouTube dreams come true.&lt;/p&gt;

&lt;p&gt;What the widget &lt;em&gt;could do&lt;/em&gt; is give you a little motivation every time you look at your iPhone's Home Screen to keep creating and putting your work out into the world.&lt;/p&gt;

&lt;p&gt;I hope you still want this widget on your phone...I just wanted to set the right expectations first 😬&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll need to get started
&lt;/h2&gt;

&lt;p&gt;In order to get this widget on your phone and working correctly you'll need four things.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You'll need an iPhone with iOS 14—the first version of iOS where widgets appeared.&lt;/li&gt;
&lt;li&gt;An app called &lt;a href="https://scriptable.app"&gt;Scriptable&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A Google API key—you can &lt;a href="https://developers.google.com/youtube/v3/getting-started"&gt;follow instructions here&lt;/a&gt; to set up an account and get one.&lt;/li&gt;
&lt;li&gt;A little patience as there's some code involved. No worries if you're not a coder, I'll do my best to guide you along and make it as not scary as possible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you've got all four of the items in the list above, it's time to grab your YouTube channel ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to find your YouTube channel ID
&lt;/h2&gt;

&lt;p&gt;The easiest way to grab your YouTube channel's ID is to pull up the channel in your browser.&lt;/p&gt;

&lt;p&gt;In the address bar, you should see,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;www.youtube.com/channel/****
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;***&lt;/code&gt; represents your channel's ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2llwdksh52ui9heaxzs9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2llwdksh52ui9heaxzs9.png" alt="Screenshot of YouTube channel highlight the channel ID" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write your channel ID down or copy and paste it somewhere because you're going to need it in a little bit.&lt;/p&gt;

&lt;p&gt;But wait Michael, I'm MKBHD and I've got a totally sweet short URL for my channel like this,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1nvw9lm66u8p7eopjkyq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1nvw9lm66u8p7eopjkyq.png" alt="Screenshot of MKBHD's YouTube channel" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do I get my channel's ID?&lt;/p&gt;

&lt;p&gt;Glad you asked Marques!&lt;/p&gt;

&lt;p&gt;This is how you find your channel's ID if you've got one of those fancy short URLs for your YouTube channel.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on any video in your channel&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hover over your profile's name on the video page, you'll notice that it's actually linking to your channel with the non-fancy, long obscure ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0d7c6k2h5j47b58qdu44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0d7c6k2h5j47b58qdu44.png" alt="Hover over YouTuber name to reveal channel ID" width="473" height="273"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Right click over your name and select the copy link and now you've got your channel URL with the ID. Throw away everything &lt;strong&gt;but&lt;/strong&gt; the channel ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fykhgi2e6yq0bklac9lbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fykhgi2e6yq0bklac9lbs.png" alt="Right click on name to copy the channel URL" width="416" height="347"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;

&lt;p&gt;Now comes the part where it might get a little scary if you've never touched code before, but I promise I'll try to make it as not scary as possible.&lt;/p&gt;

&lt;p&gt;In this part we'll put some code into Scriptable and then use some of the things we've been collecting to finally get our widget set up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open up Scriptable and create a new script by pressing the &lt;code&gt;+&lt;/code&gt; button in the top right hand corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhkam9inf8cbnh5gqtp1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhkam9inf8cbnh5gqtp1l.png" alt="Tap on the top right plus symbol to create a new script" width="800" height="939"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy and paste this code in there,&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;channelID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;channelName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My channel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runsInWidget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;Script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;Script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;channelID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://www.googleapis.com/youtube/v3/channels?part=statistics&amp;amp;id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;channelID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;key=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadJSON&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ListWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;ytData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;channelID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;ytData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ytData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subscribers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;abbreviateNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ytData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statistics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscriberCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="nx"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;boldSystemFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;subscribers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subscribersLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Subscribers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;subscribersLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;semiboldSystemFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;subscribersLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewsBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addStack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;viewsBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewsContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;viewsBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addStack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;viewsContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;layoutHorizontally&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;viewsContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewSymbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SFSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;named&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;play.fill&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;viewsContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;viewSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;viewImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tintColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;white&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;viewImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;viewsContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;viewsContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;abbreviateNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ytData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statistics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;viewCount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;semiboldSystemFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;viewsBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewsLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Views&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;viewsLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;semiboldSystemFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;viewsLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;channelLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;channelName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;channelLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;semiboldRoundedSystemFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;channelLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;reloadStack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addStack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;layoutHorizontally&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignContent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;reloadSymbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SFSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;named&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arrow.triangle.2.circlepath&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;reloadImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reloadSymbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;reloadImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tintColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;white&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;reloadImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;reloadImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageOpacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;
  &lt;span class="nx"&gt;reloadImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignImage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;updateTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;zeroPad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHours&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;zeroPad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMinutes&lt;/span&gt;&lt;span class="p"&gt;())}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;updateLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateTime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;updateLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;semiboldRoundedSystemFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;updateLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textOpacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;
  &lt;span class="nx"&gt;updateLabel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;centerAlignText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="nx"&gt;reloadStack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addSpacer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#ff0000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#e40000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gradient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinearGradient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;gradient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;startColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;endColor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;gradient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backgroundGradient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gradient&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;widget&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Credit: https://stackoverflow.com/a/32638472&lt;/span&gt;
&lt;span class="c1"&gt;// Thanks to https://stackoverflow.com/users/1438550/d-deriso&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;abbreviateNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// terminate early&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// terminate early&lt;/span&gt;
  &lt;span class="nx"&gt;fixed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fixed&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;fixed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// number of decimal places to show&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toPrecision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// get power&lt;/span&gt;
  &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// floor at decimals, ceiling at trillions&lt;/span&gt;
  &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fixed&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="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// divide by power&lt;/span&gt;
  &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// enforce -0 is 0&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;K&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;T&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// append power&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;zeroPad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numToPad&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numToPad&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;numToPad&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`0&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;numToPad&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; 
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your API key to the first line in the code that starts like this,&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const apiKey = ""
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;You'll want to add the API key in between the two quotation marks &lt;code&gt;""&lt;/code&gt;. Once you do, the first line of code should look something like this,&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const apiKey = "yourAPIKeyFromGoogle"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your channel key to the second line in the code that starts like this,&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const channelID = ""
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Again, you'll want to add the ID in between the two quotation marks &lt;code&gt;""&lt;/code&gt;. Once you do, the second line of code should look something like this,&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const channelID = "yourChannelIDWeGrabbedEarlier"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And that's it for the coding portion! Now let's add just a little bit of flair by giving our script a name, icon and color. You can do this by pressing the icon in the bottom left corner of your screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2cynvw80tei1hmolg1dq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2cynvw80tei1hmolg1dq.png" alt="Tap on the icon to get to the script settings" width="800" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll get this screen where you can set a name, icon and color.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff8crh76da8vnc55odt6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff8crh76da8vnc55odt6a.png" alt="You can change the name, icon and color of the script from this screen" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now that you're done. Close the window and tap &lt;strong&gt;Done&lt;/strong&gt; to exit our of your script. We're ready for the moment we've all been waiting for...the widget!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The widget
&lt;/h2&gt;

&lt;p&gt;In this section, I'll show you how to get the new Scriptable widget on your Home Screen. If you're already familiar with this process, feel free to skip over this step and go to the next section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.apple.com/en-us/HT207122"&gt;To add the widget to your Home Screen&lt;/a&gt; you'll want to do this.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Tap and hold anywhere on your Home Screen until the apps start to jiggle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz0cg7w94tnl4pnws6haq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fz0cg7w94tnl4pnws6haq.gif" alt="Gif to show app jiggle on iOS Home Screen" width="600" height="775"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tap the plus &lt;code&gt;+&lt;/code&gt; button in the top left hand corner,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll down until you see Scriptable and tap it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the small widget (which should be the default one shown) and tap &lt;strong&gt;Add Widget&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the widget is added to your Home Screen, you'll see the widget display, &lt;em&gt;Select script in widget configurator&lt;/em&gt;, tap the new widget and you should get the widget configurator.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next to the label, &lt;em&gt;Script&lt;/em&gt; tap &lt;strong&gt;Choose&lt;/strong&gt; to select the new YouTube script you had added into the Scriptable. Once you've selected it, tap outside of the configurator to be taken back to your Home Screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv451wcy8a9hy9e4n60ms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv451wcy8a9hy9e4n60ms.png" alt="Photo of Scriptable configurator" width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🥳 do a little dance cause now you've got your very own YouTube widget on your Home Screen to go with you wherever you go. The widget is proof that your work is appreciated by viewers from all over!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get fancy
&lt;/h2&gt;

&lt;p&gt;Now that you're able to see your channel's subscriptions and video views count, I hope it motivates you to keep putting out great videos to share with the world!&lt;/p&gt;

&lt;p&gt;If you're feeling adventurous, try enhancing the widget in Scriptable to make it your own. With a little knowledge of JavaScript, some imagination and the incredible, well put &lt;a href="https://docs.scriptable.app"&gt;together doc&lt;/a&gt;, you can improve it to really match your personal brand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj8ro62hn8ikaa4a5028v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj8ro62hn8ikaa4a5028v.png" alt="Screen shot of Michael's widget and a custom MKBHD widget" width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're looking for customizations but can't be bothered with more code, you can &lt;a href="https://michaelsoolee.com/scriptable-youtube-widget/"&gt;purchase the enhanced code&lt;/a&gt;. The code comes with easy-to-follow instructions to add a custom logo and background to your YouTube widget.&lt;/p&gt;




&lt;p&gt;Originally posted on &lt;a href="https://michaelsoolee.com/ios-scriptable-youtube-widget/"&gt;michaelsoolee.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for taking the time to read this article! If you'd like, I can send you similar articles to your email. &lt;a href="https://michaelsoolee.com/newsletter/"&gt;Click here to sign up&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>scriptable</category>
      <category>youtube</category>
    </item>
    <item>
      <title>Avoiding the awkward 2 seconds after a Zoom call looking for that end button</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Sun, 25 Oct 2020 04:21:14 +0000</pubDate>
      <link>https://forem.com/michael/avoiding-the-awkward-2-seconds-after-a-zoom-call-looking-for-that-end-button-1nfb</link>
      <guid>https://forem.com/michael/avoiding-the-awkward-2-seconds-after-a-zoom-call-looking-for-that-end-button-1nfb</guid>
      <description>&lt;p&gt;You’ve just wrapped up your meeting, you’re saying bye to your colleagues but then there’s a second or two of awkwardness as you are fumbling to hang up the Zoom call.&lt;/p&gt;

&lt;p&gt;Using &lt;a href="https://www.keyboardmaestro.com/"&gt;Keyboard Maestro on macOS&lt;/a&gt; you can set up a macro to quickly hang up your Zoom call using a single keyboard shortcut.&lt;/p&gt;

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

&lt;p&gt;If you've found this tip to be helpful, &lt;a href="https://twitter.com/michaelsoolee"&gt;tweet at me&lt;/a&gt; and let me know if I can help you with any other ways to speed up your workflow.&lt;/p&gt;

</description>
      <category>zoom</category>
      <category>remote</category>
      <category>automation</category>
      <category>video</category>
    </item>
    <item>
      <title>Changing domains for a website hosted on Netlify and how to tell Google you've moved</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Wed, 30 Sep 2020 15:35:56 +0000</pubDate>
      <link>https://forem.com/michael/changing-domains-for-a-website-hosted-on-netlify-and-how-to-tell-google-you-ve-moved-4p6k</link>
      <guid>https://forem.com/michael/changing-domains-for-a-website-hosted-on-netlify-and-how-to-tell-google-you-ve-moved-4p6k</guid>
      <description>&lt;p&gt;Cover photo by &lt;a href="https://unsplash.com/@ecees"&gt;erica steeves&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/mail?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Getting into a new home could be excited!&lt;/p&gt;

&lt;p&gt;You've scoped out the location, you've dreamed about all the experience you'll be having there and you're excited to share your new home with your family and friends.&lt;/p&gt;

&lt;p&gt;Leading up to moving day, you call to have super fast Internet set up at your new place, you pack up all your boxes---maybe even start moving some stuff over that you can manage and usually the last thing you'll do is submit a change of address form.&lt;/p&gt;

&lt;p&gt;The post office where I live makes it super easy to change your address so that mail will be forwarded from your old place to your new place. So easy, you could do it online and be done in less than 5 mins.&lt;/p&gt;

&lt;p&gt;But you aren't here to read about how to change your home address, you're here to read about how to change the domain for your website. More specifically if your site is hosted on Netlify.&lt;/p&gt;

&lt;p&gt;I wish I could tell you, the process is as easy as going to your post office's website and spending 5 minutes to fill out a form. Changing domains is not as easy, but this article should make the process less painful because I lay out all the steps involved.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Just a heads up, the domain example I used in this article is fictitious. At the time of writing this article, the domains I use aren't owned by anyone. If you go to the domain mentioned in this article I can't vouch for the contents of the domain if someone ended up buying it.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The desired results
&lt;/h2&gt;

&lt;p&gt;So let's say a couple of years back I started an online community of friends that live in North Carolina, hangs out and talks about our favorite pizza joints and pizza toppings.&lt;/p&gt;

&lt;p&gt;The pandemic of 2020 hit and with people sheltering in place and ordering their favorite pizzas in, they're finding a lot more time to share their thoughts with the community about their pizza experiences.&lt;/p&gt;

&lt;p&gt;Needless to say the site's traffic is blowing up and I'm getting requests for people outside of North Carolina who would like to join the community. But the name of the community---Your Pizza Friends of NC---and its domain---&lt;code&gt;https://yourpizzafriendsofnc.com&lt;/code&gt;---is location specific, preventing people from joining.&lt;/p&gt;

&lt;p&gt;So I hop on my favorite registrar, do a quick search for &lt;code&gt;yourpizzafriends.com&lt;/code&gt; and it is available! I quickly buy the domain, do a slight tweak to the logo but now what?&lt;/p&gt;

&lt;p&gt;So let's walk through this backwards.&lt;/p&gt;

&lt;p&gt;I know that when people go to any of these domains,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.yourpizzafriendsofnc.com
https://yourpizzafriendsofnc.com
http://www.yourpizzafriendsofnc.com
http://yourpizzafriendsofnc.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;they should be automatically redirected to the new domain &lt;code&gt;https://yourpizzafriends.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Likewise, when folks do a Google search for, "Your Pizza Friends", they should get search results for the new domain and not the old.&lt;/p&gt;

&lt;h2&gt;
  
  
  An overview of the specific infrastructure setup
&lt;/h2&gt;

&lt;p&gt;Before diving into the process of changing website domains, I wanted to list out the specific infrastructure I'll be covering in this article.&lt;/p&gt;

&lt;p&gt;Your set up might be slightly different but you should be able to take different sections and apply it to your site's specific set up.&lt;/p&gt;

&lt;p&gt;For the registrar, I'm using Hover.&lt;/p&gt;

&lt;p&gt;The Domain Name System (DNS) is managed through Amazon Route 53.&lt;/p&gt;

&lt;p&gt;For hosting, the site is hosted on Netlify.&lt;/p&gt;

&lt;p&gt;Hover points its name servers to Route 53.&lt;/p&gt;

&lt;p&gt;Route 53 then has &lt;code&gt;A&lt;/code&gt; and &lt;code&gt;CNAME&lt;/code&gt; records pointing to Netlify.&lt;/p&gt;

&lt;p&gt;Netlify hosts the site, manages SSL certificates and handles redirects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add the new domain to Netlify
&lt;/h2&gt;

&lt;p&gt;Since my site is already hosted on Netlify, I'll want to set up the new domain &lt;code&gt;yourpizzafriends.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To do this I'll navigate to my site on Netlify, then navigate to the &lt;em&gt;Settings&lt;/em&gt;, then the &lt;em&gt;Domain management&lt;/em&gt; tab.&lt;/p&gt;

&lt;p&gt;Under the heading of &lt;em&gt;Custom domains&lt;/em&gt; I'll want to add two new domain aliases; one for the bare URL---&lt;code&gt;yourpizzafriends.com&lt;/code&gt; and the other one for the &lt;code&gt;www&lt;/code&gt; subdomain of &lt;code&gt;www.yourpizzafriends.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Adding these two domain aliases, Netlify will provide details of how to point the DNS to associate the domain with your site in the form of an &lt;code&gt;A&lt;/code&gt; record and &lt;code&gt;CNAME&lt;/code&gt; record. This information could be found in a link labelled &lt;em&gt;Check DNS configuration&lt;/em&gt; after I created the new aliases. I'll want to write these two record details down for later.&lt;/p&gt;

&lt;p&gt;Since I want the primary domain to be &lt;code&gt;yourpizzafriends.com&lt;/code&gt; I'll want to select &lt;strong&gt;Set as primary domain&lt;/strong&gt; under the &lt;em&gt;Options&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now we'll hop on over to AWS Route 53 to update the DNS for the new domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up your DNS to point to your project on Netlify
&lt;/h2&gt;

&lt;p&gt;In AWS Route 53 for the new Hosted zone (domain) I'll want to add a couple of new records.&lt;/p&gt;

&lt;p&gt;The first will be for the bare domain &lt;code&gt;yourpizzafriends.com&lt;/code&gt; which will be an &lt;code&gt;A&lt;/code&gt; record.&lt;/p&gt;

&lt;p&gt;To do this, in the modal that says &lt;em&gt;Define simple record&lt;/em&gt; I'll leave the &lt;em&gt;Record name&lt;/em&gt; alone. For the &lt;em&gt;Record type&lt;/em&gt; I'll select &lt;strong&gt;A - Routes traffic to an IPv4 address and some AWS resources&lt;/strong&gt; and finally for the &lt;em&gt;Value/Route traffic to&lt;/em&gt; I'll select &lt;strong&gt;IP address or another value depending on the record type&lt;/strong&gt; and give it a value of &lt;strong&gt;104.198.14.52&lt;/strong&gt; or whatever the current Netlify load balancer IP is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3k49koqjdnqtkzpxoyjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3k49koqjdnqtkzpxoyjx.png" alt="Route 53 modal for adding new DNS record" width="800" height="784"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next will be the &lt;code&gt;www&lt;/code&gt; subdomain which will be &lt;code&gt;www.yourpizzafriends.com&lt;/code&gt; which will be a &lt;code&gt;CNAME&lt;/code&gt; record.&lt;/p&gt;

&lt;p&gt;To do this, in the same modal, this time I'll add &lt;strong&gt;www&lt;/strong&gt; in the &lt;em&gt;Record name&lt;/em&gt; field. For the &lt;em&gt;Record type&lt;/em&gt; I'll select &lt;strong&gt;CNAME - Routes traffic to another domain name and to some AWS resources&lt;/strong&gt; and the &lt;em&gt;Value/Route traffic to&lt;/em&gt; should be &lt;strong&gt;IP address or another value depending on the record type&lt;/strong&gt; and pass it the value that Netlify had provided which should be in the format of &lt;em&gt;some-unique-subdomain.netlify.app&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;With these two records in place, now we'll want to go back to Netlify to renew the SSL so that all the domains are covered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Renewing certificate so that there's SSL coverage for all domains
&lt;/h2&gt;

&lt;p&gt;Back in Netlify under the &lt;em&gt;Domain management&lt;/em&gt; tab under &lt;em&gt;Settings&lt;/em&gt;, we'll want to scroll down to the section titled, &lt;strong&gt;HTTPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this section, we'll want to renew the certification so that we'll have SSL coverage on all the domains and not just the old one.&lt;/p&gt;

&lt;p&gt;To do this, under &lt;em&gt;SSL/TLS certificate&lt;/em&gt; there should be a button that says, &lt;strong&gt;Renew certificate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This should cause a modal to pop up asking you to confirm, click on the button that also says, &lt;strong&gt;Renew certificate&lt;/strong&gt; on this modal and now in the area which indicates which domains are covered with the SSL certificate, it should indicate both the old and new certificate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up redirect rules in your project folder for Netlify
&lt;/h2&gt;

&lt;p&gt;Netlify has made setting up redirect rules super easy by setting up a file in your project's root directory.&lt;/p&gt;

&lt;p&gt;There are two ways to achieve this, either by using a &lt;code&gt;_redirects&lt;/code&gt; file or by using a &lt;a href="https://docs.netlify.com/routing/redirects/#syntax-for-the-netlify-configuration-file"&gt;&lt;em&gt;Netlify configuration file&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the this article, I chose to use the &lt;a href="https://docs.netlify.com/routing/redirects/#syntax-for-the-redirects-file"&gt;&lt;code&gt;_redirects&lt;/code&gt; file option&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In root of my project folder, I'll create a new file called &lt;code&gt;_redirects&lt;/code&gt; with no extensions.&lt;/p&gt;

&lt;p&gt;Then the contents of the files will be,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://www.yourpizzafriendsofnc.com/*   https://yourpizzafriends.com/:splat 301!
https://www.yourpizzafriendsofnc.com/*  https://yourpizzafriends.com/:splat 301!
http://yourpizzafriendsofnc.com/*       https://yourpizzafriends.com/:splat 301!
https://yourpizzafriendsofnc.com/*      https://yourpizzafriends.com/:splat 301!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we've got rules to do a &lt;a href="https://docs.netlify.com/routing/redirects/redirect-options/#http-status-codes"&gt;301 permenant redirect&lt;/a&gt; on each line. Whether the request is for a &lt;code&gt;www&lt;/code&gt; or the bare URL for &lt;code&gt;yourpizzafriendsofnc.com&lt;/code&gt; or secure &lt;code&gt;https&lt;/code&gt; or unsecure &lt;code&gt;http&lt;/code&gt;, they all will redirect to &lt;code&gt;https://yourpizzafriends.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each line is made up of three values. The first value is the domain I'm redirecting from. You'll notice that for each of the first values, I trail it with a &lt;code&gt;*&lt;/code&gt; symbol. This is referred to as a splat which tells Netlify that anything after the trailing slash should redirect to the same resource on the new domain.&lt;/p&gt;

&lt;p&gt;For the second value, it's the final destination I want to redirect to. This has the &lt;code&gt;:splat&lt;/code&gt; which is a dynamic path to help match the &lt;code&gt;*&lt;/code&gt; from the first value.&lt;/p&gt;

&lt;p&gt;For the third value, I explicitly indicate that the kind of redirect is a &lt;code&gt;301&lt;/code&gt; although a 301 is the default type. As for the exclamation mark after the 301, that's to deal with &lt;a href="https://docs.netlify.com/routing/redirects/rewrites-proxies/#shadowing"&gt;shadowing which is better explained here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you're done updating your &lt;code&gt;_redirects&lt;/code&gt; file, you'll want to commit it to source and push it up so that Netlify can do another build and set up all the redirects.&lt;/p&gt;

&lt;p&gt;Now with all my variations of the old domain pointing to the new domain, it's time to let Google know which domain is the correct domain we want traffic to show up at which is &lt;code&gt;yourpizzafriends.com&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let Google know of domain change in Search Console
&lt;/h2&gt;

&lt;p&gt;This portion assumes that you've got both domains on the Google Search Console dashboard and they have been verified with Google via the DNS.&lt;/p&gt;

&lt;p&gt;For a more detailed write up of all the things that you'll need to do before letting Google know a domain has changed and how to change it, &lt;a href="https://support.google.com/webmasters/answer/9370220?hl=en"&gt;check out this article from Google&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With both domains on Google Search Console and verified with Google, you'll want to go to the domain which you want to indicate that it has a &lt;em&gt;Change of address&lt;/em&gt;---in my case &lt;code&gt;pizzafriendsofnc.com&lt;/code&gt;. Then you'll go to &lt;em&gt;Settings&lt;/em&gt; and under the heading &lt;em&gt;Property settings&lt;/em&gt; you'll want to click on &lt;strong&gt;Change of address&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the next screen you'll see two steps, one that indicates you'll want to set up 301 redirect rules---which we've already done.&lt;/p&gt;

&lt;p&gt;The other is labelled &lt;em&gt;Update Google&lt;/em&gt; which is where we'll find a dropdown that has a list of the domains associated with our Google Search Console account. I'll select the new domain &lt;strong&gt;yourpizzafriends.com&lt;/strong&gt;, then select &lt;strong&gt;Validate &amp;amp; Update&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fav8ufv4xphh65m5i1nxp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fav8ufv4xphh65m5i1nxp.png" alt="Google Search Console screen for change of domain addresses" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Yay, you're done!
&lt;/h2&gt;

&lt;p&gt;At this point, you're done and your domain should now be pointing to the new domain. Google will do its thing and search results should show up over time as using your new domain. Even though it might show up as your old domain for a little while, no worries because you've set up the redirect rules in Netlify.&lt;/p&gt;

&lt;p&gt;As an added bonus, I saved one more section till the last. This was because this particular step isn't part of the right process for setting up domain changes with Netlify, but it was something I experimented with and learned from.&lt;/p&gt;

&lt;p&gt;I wanted to share what didn't work in hopes others will learn from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tried and didn't work with AWS S3
&lt;/h2&gt;

&lt;p&gt;Before discovering that Netlify could handle redirects, I thought I could solve the domain change problem by setting up S3 buckets to host static sites and then updating the DNS records on Route 53.&lt;/p&gt;

&lt;p&gt;I was unfortunately wrong. The issue is because, while this would fix the routing of the non-secure connections it won't handle secure connections. This is because you can't issue certificates to S3 buckets.&lt;/p&gt;

&lt;p&gt;You would however set up CloudFront---AWS' CDN solution---the complexity of setting all this up felt like too much of an overhead. For this reason, after I realized secure connections weren't being handled with this solution, I had Netlify handle everything for me and it worked out perfectly.&lt;/p&gt;




&lt;p&gt;If you found this article helpful, let me know on &lt;a href="https://mslee.link/twitter"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>netlify</category>
      <category>domains</category>
      <category>aws</category>
      <category>google</category>
    </item>
    <item>
      <title>You are a software engineer</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Mon, 21 Oct 2019 17:03:23 +0000</pubDate>
      <link>https://forem.com/michael/you-are-a-software-engineer-32k6</link>
      <guid>https://forem.com/michael/you-are-a-software-engineer-32k6</guid>
      <description>&lt;p&gt;A friend of mine is currently on the job hunt. He was sharing with me how hard it's been. I've been on the job hunt before as a software engineer and know how hard it could be. It is scary, can be demoralizing and imposter syndrome feels like it is at its peak.&lt;/p&gt;

&lt;p&gt;As a way to encourage him, I've been thinking about truths that I feel could be said to him to help uplift him. The truths about him as a software engineer.&lt;/p&gt;

&lt;p&gt;I wanted to share these truths here for him, for those who might also be in the job hunt and also for me, to serve as encouragement for someone who often battles with imposter syndrome.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are extremely smart.&lt;/p&gt;

&lt;p&gt;You create enormous value.&lt;/p&gt;

&lt;p&gt;You can solve hard problems.&lt;/p&gt;

&lt;p&gt;You understand complex things.&lt;/p&gt;

&lt;p&gt;You are patient.&lt;/p&gt;

&lt;p&gt;You deserve what you're being compensated and more. &lt;/p&gt;

&lt;p&gt;You are not a coding monkey.&lt;/p&gt;

&lt;p&gt;You make good contributions to your team.&lt;/p&gt;

&lt;p&gt;You ask great questions.&lt;/p&gt;

&lt;p&gt;You have the ability to do so much good.&lt;/p&gt;

&lt;p&gt;You are creative.&lt;/p&gt;

&lt;p&gt;You are resourceful.&lt;/p&gt;

&lt;p&gt;You know enough.&lt;/p&gt;

&lt;p&gt;You aren't defined by an interview.&lt;/p&gt;

&lt;p&gt;You don't need to understand everything.&lt;/p&gt;

&lt;p&gt;Your skills are highly desired.&lt;/p&gt;

&lt;p&gt;You're doing a great job.&lt;/p&gt;

&lt;p&gt;You are not an imposter.&lt;/p&gt;

&lt;p&gt;You are a software engineer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After I was done writing this list of truths, it reminded me of the &lt;a href="https://www.holstee.com/pages/manifesto"&gt;Holstee manifesto&lt;/a&gt;. So I fired up Figma and also put together a poster-like version as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FRcBIxlK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/mcejlo4ziwtyj9hj62ym.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FRcBIxlK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/mcejlo4ziwtyj9hj62ym.jpeg" alt="You are a software engineer poster" width="595" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>encouragement</category>
      <category>motivation</category>
      <category>engineer</category>
    </item>
    <item>
      <title>How to prevent readline in Node from exiting on line event?</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Wed, 09 Oct 2019 03:47:50 +0000</pubDate>
      <link>https://forem.com/michael/how-to-prevent-readline-in-node-from-exiting-on-line-event-42n0</link>
      <guid>https://forem.com/michael/how-to-prevent-readline-in-node-from-exiting-on-line-event-42n0</guid>
      <description>&lt;p&gt;I'm working on a command line tool using Node and I'd like to prevent it from exiting when using the &lt;code&gt;readline&lt;/code&gt; module when the user inputs the "Return" key or something that indicates a new line. I saw that &lt;a href="https://nodejs.org/api/readline.html#readline_event_line"&gt;readline has an event handler for &lt;code&gt;line&lt;/code&gt;&lt;/a&gt; but can't figure out how to prevent it from exiting. Meaning I'd like to allow for the user to be able to use the return and it adds a carriage return to the input for readline instead of exiting it.&lt;/p&gt;

&lt;p&gt;I'd like to exit readline only when the user uses &lt;code&gt;control-C&lt;/code&gt; or &lt;code&gt;control-D&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>help</category>
    </item>
    <item>
      <title>What has your developer journey looked like?</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Thu, 26 Sep 2019 14:18:04 +0000</pubDate>
      <link>https://forem.com/michael/what-has-your-developer-journey-looked-like-545o</link>
      <guid>https://forem.com/michael/what-has-your-developer-journey-looked-like-545o</guid>
      <description>&lt;p&gt;I'm curious about what has everyone's journey into being a developer and as a developer or even after has looked like. Like a choose our own adventure, I feel like a developer's journey could look very different from one person to another. In sharing I hope we could show others how they can potentially navigate their careers.&lt;/p&gt;

&lt;p&gt;You could also share what you aspire to. Perhaps you're a certain type of developer and would like to aspire to a certain role or career path.&lt;/p&gt;

&lt;p&gt;Here's a little template that could be fun to help visualize your journey for others.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Role title]
Description
|
|
[Role title]
Description
|
|
[Role title]
Description
|
-- &amp;lt;-- indicates where you'd like to go but not there yet.
|
[Future or aspirational title]
This could be where you'd like to go in your career. Could be based on a path as a developer or not.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>career</category>
    </item>
    <item>
      <title>Rails queueing system, should I use delayed_job or sidekiq?</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Mon, 23 Sep 2019 20:10:21 +0000</pubDate>
      <link>https://forem.com/michael/rails-queueing-system-should-i-use-delayedjob-or-sidekiq-239j</link>
      <guid>https://forem.com/michael/rails-queueing-system-should-i-use-delayedjob-or-sidekiq-239j</guid>
      <description>&lt;p&gt;I'm working on a message queueing system in a Rails application and trying to figure out whether to use delayed_job or sidekiq. Reading articles online it seems sidekiq is better performant for the job but wondering if for my use case if delayed_job should be considered.&lt;/p&gt;

&lt;p&gt;Basically it's a message system that will have messages that can be immediately delivered or could be scheduled for a future date. Should also be able to edit the queued message as well as delete them from the queue.&lt;/p&gt;

&lt;p&gt;This application will run on Heroku if there are any technical considerations around that choice.&lt;/p&gt;

&lt;p&gt;Considering AWS' SQS as well but thinking it'll be more overhead to go down this route.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>rails</category>
      <category>help</category>
    </item>
    <item>
      <title>What is the "&lt;&gt;" operator called in Elixir?</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Fri, 06 Sep 2019 18:02:41 +0000</pubDate>
      <link>https://forem.com/michael/what-is-the-operator-called-in-elixir-30di</link>
      <guid>https://forem.com/michael/what-is-the-operator-called-in-elixir-30di</guid>
      <description>&lt;p&gt;I'm reading over the Elixir guides and recently came across the various operators. One of which is the &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; operator used to concatenate two stings. It doesn't mention a name for the operator though. And it's my first time seeing that in any language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="s2"&gt;"Hello"&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;" World"&lt;/span&gt;
&lt;span class="s2"&gt;"Hello World"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>discuss</category>
      <category>elixir</category>
    </item>
    <item>
      <title>Why does Rails component classes start with the prefix "Action" or "Active"?</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Fri, 06 Sep 2019 18:00:24 +0000</pubDate>
      <link>https://forem.com/michael/why-does-rails-component-classes-start-with-the-prefix-action-or-active-421a</link>
      <guid>https://forem.com/michael/why-does-rails-component-classes-start-with-the-prefix-action-or-active-421a</guid>
      <description>&lt;p&gt;I've noticed this pattern and was just curious if anyone knows the story behind the "Action" or "Active" prefix to classes such as Action Mailer, Action Text or Active Record?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>rails</category>
    </item>
    <item>
      <title>Is there a way to subscribe to a series on DEV?</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Fri, 06 Sep 2019 14:00:14 +0000</pubDate>
      <link>https://forem.com/michael/is-there-a-way-to-subscribe-to-a-series-on-dev-bod</link>
      <guid>https://forem.com/michael/is-there-a-way-to-subscribe-to-a-series-on-dev-bod</guid>
      <description>&lt;p&gt;There are so many really cool series going on at DEV, I was wondering if it's possible? Would the best way to subscribe be to follow the author or is there a way to subscribe to just the series? So that we can get a notification when they publish a new post in their series?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>The best thing about my job is ___</title>
      <dc:creator>Michael Lee 🍕</dc:creator>
      <pubDate>Wed, 28 Aug 2019 03:16:42 +0000</pubDate>
      <link>https://forem.com/michael/the-best-thing-about-my-job-is--5402</link>
      <guid>https://forem.com/michael/the-best-thing-about-my-job-is--5402</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VsMCvQyA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/089u1w69d27ca3b9bx4p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VsMCvQyA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/089u1w69d27ca3b9bx4p.jpg" alt="Alt Text" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A) Unlimited LaCroix&lt;br&gt;
B) Working remotely &lt;br&gt;
C) Wearing t-shirts to work&lt;/p&gt;

&lt;p&gt;Or share your own answer.&lt;/p&gt;

</description>
      <category>justforfun</category>
      <category>discuss</category>
      <category>career</category>
      <category>fun</category>
    </item>
  </channel>
</rss>
