<?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: Ali</title>
    <description>The latest articles on Forem by Ali (@endingwithali).</description>
    <link>https://forem.com/endingwithali</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%2F73460%2Fbf407318-efb6-4642-a10e-9fdcb07d119c.jpg</url>
      <title>Forem: Ali</title>
      <link>https://forem.com/endingwithali</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/endingwithali"/>
    <language>en</language>
    <item>
      <title>How to do Subdomain URL Redirects with Vercel Hosting</title>
      <dc:creator>Ali</dc:creator>
      <pubDate>Tue, 25 Jan 2022 22:35:25 +0000</pubDate>
      <link>https://forem.com/endingwithali/how-to-do-subdomain-url-redirects-with-vercel-hosting-l92</link>
      <guid>https://forem.com/endingwithali/how-to-do-subdomain-url-redirects-with-vercel-hosting-l92</guid>
      <description>&lt;p&gt;I remember the first time my friend Ash showed me &lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt; (at the time it named Now / Zeit). I was blown away. Since then, I’ve been using it to host my personal blog and personal website - both &lt;a href="http://ali.dev"&gt;ali.dev&lt;/a&gt; domains. &lt;/p&gt;

&lt;p&gt;One of the things I’ve been meaning to do over the past year is create subdomains for quick branded forwarding to different websites. There isn’t a straightforward tutorial on how to do this, so here we go!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/IzjhI7ggjDlEnMxZMu/source.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/IzjhI7ggjDlEnMxZMu/source.gif" width="464" height="360"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  What you’ll need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vercel Account&lt;/li&gt;
&lt;li&gt;Github Account&lt;/li&gt;
&lt;li&gt;Custom Domain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tutorial assumes you’ve already purchased your custom domain, and are managing it via Vercel. If this is not the case, please check out this document on &lt;a href="https://vercel.com/docs/concepts/projects/custom-domains"&gt;custom domains on Vercel.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In this project, I will show you how I created a redirect for the subdomain, &lt;a href="//live.ali.dev"&gt;live.ali.dev&lt;/a&gt;, to my Twitch channel - &lt;a href="//twitch.tv/endingwithali"&gt;twitch.tv/endingwithali&lt;/a&gt;. I actually wrote this blogpost live on my stream, using an Oculus Rift! I've included a clip of it below.&lt;/p&gt;

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

&lt;p&gt;To write this blog post, I refered to &lt;a href="https://github.com/vercel/vercel/discussions/5622"&gt;this Github issue&lt;/a&gt; that was opened on Vercel's repo by &lt;a href="https://github.com/SeinopSys"&gt;SeinopSys&lt;/a&gt;. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a basic GitHub repo for the domain &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---e6QsDFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rg4tb4acbtclmo7tdzqe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---e6QsDFG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rg4tb4acbtclmo7tdzqe.png" alt="It's the basic page for creating a new repo on github" width="880" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VGqUZAbB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ad9qwtp9x5bfwq0k4i7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VGqUZAbB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ad9qwtp9x5bfwq0k4i7x.png" alt="it's the basic github page after a new repo has been created" width="880" height="563"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize the project locally - it won’t need much in it. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a document in the local folder called &lt;code&gt;vercel.json&lt;/code&gt; - this is the only file you will need for redirects. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gVOXRX6R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fv17eewo3g0sxao0ham.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gVOXRX6R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fv17eewo3g0sxao0ham.png" alt="terminal command line touch vercel.json" width="766" height="62"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;code&gt;vercel.json&lt;/code&gt;, add the following code:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"redirects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[https://twitch.tv/endingwithali](https://twitch.tv/endingwithali)"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This JSON object says that every-time the ‘/’ domain is visited, Vercel will redirect the visitor to the destination URL. I wanted all visitors of the page to be immediately redirected to my twitch channel hence, &lt;code&gt;"destination":"https://twitch.tv/endingwithali"&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit code to the Github&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IeFAK-eL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u4yhtdgw7oump6trbpup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IeFAK-eL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u4yhtdgw7oump6trbpup.png" alt="terminal with code being commited to a github repo" width="880" height="326"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the &lt;code&gt;vercel&lt;/code&gt; command in your terminal to create a new vercel project. Make sure it’s a new project, not linked to any pre-existing project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;vercel --prod&lt;/code&gt; to push your website live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YreZHqUt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wooppxraw1qcuz0gmllv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YreZHqUt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wooppxraw1qcuz0gmllv.png" alt="terminal showing project being deployed to vercel and to prod" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, your redirect will be live, but not have the proper domain. In the next steps, we will set up the domain. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to your Vercel Dashboard ui (online, click into the project)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KCUcu455--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ada1lb0711p5ul5j8l3b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KCUcu455--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ada1lb0711p5ul5j8l3b.png" alt="dashboard of the live ali dev project" width="880" height="166"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connect your Github repo to your project by clicking:&lt;br&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I6jHM8OS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzs8ybcaka6zn9c6e1u1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I6jHM8OS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzs8ybcaka6zn9c6e1u1.png" alt="dashboard of vercel project showing the git integrations" width="880" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are connecting the project to the Github repo, because Vercel has it such that every time a commit is made to your repo, it’ll update the website. This makes it easier to update the URL as needed. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next, click into &lt;code&gt;settings&lt;/code&gt; &amp;gt; &lt;code&gt;domains&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LO5ON8W3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vh1vqpb0lkch2x9x8kf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LO5ON8W3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vh1vqpb0lkch2x9x8kf.png" alt="dashboard showing the vercel project domains that are available" width="880" height="399"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the domain you want to redirect - for the subdomain, you can just type in the subdomain. The main domain should be maintained / controlled by the Vercel name servers. &lt;a href="https://vercel.com/guides/transferring-domains-to-vercel"&gt;Click here to learn how to set that up.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UEEq0wSM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5xsejxxdm6bihvmun4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UEEq0wSM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5xsejxxdm6bihvmun4z.png" alt="dashboard showing the successful successful setting of the domain for the vercel project" width="880" height="382"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Congrats you now have a domain redirect!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Go forth and redirect all the pages! &lt;/p&gt;


&lt;center&gt;&lt;img src="https://i.giphy.com/media/9T1LrOu1A2ipq/source.gif" width="480" height="268"&gt;&lt;/center&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;
  
  
  Bonus Video
&lt;/h2&gt;

&lt;p&gt;This was originally posted on my personal blog, &lt;a href="//blog.ali.dev"&gt;blog.ali.dev&lt;/a&gt;. If you want to watch the bonus YouTube video, &lt;a href="https://blog.ali.dev/engineering/2022/01/25/vercel-redirects/"&gt;you'll need to check it out over there ;)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>serverless</category>
      <category>hosting</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Public Speaking Class with Josh Constine</title>
      <dc:creator>Ali</dc:creator>
      <pubDate>Thu, 20 Jan 2022 18:30:00 +0000</pubDate>
      <link>https://forem.com/endingwithali/public-speaking-class-with-josh-constine-1jjo</link>
      <guid>https://forem.com/endingwithali/public-speaking-class-with-josh-constine-1jjo</guid>
      <description>&lt;p&gt;I recently had the chance to sit down in a small setting with &lt;a href="https://twitter.com/JoshConstine"&gt;Josh Constine&lt;/a&gt;, to learn about how to be a better public speaker and better moderator. I wrote notes voraciously, and wanted to share them with you:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EXVq0bGA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1642702273742/R_VjFmoOE.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EXVq0bGA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1642702273742/R_VjFmoOE.jpeg" alt="a group of gas station members listening to josh talk" width="880" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you sound slower than you think when you’re speaking, but still &lt;strong&gt;try to speak a bit slower&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;the slower you speak, the less filler words you use&lt;/li&gt;
&lt;li&gt;you sound more dignified&lt;/li&gt;
&lt;li&gt;your brain can keep up with the words you’re saying&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;use &lt;strong&gt;dynamic tone&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;emphasize words that matter&lt;/li&gt;
&lt;li&gt;take pauses at end of sentences&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;“&lt;strong&gt;finish your sentence&lt;/strong&gt;” - make sure you come to the end of your sentence&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;strong&gt;ask questions with a finite ending&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keeps speaker on edge&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;put the context at the start of the question&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Web3 is growing big... how do you get speaking gigs?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;instead of&lt;/em&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“how do you get speaking gigs? now that web3 is blowing up, there are more opportunities to find talks” &lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;&lt;strong&gt;never answer for your panelist&lt;/strong&gt; - if they don't answer right away, let them have the time / give them the space to think&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it's not on you as the moderator, to rescue the speaker&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;as a speaker, &lt;strong&gt;keep the answer hard and specific to the question&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do not dilute the speaker’s question&lt;/li&gt;
&lt;li&gt;formulating good answers take time&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;small gestures on stage are actually really distracting → try and stay motionless&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a little bit of gesture / posture change as a moderator is ok, but fidgeting is really noticeable&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;when you ask tough questions, be sure to &lt;strong&gt;ask in an empathetic tone&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;helps break down walls&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;as a panelist, have 3 points you want to keep going back to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prepare beforehand of what these three points will be - have a strategy&lt;/li&gt;
&lt;li&gt;if you don’t know the answer to a question asked, you can lead back to these 3 points&lt;/li&gt;
&lt;li&gt;3 points is easy for an audience to remember&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;if you’re being interviewed - &lt;strong&gt;prepare the interviewer with points you want to talk about&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;helps shape the direction of the conversation&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;if you need a prompt / interview helper, &lt;strong&gt;do not use your phone&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better to have an analog prompt (piece of paper, notebook, index card, etc) to help with answering question&lt;/li&gt;
&lt;/ul&gt;


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

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;interviewer pro-tip&lt;/strong&gt; - read the last few tweets of the person you’re interviewing! It will help you be relatable, also might be able to tie into the talk&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;listen to previous works / talks of the interviewee&lt;/strong&gt; → you can tie it into your questioning, and allows for deeper conversations / questions

&lt;ul&gt;
&lt;li&gt;It doesn’t have to be the whole thing, just a small snippet&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pre-write your jokes&lt;/strong&gt;, even if they’re not funny

&lt;ul&gt;
&lt;li&gt;the audience will relax because bad jokes are still good jokes&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;prep calls are counter productive

&lt;ul&gt;
&lt;li&gt;vibe doesn't carry over to the interview&lt;/li&gt;
&lt;li&gt;audience wasn’t there, so if you refer to something from the prep call, audience wont understand the context&lt;/li&gt;
&lt;li&gt;email threads &amp;gt;&amp;gt;&amp;gt;&amp;gt; phone calls &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;recommendation: have 2-3x more questions than needed

&lt;ul&gt;
&lt;li&gt;you will have flexibility and no stress of filling the time&lt;/li&gt;
&lt;li&gt;have list of questions ordered by themes

&lt;ul&gt;
&lt;li&gt;allows for organic flow of conversation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;don’t give exact questions to speakers beforehand&lt;/strong&gt; because they’ll write canned / PR friendly answers

&lt;ul&gt;
&lt;li&gt;instead give topics and subtopics you expect to touch on&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;you can get people to talk about “thorny” or hard topics by asking them three times&lt;/li&gt;
&lt;li&gt;feel free to use “critics have said ____ how do you respond” or “people on twitter have said _____, what do you think?” to ask hard/edgy questions&lt;/li&gt;
&lt;li&gt;always know your next questions → no dead time on stage as the interviewer&lt;/li&gt;
&lt;li&gt;if you have a large number of speakers

&lt;ul&gt;
&lt;li&gt;start lightening round of questions to get speakers talking / riff

&lt;ul&gt;
&lt;li&gt;this also hooks in the listeners / audience&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;later you can ask to share a little bit more about their background and to answer a question at the same time&lt;/li&gt;
&lt;li&gt;personal and biographical questions help audience relate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Give a quick 10 second intro and then answer what’s your favorite DAO right now?” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;get to the meat and potatoes of the talk in the beginning of the talk to be sure to give enough time for deep conversations and answers&lt;/li&gt;
&lt;li&gt;don’t be afraid to shut down long winded speakers

&lt;ul&gt;
&lt;li&gt;this is your duty as a moderator to the audience&lt;/li&gt;
&lt;li&gt;redirect to another person if they’re talking too much or back to a topic if they’re off topic&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;end panels with something future facing - “what's next?”&lt;/li&gt;
&lt;li&gt;do recaps - Josh likes to do recaps at the ends of talks

&lt;ul&gt;
&lt;li&gt;takes notes mid talk quickly (using analog means) to do recap for later&lt;/li&gt;
&lt;li&gt;helps keep audience’s memory fresh of what was covered&lt;/li&gt;
&lt;li&gt;very impressive skill to speaker bookers&lt;/li&gt;
&lt;li&gt;moderator or speaker, you should do this

&lt;ul&gt;
&lt;li&gt;josh literally will do this as a speaker by grabbing the mic and announcing things to recap&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;a good question ordering as a moderator

&lt;ol&gt;
&lt;li&gt;speed round&lt;/li&gt;
&lt;li&gt;personal/autobiographical question&lt;/li&gt;
&lt;li&gt;tactical question&lt;/li&gt;
&lt;li&gt;challenging question if needed&lt;/li&gt;
&lt;li&gt;future looking question &lt;/li&gt;
&lt;li&gt;recap&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;twitter spaces - talks do better with closed speaker loops and then allowing external listeners to ask questions&lt;/li&gt;
&lt;li&gt;breaking open shy speakers by giving them an easy question to start with&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Q and A:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;it took Josh 4 years to start getting paid

&lt;ul&gt;
&lt;li&gt;how bad do they need you?&lt;/li&gt;
&lt;li&gt;as a reminder, you have a lot more leverage last minute for getting paid&lt;/li&gt;
&lt;li&gt;typically you want them to throw out the first number&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;looking for gigs → you can probably get paid if a conference has paid tickets and sponsorships&lt;/li&gt;
&lt;li&gt;find your core piece of credibility - “i made this and that’s why you want me to speak”

&lt;ul&gt;
&lt;li&gt;assemble your references / sources and have them easily available for people to find&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;the hardest speakers to find right now are keynote speakers

&lt;ul&gt;
&lt;li&gt;find a topic you care about and turn it into a 20 minute presentation&lt;/li&gt;
&lt;li&gt;conferences want keynote speakers&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;when do you  feel like you have mastery / competency to talk publicly about a subject?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💪 “Fake it till you make it”&lt;/p&gt;
&lt;/blockquote&gt;


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

&lt;p&gt;how to get competency about a subject to publicly speak about it, quickly&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;get an advisor network to give advice, future insights, and to ask what are the current heated topics / debates in the field

&lt;ul&gt;
&lt;li&gt;get experts to tell you their insights&lt;/li&gt;
&lt;li&gt;read a few blog posts&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;formulate a new opinion after absorbing all this information&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;good keynotes have stats, lenses, and insights about a topic&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a really engaging discussion, and I'm excited to share these notes with you. Thank you Josh for taking time out of your busy schedule to talk to us! &lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus Video
&lt;/h2&gt;

&lt;p&gt;This was originally posted on my personal blog, &lt;a href="//blog.ali.dev"&gt;blog.ali.dev&lt;/a&gt;. If you want to watch the bonus YouTube video, &lt;a href="https://blog.ali.dev/professional/2022/01/20/public-speaking-with-josh-constine/"&gt;you'll need to check it out over there&lt;/a&gt; ;) &lt;/p&gt;

</description>
      <category>publicspeaking</category>
      <category>speaking</category>
      <category>podcast</category>
    </item>
    <item>
      <title>Explaining Kubernetes for Developers Who Know How to Code</title>
      <dc:creator>Ali</dc:creator>
      <pubDate>Fri, 14 Jan 2022 00:22:50 +0000</pubDate>
      <link>https://forem.com/endingwithali/explaining-kubernetes-for-developers-who-know-how-to-code-1473</link>
      <guid>https://forem.com/endingwithali/explaining-kubernetes-for-developers-who-know-how-to-code-1473</guid>
      <description>&lt;p&gt;You know how to program - you're in your first or second year of your first software engineering job. You've mastered the basics and are excelling at your job, but something's been bothering you. You keep hearing about this thing called Kubernetes being thrown around by another team. Kuber...netes? What does it mean?&lt;/p&gt;

&lt;p&gt;After the third or fourth time you hear it, you decide to look it up. You get what it does, but you don't really get what it does.&lt;/p&gt;

&lt;p&gt;Don't worry—I’m here to help.&lt;/p&gt;

&lt;p&gt;Before we get started, I highly recommend &lt;a href="https://newrelic.com/blog/how-to-relic/what-is-kubernetes"&gt;reading this article by fellow Relic John Withers&lt;/a&gt; - it's an excellent primer of basic colloquialisms and technical terms used when diving into the world of Kubernetes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hi, welcome to the container store.
&lt;/h2&gt;

&lt;p&gt;Most starter tutorials will explain how to deploy a basic "Hello World" server in the language of your choice. But it doesn't really do much except return an endpoint that says "Hello World.” What do you learn from that? Why is it always a web server?&lt;/p&gt;

&lt;p&gt;Let's take a step back and remember that any type of application can be containerized and deployed using Kubernetes. Even the hit game from 2002, &lt;a href="https://en.wikipedia.org/wiki/PF_Magic"&gt;Petz: Dogz 5&lt;/a&gt;, can be run using k8s.&lt;/p&gt;

&lt;p&gt;Does it actually make sense to put Petz: Dogz 5 into a container and deploy with Kubernetes? Maybe, maybe not. But say we wanted to run 10,000 instances of Petz: Dogz 5 or we wanted to access the game 10,000 times at once, all simultaneously. Then yes, using Kubernetes makes sense.&lt;/p&gt;

&lt;p&gt;But Petz: Dogz 5 doesn’t use the internet. Kubernetes must require the internet, right? Not exactly. Connectivity is a must, but things like intranet allow for connection without using actual internet, creating isolated instances. Keeping it straight forward, while you can run things on k8s that do not need internet access, you’ll need connectivity in order to access the k8s cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memenetes
&lt;/h2&gt;

&lt;p&gt;Kubernetes has been the subject of memes...a lot. Why? Because in reality, setting up Kubernetes is hard. It's confusing and it takes a long time to get right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7i7elhBd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c8tnf6b2i8vmc7xf3cia.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7i7elhBd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c8tnf6b2i8vmc7xf3cia.jpg" alt="Evil Kubernetes be like shuts down containers when needed&amp;lt;br&amp;gt;
" width="750" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, once set up and configured properly, it's a powerful tool that can save developer time and application uptimes. &lt;/p&gt;

&lt;p&gt;So when should one start using Kubernetes? And why?&lt;/p&gt;

&lt;h2&gt;
  
  
  Who? What? Where? When? Why? of Kubernetes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Who? + What?
&lt;/h3&gt;

&lt;p&gt;Technically, anyone can run anything using Kubernetes. Usually, you'll find it being utilized by DevOps teams to help scale their company's services to meet incoming demand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where?
&lt;/h3&gt;

&lt;p&gt;Kubernetes is run on a server (managing it yourself is known as “rolling your own Kubernetes”) or handled by vendor or cloud service provider as a managed Kubernetes.&lt;/p&gt;

&lt;h3&gt;
  
  
  When?
&lt;/h3&gt;

&lt;p&gt;Technically, you can start using Kubernetes on day one of building a project, but it doesn't matter when you start using it. The choice is up to the developers and the DevOps team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;The ‘why’ question is where it gets a little more interesting.&lt;/p&gt;

&lt;p&gt;Without Kubernetes, launching an application of any kind requires three different parts: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A compiled version of the code: provided by you and built in a form that can be easily run (such as binary). &lt;/li&gt;
&lt;li&gt;An operating system: this might be your computer or something you set up manually, but could also be a container or use a buildpack. &lt;/li&gt;
&lt;li&gt;A start command: The command used to execute your codes such as a binary or run statement. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Kubernetes x Docker: Best Friends Forever
&lt;/h4&gt;

&lt;p&gt;Whenever you hear Kubernetes, you're probably going to hear Docker in the same sentence. Kubernetes and Docker are like peanut butter and jelly—they're a perfect pair. Docker combines the three parts required to launch an application into one command. This makes it easier to deploy (or start) new applications through the creation of containers.&lt;/p&gt;

&lt;p&gt;Containers are a critical part of the Kubernetes metaverse because they're the smallest building block of Kubernetes orchestration. Just like how atoms are the smallest bits of matter in the universe, pods are encapsulations of containers. Pods are considered a unit of one or more containers. All the containers in a pod will be co-located on the same operating system. &lt;/p&gt;

&lt;h4&gt;
  
  
  Scale
&lt;/h4&gt;

&lt;p&gt;Kubernetes can help make scaling your application easier. It's a distributed system that can automatically spin up new pods to help balance the load of incoming requests.&lt;/p&gt;

&lt;p&gt;For example, you've just shared your side project on ProductHunt and HackerNews. As the creator, you're responsible for maintaining your side project's uptime and making sure that it works. It's starting to pick up popularity, and you see that your previous configuration is starting to max out at its ability to stay running. Did I mention that your project just blew up on Tiktok, and you've gone from 100 visits per day to over 10,000? It also just hit top of HackerNews - everyone is talking about it.&lt;/p&gt;

&lt;p&gt;With the influx of users trying out your side project, you need to scale - fast.&lt;/p&gt;

&lt;p&gt;Prior to implementing Kubernetes, you would need to go to your hosting site (either via a website for the cloud or on premises for non-cloud servers), manually provision the servers, run the containers, and set up the reverse proxies to handle incoming router traffic. With Kubernetes, this process is mostly automated. Since you were conveniently creating this side project to try to learn Kubernetes, you were prepared. To scale with the huge influx of demand, you're able to quickly update your Kubernetes config file to begin rolling out scaling changes for your side project.&lt;/p&gt;

&lt;h2&gt;
  
  
  By the way, New Relic 💙's Kubernetes
&lt;/h2&gt;

&lt;p&gt;If you've just set up your first Kubernetes cluster or are looking to understand the Kubernetes cluster you've been running, look no further. I'm a visual learner, and having a tool like New Relic is critical for helping create awesome visualizations for your clusters. Learn more about our visualization tools and sign up for &lt;a href="https://newrelic.com/signup?utm_campaign=fy22-q2-amer-obsv-event-devrel-organic&amp;amp;utm_medium=event&amp;amp;utm_source=organic&amp;amp;utm_content=organic&amp;amp;fiscal_year=fy22&amp;amp;quarter=q2&amp;amp;program=obsv&amp;amp;audience=none&amp;amp;creative=none&amp;amp;placement=none&amp;amp;targeting=none&amp;amp;ad_type=none&amp;amp;geo=amer"&gt;a free account today&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  We've done it
&lt;/h2&gt;

&lt;p&gt;As a developer, it's easy to forget to slow down, to get frustrated when learning new topics, and to gloss over asking why when one is confused. Hopefully, by reading this article, you've gained a bit more practical knowledge about Kubernetes and why you keep hearing about it everywhere you go.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nMBAS537--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://newrelic.com/sites/default/files/styles/800w/public/2021-10/glasses-dog.webp%3Fitok%3DK2jwKlKl" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nMBAS537--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://newrelic.com/sites/default/files/styles/800w/public/2021-10/glasses-dog.webp%3Fitok%3DK2jwKlKl" alt="Dog wearing glasses reading a book" width="436" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Learn more:
&lt;/h3&gt;

&lt;p&gt;Here are some excellent resources I'd recommend checking out if you're keen on learning more about Kubernetes from a highly technical angle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Utf-A4rODH8"&gt;Kubernetes from Scratch in Go by Liz Rice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nirmata.com/2018/02/07/kubernetes-for-developers-pods-part-1/"&gt;Kubernetes For Developers (A multipart series) by the team at Nirmata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=i7ABlHngi1Q"&gt;Docker for Beginners by Travis Media&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thenewstack.io/why-serverless-vs-kubernetes-isnt-a-real-debate/"&gt;Why Kubernetes vs Serverless isn't a Real Debate by David Simmons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/"&gt;Kubernetes AutoScaler (AKA How It works) from Kubernetes.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>FAANG is Over. It's a FANMAG world now. (The History of FAANG)</title>
      <dc:creator>Ali</dc:creator>
      <pubDate>Thu, 10 Jun 2021 14:59:09 +0000</pubDate>
      <link>https://forem.com/endingwithali/faang-is-over-it-s-a-fanmag-world-now-2j55</link>
      <guid>https://forem.com/endingwithali/faang-is-over-it-s-a-fanmag-world-now-2j55</guid>
      <description>&lt;p&gt;I was watching &lt;a href="//twitch.tv/cassidoo"&gt;Cassidy Williams&lt;/a&gt;' Twitch stream recently, where she was talking about FAANG companies:&lt;/p&gt;

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

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

&lt;p&gt;These clips inspired me to make this meme, which as of writing this post, is still getting lots of engagement across the Twittersphere:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1400561909754105867-654" src="https://platform.twitter.com/embed/Tweet.html?id=1400561909754105867"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1400561909754105867-654');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1400561909754105867&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;As I started to see engagement roll in, as well as sharing it across some meme channels, discussions began to breakout about FAANG, the origins of FAANG, and some people not even knowing what FAANG is. &lt;/p&gt;

&lt;p&gt;I also became curious: Why is Microsoft not included in this ubiquitous slang? &lt;/p&gt;

&lt;h2&gt;
  
  
  G
&lt;/h2&gt;

&lt;p&gt;Before giving a full definition of FAANG, a detour.&lt;/p&gt;

&lt;p&gt;Here's the google results when I search "FAANG":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bmmb26oei68x4lap8aa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bmmb26oei68x4lap8aa.png" alt="Page showing Google results for searching FAANG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait a minute.... let's enhance this....&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8dit2enmeyt991bfi68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8dit2enmeyt991bfi68.png" alt="Close up of the Google Knowledge Panel"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(Did you know this is called a Google Knowledge Panel?)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;uhh... are you seeing what I see?&lt;/p&gt;

&lt;p&gt;⚡️ENHANCE⚡️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2q93oopcupdnx6ld46l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2q93oopcupdnx6ld46l.png" alt="Text that says "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uh.... Awkward....&lt;/p&gt;
&lt;h2&gt;
  
  
  What is FAANG?
&lt;/h2&gt;

&lt;p&gt;FAANG is an acronym standing for Facebook, Amazon, Apple, Netflix, and Google (Amazon and Apple are interchangeable in order). &lt;/p&gt;

&lt;p&gt;So that picture above, says Microsoft and not Netflix.... &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.investopedia.com/terms/f/faang-stocks.asp" rel="noopener noreferrer"&gt;According to Investopedia,&lt;/a&gt; the concept of FAANG can be attributed to Jim Cramer of CNBC's Mad Money show:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The term was coined by Jim Cramer, the television host of CNBC's Mad Money, in 2013, who praised these companies for being “totally dominant in their markets”.&lt;/p&gt;
&lt;/blockquote&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%2Fi.pinimg.com%2Foriginals%2F7a%2Fb5%2Fbc%2F7ab5bcda618a7f80c5bfa2507a28f321.jpg" 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%2Fi.pinimg.com%2Foriginals%2F7a%2Fb5%2Fbc%2F7ab5bcda618a7f80c5bfa2507a28f321.jpg" alt="Jim Cramer sitting at a desk pointing to the sky"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to read more about Cramer's prediction of FANG stocks in 2013, I found &lt;a href="https://www.cnbc.com/id/100436754" rel="noopener noreferrer"&gt;an article expanding more about his / his team's thought process&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The term has been coopted by the tech community to describe its illustrious companies - the largest, most renowned companies that represent the industry across the globe in every trade.  &lt;/p&gt;
&lt;h2&gt;
  
  
  Why isn't Microsoft part of FAANG?
&lt;/h2&gt;

&lt;p&gt;Big Tech... is BIG. If you ask someone in the Bay Area what are the big tech companies they'll probably say "Google, Amazon, Apple, Microsoft, and Facebook".... Yet, the term FAANG is still used to quickly refer to the biggest tech companies in the world. &lt;/p&gt;

&lt;p&gt;Asking the original question: Why wasn't Microsoft originally included in the acronym?&lt;/p&gt;

&lt;p&gt;Mad Money is a talk show on CNBC dedicated to help to give stock advice to the average person - someone who doesn't have the wealth to invest in hedge funds, access to financial advisors, etc. As a show, Mad Money aims to democratize stock investing. In such context, Cramer brought up the concept of FANG as a series of stocks to explore if you're interested in investing in the technology sector. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/AgHBbekqDik0g/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/AgHBbekqDik0g/giphy.gif" alt="Man being interviewed saying "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the time of the recommendation, Microsoft was still under the leadership of the infamous Steve Ballmer - the successor to Bill Gates, and early employee of the Microsoft. Microsoft did a great job growing with Ballmer as chief dog at Microsoft, but they definitely missed trends with outstanding strike outs. &lt;/p&gt;

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

&lt;p&gt;Things weren't looking good at Microsoft, from a trend perspective, and stock experts at Mad Money probably were not keen on its continued success and excluded it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22ex8hl5ufozlw8c9i00.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F22ex8hl5ufozlw8c9i00.jpg" alt="Chart showing Microsoft, Google, Facebook, Netflix, Apple, and Amazon stock prices over time between April 2012 and June 2014"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Chart showing Microsoft, Google, Facebook, Netflix, Apple, and Amazon stock prices over time between April 2012 and June 2014&lt;/em&gt; &lt;br&gt;
&lt;a href="https://finance.yahoo.com/chart/FB#eyJpbnRlcnZhbCI6IndlZWsiLCJwZXJpb2RpY2l0eSI6MSwidGltZVVuaXQiOm51bGwsImNhbmRsZVdpZHRoIjoxOS41MTMyNzQzMzYyODMxODUsImZsaXBwZWQiOmZhbHNlLCJ2b2x1bWVVbmRlcmxheSI6dHJ1ZSwiYWRqIjp0cnVlLCJjcm9zc2hhaXIiOnRydWUsImNoYXJ0VHlwZSI6ImxpbmUiLCJleHRlbmRlZCI6ZmFsc2UsIm1hcmtldFNlc3Npb25zIjp7fSwiYWdncmVnYXRpb25UeXBlIjoib2hsYyIsImNoYXJ0U2NhbGUiOiJwZXJjZW50Iiwic3R1ZGllcyI6eyLigIx2b2wgdW5kcuKAjCI6eyJ0eXBlIjoidm9sIHVuZHIiLCJpbnB1dHMiOnsiaWQiOiLigIx2b2wgdW5kcuKAjCIsImRpc3BsYXkiOiLigIx2b2wgdW5kcuKAjCJ9LCJvdXRwdXRzIjp7IlVwIFZvbHVtZSI6IiMwMGIwNjEiLCJEb3duIFZvbHVtZSI6IiNmZjMzM2EifSwicGFuZWwiOiJjaGFydCIsInBhcmFtZXRlcnMiOnsid2lkdGhGYWN0b3IiOjAuNDUsImNoYXJ0TmFtZSI6ImNoYXJ0In19fSwicGFuZWxzIjp7ImNoYXJ0Ijp7InBlcmNlbnQiOjEsImRpc3BsYXkiOiJGQiIsImNoYXJ0TmFtZSI6ImNoYXJ0IiwiaW5kZXgiOjAsInlBeGlzIjp7Im5hbWUiOiJjaGFydCIsInBvc2l0aW9uIjpudWxsfSwieWF4aXNMSFMiOltdLCJ5YXhpc1JIUyI6WyJjaGFydCIsIuKAjHZvbCB1bmRy4oCMIl19fSwibGluZVdpZHRoIjoyLCJzdHJpcGVkQmFja2dyb3VuZCI6dHJ1ZSwiZXZlbnRzIjp0cnVlLCJjb2xvciI6IiMwMDgxZjIiLCJzdHJpcGVkQmFja2dyb3VkIjp0cnVlLCJldmVudE1hcCI6eyJjb3Jwb3JhdGUiOnsiZGl2cyI6dHJ1ZSwic3BsaXRzIjp0cnVlfSwic2lnRGV2Ijp7fX0sInN5bWJvbHMiOlt7InN5bWJvbCI6IkZCIiwic3ltYm9sT2JqZWN0Ijp7InN5bWJvbCI6IkZCIiwicXVvdGVUeXBlIjoiRVFVSVRZIiwiZXhjaGFuZ2VUaW1lWm9uZSI6IkFtZXJpY2EvTmV3X1lvcmsifSwicGVyaW9kaWNpdHkiOjEsImludGVydmFsIjoid2VlayIsInRpbWVVbml0IjpudWxsfSx7InN5bWJvbCI6IkdPT0ciLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiR09PRyJ9LCJwZXJpb2RpY2l0eSI6MSwiaW50ZXJ2YWwiOiJ3ZWVrIiwidGltZVVuaXQiOm51bGwsImlkIjoiR09PRyIsInBhcmFtZXRlcnMiOnsiY29sb3IiOiIjNzJkM2ZmIiwid2lkdGgiOjIsImlzQ29tcGFyaXNvbiI6dHJ1ZSwic2hhcmVZQXhpcyI6dHJ1ZSwiY2hhcnROYW1lIjoiY2hhcnQiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiR09PRyJ9LCJwYW5lbCI6ImNoYXJ0IiwiZmlsbEdhcHMiOmZhbHNlLCJhY3Rpb24iOiJhZGQtc2VyaWVzIiwic3ltYm9sIjoiR09PRyIsImdhcERpc3BsYXlTdHlsZSI6InRyYW5zcGFyZW50IiwibmFtZSI6IkdPT0ciLCJvdmVyQ2hhcnQiOnRydWUsInVzZUNoYXJ0TGVnZW5kIjp0cnVlLCJoZWlnaHRQZXJjZW50YWdlIjowLjcsIm9wYWNpdHkiOjEsImhpZ2hsaWdodGFibGUiOnRydWUsInR5cGUiOiJsaW5lIiwic3R5bGUiOiJzdHhfbGluZV9jaGFydCIsImhpZ2hsaWdodCI6ZmFsc2V9fSx7InN5bWJvbCI6Ik1TRlQiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiTVNGVCJ9LCJwZXJpb2RpY2l0eSI6MSwiaW50ZXJ2YWwiOiJ3ZWVrIiwidGltZVVuaXQiOm51bGwsImlkIjoiTVNGVCIsInBhcmFtZXRlcnMiOnsiY29sb3IiOiIjYWQ2ZWZmIiwid2lkdGgiOjIsImlzQ29tcGFyaXNvbiI6dHJ1ZSwic2hhcmVZQXhpcyI6dHJ1ZSwiY2hhcnROYW1lIjoiY2hhcnQiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiTVNGVCJ9LCJwYW5lbCI6ImNoYXJ0IiwiZmlsbEdhcHMiOmZhbHNlLCJhY3Rpb24iOiJhZGQtc2VyaWVzIiwic3ltYm9sIjoiTVNGVCIsImdhcERpc3BsYXlTdHlsZSI6InRyYW5zcGFyZW50IiwibmFtZSI6Ik1TRlQiLCJvdmVyQ2hhcnQiOnRydWUsInVzZUNoYXJ0TGVnZW5kIjp0cnVlLCJoZWlnaHRQZXJjZW50YWdlIjowLjcsIm9wYWNpdHkiOjEsImhpZ2hsaWdodGFibGUiOnRydWUsInR5cGUiOiJsaW5lIiwic3R5bGUiOiJzdHhfbGluZV9jaGFydCIsImhpZ2hsaWdodCI6ZmFsc2V9fSx7InN5bWJvbCI6IkFNWk4iLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiQU1aTiJ9LCJwZXJpb2RpY2l0eSI6MSwiaW50ZXJ2YWwiOiJ3ZWVrIiwidGltZVVuaXQiOm51bGwsImlkIjoiQU1aTiIsInBhcmFtZXRlcnMiOnsiY29sb3IiOiIjZmY4MGM1Iiwid2lkdGgiOjIsImlzQ29tcGFyaXNvbiI6dHJ1ZSwic2hhcmVZQXhpcyI6dHJ1ZSwiY2hhcnROYW1lIjoiY2hhcnQiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiQU1aTiJ9LCJwYW5lbCI6ImNoYXJ0IiwiZmlsbEdhcHMiOmZhbHNlLCJhY3Rpb24iOiJhZGQtc2VyaWVzIiwic3ltYm9sIjoiQU1aTiIsImdhcERpc3BsYXlTdHlsZSI6InRyYW5zcGFyZW50IiwibmFtZSI6IkFNWk4iLCJvdmVyQ2hhcnQiOnRydWUsInVzZUNoYXJ0TGVnZW5kIjp0cnVlLCJoZWlnaHRQZXJjZW50YWdlIjowLjcsIm9wYWNpdHkiOjEsImhpZ2hsaWdodGFibGUiOnRydWUsInR5cGUiOiJsaW5lIiwic3R5bGUiOiJzdHhfbGluZV9jaGFydCIsImhpZ2hsaWdodCI6ZmFsc2V9fSx7InN5bWJvbCI6IkFBUEwiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiQUFQTCJ9LCJwZXJpb2RpY2l0eSI6MSwiaW50ZXJ2YWwiOiJ3ZWVrIiwidGltZVVuaXQiOm51bGwsImlkIjoiQUFQTCIsInBhcmFtZXRlcnMiOnsiY29sb3IiOiIjZmZiZDc0Iiwid2lkdGgiOjIsImlzQ29tcGFyaXNvbiI6dHJ1ZSwic2hhcmVZQXhpcyI6dHJ1ZSwiY2hhcnROYW1lIjoiY2hhcnQiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiQUFQTCJ9LCJwYW5lbCI6ImNoYXJ0IiwiZmlsbEdhcHMiOmZhbHNlLCJhY3Rpb24iOiJhZGQtc2VyaWVzIiwic3ltYm9sIjoiQUFQTCIsImdhcERpc3BsYXlTdHlsZSI6InRyYW5zcGFyZW50IiwibmFtZSI6IkFBUEwiLCJvdmVyQ2hhcnQiOnRydWUsInVzZUNoYXJ0TGVnZW5kIjp0cnVlLCJoZWlnaHRQZXJjZW50YWdlIjowLjcsIm9wYWNpdHkiOjEsImhpZ2hsaWdodGFibGUiOnRydWUsInR5cGUiOiJsaW5lIiwic3R5bGUiOiJzdHhfbGluZV9jaGFydCIsImhpZ2hsaWdodCI6ZmFsc2V9fSx7InN5bWJvbCI6Ik5GTFgiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiTkZMWCJ9LCJwZXJpb2RpY2l0eSI6MSwiaW50ZXJ2YWwiOiJ3ZWVrIiwidGltZVVuaXQiOm51bGwsImlkIjoiTkZMWCIsInBhcmFtZXRlcnMiOnsiY29sb3IiOiIjZmZlNzg2Iiwid2lkdGgiOjIsImlzQ29tcGFyaXNvbiI6dHJ1ZSwic2hhcmVZQXhpcyI6dHJ1ZSwiY2hhcnROYW1lIjoiY2hhcnQiLCJzeW1ib2xPYmplY3QiOnsic3ltYm9sIjoiTkZMWCJ9LCJwYW5lbCI6ImNoYXJ0IiwiZmlsbEdhcHMiOmZhbHNlLCJhY3Rpb24iOiJhZGQtc2VyaWVzIiwic3ltYm9sIjoiTkZMWCIsImdhcERpc3BsYXlTdHlsZSI6InRyYW5zcGFyZW50IiwibmFtZSI6Ik5GTFgiLCJvdmVyQ2hhcnQiOnRydWUsInVzZUNoYXJ0TGVnZW5kIjp0cnVlLCJoZWlnaHRQZXJjZW50YWdlIjowLjcsIm9wYWNpdHkiOjEsImhpZ2hsaWdodGFibGUiOnRydWUsInR5cGUiOiJsaW5lIiwic3R5bGUiOiJzdHhfbGluZV9jaGFydCIsImhpZ2hsaWdodCI6ZmFsc2V9fV0sImN1c3RvbVJhbmdlIjp7InN0YXJ0IjoxMzMzOTQ0MDAwMDAwLCJlbmQiOjE0MDE2ODE2MDAwMDB9LCJyYW5nZSI6eyJkdExlZnQiOiIyMDEyLTA0LTA3VDA0OjAwOjAwLjAwMFoiLCJkdFJpZ2h0IjoiMjAxNC0wNi0wOFQwMzo1OTowMC4wMDBaIiwicGVyaW9kaWNpdHkiOnsiaW50ZXJ2YWwiOiJ3ZWVrIiwicGVyaW9kIjoxfSwicGFkZGluZyI6MH19" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Can FAANG Change?
&lt;/h2&gt;

&lt;p&gt;If we look back to Investopedia we learn something important&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Originally, the term FANG was used, with Apple—the second “A” in the acronym—added in 2017.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;!&lt;/p&gt;

&lt;p&gt;Apple wasn't even added until 2017. &lt;/p&gt;

&lt;p&gt;Facebook, Amazon, Netflix, Google became the FAANG we know today. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgs1t0zz1i2f2leovlek6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgs1t0zz1i2f2leovlek6.png" alt="Graph showing an increasing Google Trend of the term FAANG"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://trends.google.com/trends/explore?date=today%205-y&amp;amp;geo=US&amp;amp;q=FAANG" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over time, FAANG grew to no longer describe the noted companies in stock, but the noted companies in reputation and success. It has become so colloquial - so much so that I've noticed that many in people who work tech don't know the origin of FAANG - only that it represents major tech companies. &lt;/p&gt;

&lt;p&gt;The term has been coopted by the tech community to describe the illustrious companies in the tech industry - the largest, most omnipotent companies that represent the tech industry across the globe in every industry.  &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%2Fmedia.wired.com%2Fphotos%2F5a7017613e69512c8c6fe83f%2F2%3A1%2Fw_1920%2Ch_960%2Cc_limit%2Fwired_silicon-valley-opens-1-3-6.jpg" 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%2Fmedia.wired.com%2Fphotos%2F5a7017613e69512c8c6fe83f%2F2%3A1%2Fw_1920%2Ch_960%2Cc_limit%2Fwired_silicon-valley-opens-1-3-6.jpg" alt="Pixel art image of buildings showing prominent Silicon Valley companies and the text Silicon Valley "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So why can't we make a term that better portrays a more accurate collective opinion of the tech industry?&lt;/p&gt;

&lt;p&gt;At this point, using FAANG to describe just the official names of the abbreviated companies isn't even right - in 2015 the larger Google company renamed itself to Alphabet. &lt;/p&gt;
&lt;h2&gt;
  
  
  FAANG and FANMAG
&lt;/h2&gt;

&lt;p&gt;FAANG is a stock term - it's not reflective of the reputation, size, etc. of the modern tech industry. That's why we should use a term like FANMAG . &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;F&lt;/strong&gt; acebook&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt; mazon&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;N&lt;/strong&gt; etflix&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;M&lt;/strong&gt; icrosoft&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A&lt;/strong&gt; pple&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;G&lt;/strong&gt; oogle&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%2Fi.imgflip.com%2F5cfihj.jpg" 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%2Fi.imgflip.com%2F5cfihj.jpg" alt="Man looking back at text overlaid on woman that says FANMAG, while holding hands with a woman who has text overlaid that says FAANG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, in case you were curious about the FAANG stock concept now, Cramer has come out in &lt;a href="https://www.cnbc.com/2019/10/03/cramer-we-gotta-get-netflix-the-hell-out-of-faang.html" rel="noopener noreferrer"&gt;support of changing the abbreviation&lt;/a&gt; - remove Netflix, add Microsoft. &lt;/p&gt;
&lt;h1&gt;
  
  
  What do you think of FANMAG? Will you use the FANMAG acronym?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.urbandictionary.com/define.php?term=inb4" rel="noopener noreferrer"&gt;INB4&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgz50p4rerewp3z1hncfj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgz50p4rerewp3z1hncfj.gif" alt="Regina George saying. "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  PS - Netflix?
&lt;/h2&gt;

&lt;p&gt;I'll say it - reputation wise, Netflix flys quite under the radar in the tech industry compared to the other companies of the FANMAG abbreviation. So, why should it be included? &lt;/p&gt;

&lt;p&gt;What Netflix lacks in company clout, it makes up for in global usage. In 2018, &lt;a href="http://sandvine.com/hubfs/downloads/phenomena/2018-phenomena-report.pdf" rel="noopener noreferrer"&gt;Sandvine estimated&lt;/a&gt; that  Netflix accounts for 15% of global internet bandwidth and the top application of global internet traffic. Its prevalence in the modern consumer society is undeniable, and a valid argument for defending its continued existence in the FANMAG abbreviation.&lt;/p&gt;

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

&lt;p&gt;(header adapted from &lt;a href="https://www.alpha-sense.com/blog/faang-stocks-q2-2020/" rel="noopener noreferrer"&gt;AlphaSense&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;PPS - I stream on Twitch. &lt;a href="//twitch.tv/endingwithali"&gt;Come be my friend ♡&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>How do web servers work?</title>
      <dc:creator>Ali</dc:creator>
      <pubDate>Wed, 02 Jun 2021 16:35:08 +0000</pubDate>
      <link>https://forem.com/endingwithali/how-do-web-servers-work-54ci</link>
      <guid>https://forem.com/endingwithali/how-do-web-servers-work-54ci</guid>
      <description>&lt;p&gt;Web Servers &lt;/p&gt;

&lt;p&gt;They're mystical things... You just, initialize one for your project, and it handles the rest. But what is actually going on under the hood? &lt;/p&gt;

&lt;p&gt;I got curious, so I asked my friend &lt;a href="https://twitter.com/jfkingsley" rel="noopener noreferrer"&gt;Jonathan Kingsley&lt;/a&gt; if he knew about 'em. Turns out he's the kind of guy who read the &lt;a href="https://tools.ietf.org/html/rfc2616" rel="noopener noreferrer"&gt;HTTP paper&lt;/a&gt; for fun, so we took to my stream and worked through building our own web server in Go.&lt;/p&gt;

&lt;p&gt;Did I mention that the server is Mickey Mouse themed?&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%2Fi.kym-cdn.com%2Fphotos%2Fimages%2Foriginal%2F001%2F264%2F842%2F220.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%2Fi.kym-cdn.com%2Fphotos%2Fimages%2Foriginal%2F001%2F264%2F842%2F220.png" title="It actually doesn't use the theme at all whoops" alt="Mickey Mouse whispering "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  HTTP
&lt;/h1&gt;

&lt;p&gt;HTTP stands for "Hypertext Transfer Protocol"  - it was created as a part of the World Wide Web project in the early 90s.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tim Berners-Lee, a British scientist, invented the World Wide Web (WWW) in 1989, while working at CERN. The web was originally conceived and developed to meet the demand for automated information-sharing between scientists in universities and institutes around the world. - &lt;a href="https://home.cern/science/computing/birth-web" rel="noopener noreferrer"&gt;CERN&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This project has become the basis of how the internet works - it outlines the expectations of how to communicate data and information between servers. Your computer knows how to interpret websites because of the work of the World Wide Web project&lt;/p&gt;


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


&lt;h1&gt;
  
  
  What did we make?
&lt;/h1&gt;

&lt;p&gt;We decided to make two iterations of a "from scratch" web server - the first one, outlined in this blog post, handles get requests to endpoints that are hard coded. In another blog post, I'll walk through how we built a web server that can handle more dynamically implemented endpoints. &lt;/p&gt;

&lt;h1&gt;
  
  
  How does the server work?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Main
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Listening
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/4HkkcZv2r5yCkkBDid/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/4HkkcZv2r5yCkkBDid/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the basic level, a web server &lt;a href="https://golang.org/pkg/net/#Listen" rel="noopener noreferrer"&gt;listens&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;port&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;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;":1928"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We create a &lt;a href="https://golang.org/pkg/net/#Listener" rel="noopener noreferrer"&gt;Listener&lt;/a&gt; object, &lt;code&gt;port&lt;/code&gt;, that listens to a specific traffic port/communication endpoint for incoming requests of a specific &lt;a href="https://www.w3schools.in/types-of-network-protocols-and-their-uses/" rel="noopener noreferrer"&gt;network protocol&lt;/a&gt;. This line of code basically starts the server - you can now receive incoming requests. In this example, we are expecting TCP style requests on port 1928. (Mickey Mouse was created in 1928, therefore we chose to listen to port 1928!)&lt;/p&gt;

&lt;p&gt;Great! We're done! Right?&lt;/p&gt;

&lt;p&gt;Not exactly....&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/8TT8VjZTZGWQw/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8TT8VjZTZGWQw/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can now receive requests, but how do we handle and read them, and how do we send back responses? &lt;/p&gt;

&lt;h3&gt;
  
  
  Accepting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;conn&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;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One of the &lt;a href="https://en.wikipedia.org/wiki/Generic_function" rel="noopener noreferrer"&gt;generic functions&lt;/a&gt; that &lt;code&gt;port&lt;/code&gt; has implemented is the &lt;code&gt;Accept()&lt;/code&gt; function. &lt;a href="https://golang.org/pkg/net/#TCPListener.Accept" rel="noopener noreferrer"&gt;Accept&lt;/a&gt; stalls/blocks until a new incoming request is seen by &lt;code&gt;port&lt;/code&gt; - the incoming connection is returned as a &lt;a href="https://golang.org/pkg/net/#Conn" rel="noopener noreferrer"&gt;Conn&lt;/a&gt; object. While the server is running, this function should be continually occurring - meaning that in code it is placed in an infinite &lt;code&gt;for loop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, you read that right - a time where an infinite loop is encouraged! &lt;/p&gt;

&lt;h3&gt;
  
  
  Handling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;handleConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We create a new custom function, called &lt;code&gt;handleConnection&lt;/code&gt; - this function is where we actually start going through, interpreting, and reading the data from the incoming connection. Each time there is an incoming connection from another client (aka any external connection since we are the server), we accept it and spin off a new handleConnection to deal with that client.&lt;/p&gt;

&lt;p&gt;We use the keyword &lt;code&gt;go&lt;/code&gt; to spin off &lt;a href="https://golangbot.com/goroutines/" rel="noopener noreferrer"&gt;goroutines&lt;/a&gt;, which enables &lt;a href="https://stackoverflow.com/questions/34680985/what-is-the-difference-between-asynchronous-programming-and-multithreading/34681101" rel="noopener noreferrer"&gt;multithreading asynchronisity&lt;/a&gt; for the server. If we didn't use &lt;a href="http://qvault.io/rust/concurrency-in-rust-can-it-stack-up-against-gos-goroutines" rel="noopener noreferrer"&gt;goroutines&lt;/a&gt; to enable concurrency, incoming requests that block will block everything on that thread, so you won't be able to serve as many incoming requests.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Code for main function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&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;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;"Goofy: hyuck - booting up!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;port&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;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;":1928"&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;//failed to set up server&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;"Mickey: Oh no Goofy! It looks like there was an error starting up the server! "&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="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="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;conn&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;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Accept&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;//client failed to connect with server&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="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="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;handleConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&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;"Welcome to the Mickey Mouse Web House!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://i.giphy.com/media/Qgeg0wsKtgMjm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Qgeg0wsKtgMjm/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Printing Twice&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;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;"Welcome to the Mickey Mouse Web House!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run the code above, this print may occur twice. When browsers execute a request from a server, they execute separate requests for both the &lt;code&gt;favicon&lt;/code&gt; of the page, and the contents of the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  handleConnection()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Anatomy of an HTTP Request Message
&lt;/h3&gt;

&lt;p&gt;According to the specifications of HTTP, there's required information that must be passed in a specific order in order to be properly digested by the receiving side.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nt"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;1\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="nt"&gt;Content-Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;text&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;plain&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;UTF-8&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="nt"&gt;Content-Length&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;length&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="nt"&gt;Hello&lt;/span&gt; &lt;span class="nt"&gt;World&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: each one of these lines end with &lt;code&gt;\r\n&lt;/code&gt; - when you're reading the incoming request, this allows the buffer to know where each line of the protocol ends. Basically, it helps separate new lines.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;GET&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nt"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;1\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can take this at face value. It tells the server the type of request incoming, the request target (the endpoint trying to be reached), and the HTTP version. &lt;/p&gt;

&lt;p&gt;If you want to read more about the anatomy of HTTP Messages, check out &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt; by the team at Mozilla.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👋 I want to point out Content-Type header - up until I started working on this project, it didn't hit home as to why setting and checking &lt;code&gt;Content-Type&lt;/code&gt; in HTTP requests was important. But now, I understand that each HTTP header acts almost like a basic if-else check point. Without setting the &lt;code&gt;Content-Type&lt;/code&gt; specifically, the interpreting server won't know what to do or how to process the contents of the request. Processing each kind of request is basically hard coded. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/X6QiVJjZWROHlTdiWX/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/X6QiVJjZWROHlTdiWX/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, always check your &lt;code&gt;Content-Type&lt;/code&gt; header if you're sending a request, and if you're processing/receiving a request, be sure to specify the expected &lt;code&gt;Content-Type&lt;/code&gt; in your documentation to reduce frustration on both ends! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Anatomy of an HTTP Response Message
&lt;/h3&gt;

&lt;p&gt;This is what an HTTP response message is expected to look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;200&lt;/span&gt; &lt;span class="nt"&gt;OK&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="nt"&gt;Content-Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;text&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;plain&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;UTF-8&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="nt"&gt;Content-Length&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;length&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="nt"&gt;Hello&lt;/span&gt; &lt;span class="nt"&gt;World&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break it down. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/cFSbwZr4i0hVe/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/cFSbwZr4i0hVe/giphy.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="err"&gt;200&lt;/span&gt; &lt;span class="nt"&gt;OK&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This line tells us what version of HTTP we are using, the status code, and the text associated with the status code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;Content-Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;text&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;plain&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;UTF-8&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This header tells the receiving client the type of incoming content so it knows how to handle it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;Content-Length&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;length&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;r&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value for content length is important, because it helps the receiving side know when the receiving message has been delivered in its entirety. It ends with  double &lt;code&gt;\r\n&lt;/code&gt; - the second one is a blank line used by request processors to note the start of the message body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;Hello&lt;/span&gt; &lt;span class="nt"&gt;World&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nt"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the message body! &lt;/p&gt;

&lt;h3&gt;
  
  
  Reading incoming requests
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/2sM0zOTQ2tjKo/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/2sM0zOTQ2tjKo/giphy.gif"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;request&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;bufio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We read the information from the incoming requests using a &lt;a href="https://golang.org/pkg/bufio/" rel="noopener noreferrer"&gt;bufio&lt;/a&gt; object based on the incoming connection.  To keep the server as simple as possible, we're not even going to check what kind of &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods" rel="noopener noreferrer"&gt;request&lt;/a&gt; is coming in, only what endpoint is being requested. This allows us to only have to read the first line of the incoming HTTP request - we don't care what the rest of the request says.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;requestParts&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&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 split the incoming request into parts and check...&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;if&lt;/span&gt; &lt;span class="n"&gt;requestParts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"/clubhouse"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which endpoint is being requested. For this server, we're only accepting one endpoint: &lt;code&gt;clubhouse&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"if goofy has a dog, and goofy is a dog....????"&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HTTP/1.1 200 OK&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type: text/plain; charset=UTF-8&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Length: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"&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="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To send a response, we use the &lt;code&gt;Write&lt;/code&gt; function of the &lt;a href="https://golang.org/pkg/net/#Conn" rel="noopener noreferrer"&gt;connection object&lt;/a&gt; - but before we do that, we need to send our required headers (as outlined above and in the hypertext transfer protocol). &lt;/p&gt;

&lt;p&gt;If the incoming request is not looking for &lt;code&gt;/clubhouse&lt;/code&gt;, then we send back a 404 error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HTTP/1.1 404 Not Found&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type: text/plain; charset=UTF-8&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Length: 0&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final thing that happens before we finish the method is that we must close the connection&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;defer&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In reality, this was the first thing we did in our &lt;code&gt;handleConnection&lt;/code&gt; function - If you're new to Go, &lt;code&gt;defer&lt;/code&gt; is a keyword utilized to describe a function that should be executed when the main function completes, no matter where it ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code for handleConnection()
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handleConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conn&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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;request&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;bufio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\n'&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;Println&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;requestParts&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&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;requestParts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"/clubhouse"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"If Goofy has a dog, and Goofy is a dog....????"&lt;/span&gt;

        &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HTTP/1.1 200 OK&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type: text/plain; charset=UTF-8&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Length: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;strconv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Itoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"&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="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"HTTP/1.1 404 Not Found&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type: text/plain; charset=UTF-8&lt;/span&gt;&lt;span class="se"&gt;\r\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;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Length: 0&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;a href="https://github.com/endingwithali/mickeymousewebhouse/blob/main/hardcoded/main.go" rel="noopener noreferrer"&gt;Final code on Github.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Serving Endpoints
&lt;/h1&gt;

&lt;p&gt;I was surprised to learn that servers essentially just reading and parsing string. After years of working with them, I genuinely thought servers were way more complicated and that a simple example like this would be much more complex. &lt;/p&gt;

&lt;p&gt;Right now, our server can only handle one endpoint &lt;code&gt;/clubhouse&lt;/code&gt; - which has a hardcoded response. What about dynamically implemented endpoints? Ones that are not defined directly in the server code - don't worry we've got that too. Blog post coming soon.&lt;/p&gt;

&lt;p&gt;BTW, if you're curious if New Relic works with servers... yes it does. &lt;a href="https://newrelic.com/products/infrastructure" rel="noopener noreferrer"&gt;Click here to learn more&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href="https://twitter.com/jfkingsley" rel="noopener noreferrer"&gt;Jonathan Kingsley&lt;/a&gt; for working on this project with me! Having a mentor to help walk me through this process and has made it very digestible! I am very grateful! &lt;/p&gt;

&lt;p&gt;Wish you could have seen this learning live? I stream coding and other fun tech things on Twitch almost every day. &lt;a href="//twitch.tv/endingwithali"&gt;Come hang out!&lt;/a&gt; See y'all soon!&lt;br&gt;
&lt;a href="https://i.giphy.com/media/JDTsqJhvLOq9G/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/JDTsqJhvLOq9G/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mickey Mouse
&lt;/h3&gt;

&lt;p&gt;Yeah... while this doesn't use Mickey Mouse for any kind of analogy, I've been working on my Mickey Mouse impression and the entire time Jonathan and I streamed this project, I kept doing my impression, hence the use of Mickey Mouse.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>servers</category>
      <category>beginners</category>
      <category>development</category>
    </item>
  </channel>
</rss>
