<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yunicorn.log</title>
    <description>The latest articles on DEV Community by yunicorn.log (@yunicorn).</description>
    <link>https://dev.to/yunicorn</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%2F324617%2F32ef884c-8c83-4927-b924-bc6915ab39c2.png</url>
      <title>DEV Community: yunicorn.log</title>
      <link>https://dev.to/yunicorn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yunicorn"/>
    <language>en</language>
    <item>
      <title>Crash Course for Building Your First Bot on Microsoft Teams </title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sat, 06 Feb 2021 05:59:34 +0000</pubDate>
      <link>https://dev.to/yunicorn/crash-course-for-building-your-own-bot-on-microsoft-teams-49a7</link>
      <guid>https://dev.to/yunicorn/crash-course-for-building-your-own-bot-on-microsoft-teams-49a7</guid>
      <description>&lt;p&gt;(Click here for &lt;a href="https://velog.io/@yunicorn/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%86%8C%ED%94%84%ED%8A%B8-%ED%8C%80%EC%A6%88-%EB%B4%87-%EB%A7%8C%EB%93%A4%EA%B8%B0-101" rel="noopener noreferrer"&gt;Korean Version&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Have you ever heard of Microsoft Teams? &lt;/p&gt;

&lt;p&gt;Nowadays, a lot of businesses and schools use Microsoft Teams to support communication and collaboration within their organization. But what is it? &lt;/p&gt;

&lt;h2&gt;
  
  
  What is Microsoft Teams?
&lt;/h2&gt;

&lt;p&gt;Microsoft Teams is a chat-based collaboration platform where you can use many useful tools for collaboration with other people. It has rich features in document sharing, communication, and online meetings. &lt;/p&gt;

&lt;p&gt;Microsoft Teams itself provides these features and it also provides APIs to support other third-party applications integrated into the platform to make the collaboration experience better. These apps can have a set of capabilities that Microsoft Teams Platform allows: Tabs, Bots, Message Extensions, and Connectors. &lt;/p&gt;

&lt;p&gt;Each app can have a subset of these capabilities or just a single capability. Today, I am going to show you how to build an app only with the bot capability (a.k.a bot) and install it on Microsoft Teams.&lt;/p&gt;

&lt;p&gt;The goal of this article is to share how to build a very simple functional bot on the platform so you can build smarter bots based on this experience. Hope it can be a useful starting point for some of you!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Target Audience of this article
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Anyone who has not used Microsoft Teams, but want to play with this platform.
&lt;/li&gt;
&lt;li&gt;Anyone who wants to learn how to build a bot on Microsoft Teams Platform. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are you going to have after following the steps in this article?
&lt;/h2&gt;

&lt;p&gt;At the end of this post, you will have a working bot that echoes back your message!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fejhubpj8lclq040a5kpp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fejhubpj8lclq040a5kpp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Environment for this Article.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Set-Up: 

&lt;ul&gt;
&lt;li&gt;Windows 10, Visual Studio*&lt;/li&gt;
&lt;li&gt;*Visual Studio Version: You need ASP.NET Core Runtime 3.1 which comes with the latest Visual studio 2019. But if you are using the old version of Visual Studio, please install ASP.NET Core Runtime 3.1 from &lt;a href="https://dotnet.microsoft.com/download/dotnet-core/3.1" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can check which version contains what version of ASP.NET Core Runtime from the same website as well. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;Ngrok&lt;/a&gt;(or any other tunneling tool)

&lt;ul&gt;
&lt;li&gt;Please install ngrok, if you don’t have one. There are several ways you can install ngrok. I personally prefer using Chocolatey Package Manager on windows. You can find different ways to install ngrok properly &lt;a href="https://www.twilio.com/docs/usage/tutorials/how-use-ngrok-windows-and-visual-studio-test-webhooks" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;.Net/C#

&lt;ul&gt;
&lt;li&gt;Here I am going to show you building the bot using .Net and C# using the latest Bot Framework SDK, Bot Framework SDK V4. &lt;/li&gt;
&lt;li&gt;You can certainly build bots with other frameworks and languages as well. You can see examples for other options &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/tutorials/code-samples" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Sign up for Teams Free
&lt;/h3&gt;

&lt;p&gt;If you haven’t used Teams before, let’s sign up for Teams.&lt;br&gt;&lt;br&gt;
Microsoft Teams provides a free version that allows you to enjoy the fundamental functionalities of the product. (You can see the difference between the free and the paid version &lt;a href="https://support.microsoft.com/en-us/office/differences-between-microsoft-teams-and-microsoft-teams-free-0b69cf39-eb52-49af-b255-60d46fdf8a9c" rel="noopener noreferrer"&gt;here&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;You can sign up for Microsoft Teams Free by going through the instructions here: &lt;a href="https://support.microsoft.com/en-us/office/sign-up-for-teams-free-70aaf044-b872-4c32-ac47-362ab29ebbb1" rel="noopener noreferrer"&gt;Sign up for Teams free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you already have &lt;a href="https://docs.microsoft.com/en-us/office/developer-program/microsoft-365-developer-program-get-started" rel="noopener noreferrer"&gt;Microsoft 365 Developer Subscription&lt;/a&gt;, you have two choices. &lt;br&gt;
(1) You can use your existing Team for this activity. Or&lt;br&gt;
(2) You can create a testing tenant and use a testing team. &lt;br&gt;
    - The instruction to do so is here: &lt;a href="https://teams-manager.com/create-an-office-365-test-tenant#:~:text=In%20this%20case%2C%20just%20open,content%20for%20your%20new%20tenant." rel="noopener noreferrer"&gt;Create an Office 365 Test Tenant&lt;/a&gt; (Check &lt;code&gt;Creating a test tenant&lt;/code&gt; section)&lt;/p&gt;

&lt;p&gt;Note: if you want to remove your testing team after this exercise, you certainly can. You can find the instructions to do so &lt;a href="https://support.microsoft.com/en-us/office/delete-your-teams-free-organization-2c28cfcf-3fbf-497c-938f-8815a8f6a6b9" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: (optional) Set up a team in Teams
&lt;/h3&gt;

&lt;p&gt;After you sign up for a team, now it is time for you to create a team in Teams! To make my post focus on creating a bot, I will not go over details about how to create a team in Teams from scratch. Instead, please check this post out &lt;a href="https://support.microsoft.com/en-us/office/create-a-team-from-scratch-174adf5f-846b-4780-b765-de1a0a737e2b" rel="noopener noreferrer"&gt;Create a team from scratch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you set up your team, you will see something similar to this:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9jqazitlt034yddunnht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9jqazitlt034yddunnht.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Now let’s leave Teams Client open and work on something in Visual Studio. We will come back to the Teams Client after we are done with setting up our local bot service with Visual Studio. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Install Bot Framework v4 SDK Template Visual Studio Extension
&lt;/h3&gt;

&lt;p&gt;Now let’s get the Bot Framework (BF) v4 SDK template by installing Bot Framework v4 SDK Template Visual Studio Extension. This extension will allow you to set up the bot quickly by providing a skeleton of the structure of required files to build a bot. &lt;br&gt;
You can download the template extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=BotBuilder.botbuilderv4" rel="noopener noreferrer"&gt;here&lt;/a&gt;.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Once the installation is complete, open your Visual Studio -&amp;gt; click &lt;code&gt;Create a new project&lt;/code&gt; -&amp;gt; search for `Echo Bot (Bot Framework v4- .Net Core 3.1).
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Step 5: Open &lt;code&gt;appsettings.json&lt;/code&gt; file.
&lt;/h3&gt;

&lt;p&gt;When the project is created, you will see something like this:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmrt8sfrel4nvvu4eogz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmrt8sfrel4nvvu4eogz6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
I highlighted &lt;code&gt;appsettings.json&lt;/code&gt; file as that's the file that we will need to update with the &lt;code&gt;MicrosoftAppId&lt;/code&gt; and &lt;code&gt;MicrosoftAppPassword&lt;/code&gt; soon. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Run ngrok to point to port 3978 by running &lt;code&gt;ngrok http -host-header=rewrite 3978&lt;/code&gt; on your command prompt.
&lt;/h3&gt;

&lt;p&gt;When you run the above command, you will see a corresponding public url is returned. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsvyzxb45nwxzboa9qjc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsvyzxb45nwxzboa9qjc2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
We will need this publicly accessible URL later. &lt;/p&gt;

&lt;p&gt;Note: We are using port 3978 as that’s the default port that comes with the template. You can check this value in &lt;code&gt;launchSettings.json&lt;/code&gt; file under &lt;code&gt;Properties&lt;/code&gt; folder. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F85ebhb3u6b2petms4o3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F85ebhb3u6b2petms4o3c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
If you want to change this port value, feel free to modify this launchSettings.json file. &lt;/p&gt;

&lt;p&gt;If you want to change this port value, feel free to modify this launchSettings.json file. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Then go back to your Teams client and install an app called &lt;code&gt;App Studio&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ft2fye1g31l06unwke8dg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ft2fye1g31l06unwke8dg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
This app is very useful to start creating or integrating your own Microsoft Teams apps. So I personally think it is worth to pin it on your bar. (More information about App Studio can be found &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/app-studio-overview" rel="noopener noreferrer"&gt;here&lt;/a&gt;)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb6svsfyz8wzuxjrr6p4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb6svsfyz8wzuxjrr6p4t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Then go to app studio app -&amp;gt; go to 'Manifest' tab -&amp;gt; click 'create a new app'
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Step 9:  Then you will see 'App Details' page. Please fill out this page.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F32ebenafirf84to3nsgt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F32ebenafirf84to3nsgt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
A few things to note: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The sections that have the asterisk sign(*) must be filled out. &lt;/li&gt;
&lt;li&gt;App ID is not the one that we need to copy and paste it to &lt;code&gt;appsettings.json&lt;/code&gt;. So don't need to copy that value.&lt;/li&gt;
&lt;li&gt; You don't need to put actual values for testing purpose.Fill free to follow placeholder values. (ex: &lt;a href="https://www.teams.com/privacy" rel="noopener noreferrer"&gt;https://www.teams.com/privacy&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;If this 'App Details` page is not properly filled out, you will see some error messages in Test and Distribute section. For instance, 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjo62tn4nqxvi5t9ux4i9.png" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 10: Now, this is the most important part for us. Click &lt;code&gt;Bots&lt;/code&gt; and click &lt;code&gt;Set Up&lt;/code&gt;.
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Step 11: Fill out the form that pops up when you click &lt;code&gt;Set up&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;For your testing convenience, allow your bot to be installable in persona chat, team, and group chat (see highlighted part). Then click &lt;code&gt;Create Bot&lt;/code&gt;. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxjdmw1rigys0b06xi56w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxjdmw1rigys0b06xi56w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 12: Copy the value of bot id and paste it as the value of &lt;code&gt;MicrosoftAppId&lt;/code&gt; in &lt;code&gt;appsettings.json&lt;/code&gt; (second screenshot).
&lt;/h3&gt;

&lt;p&gt;As soon as you click &lt;code&gt;Create bot&lt;/code&gt;, you will see the bot id (highlighted part) generated. This is the id of the bot that we care about. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs94p8qio3tfjx43mzag5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs94p8qio3tfjx43mzag5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5hr078ncmbm53wer0y9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5hr078ncmbm53wer0y9p.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 13: Click &lt;code&gt;Generate New Password&lt;/code&gt; to get the app password.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl8n7tyh6geafc4nerndw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl8n7tyh6geafc4nerndw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
This value is only shown once, so make sure you copy it after the password is generated. After you copy it, go to your visual studio and paste it as &lt;code&gt;MicrosoftAppPassword&lt;/code&gt; value in &lt;code&gt;appsettings.json&lt;/code&gt; as we did in Step 12. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 14: Now, you are all set with building your bot service for the Echobot. Let’s run the service locally (F5 or just click &lt;code&gt;start&lt;/code&gt; in Visual Studio).
&lt;/h3&gt;

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

&lt;p&gt;If everything is compiled properly and running, you will see the localhost 3978 page open in your browser. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 15: Coming back to the &lt;code&gt;App details&lt;/code&gt; page on App Studio, fill out &lt;code&gt;Messaging endpoint&lt;/code&gt; with &lt;code&gt;&amp;lt;ngrok url&amp;gt;/api/messages&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;In Step 6, we got the public url from ngrok. Copy that value and paste it to the &lt;code&gt;Bot endpoint address&lt;/code&gt;. Then please make sure to add &lt;code&gt;/api/messages&lt;/code&gt; as that’s the endpoint that a bot can understand. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0cxx7x96mf4l5h3cdm1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0cxx7x96mf4l5h3cdm1v.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we are done with setting up the bot on Teams Platform! Now we need to add your bot to Teams so you can interact with it. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 16: Go to &lt;code&gt;Test and distribute&lt;/code&gt; section, and make sure there is nothing under &lt;code&gt;Description&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fddm23zaqgip9ajuzxg5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fddm23zaqgip9ajuzxg5a.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
If you don't see anything on the Description side, it means the information you put is all in the correct format. If you see something, please make sure to address the issues. If everything is good, click install. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 17: Click &lt;code&gt;Download&lt;/code&gt; instead of &lt;code&gt;Install&lt;/code&gt;.
&lt;/h3&gt;

&lt;p&gt;Generally, you would be able to install your bot by clicking ‘Install’. But for Teams Free, you won’t have a permission to install the custom app directly this way. If you click &lt;code&gt;Install&lt;/code&gt;, you will see the following warning. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/microsoftteams/manage-freemium" rel="noopener noreferrer"&gt;The admin privilege in Teams Free&lt;/a&gt; is also very limited so even if you log in as an admin account, you cannot allow users to install their custom apps. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9xi48vat26xs6v3k6tyr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9xi48vat26xs6v3k6tyr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
This does not mean you cannot install the app. What we are going to do is downloading the &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/resources/schema/manifest-schema" rel="noopener noreferrer"&gt;Microsoft Teams manifest&lt;/a&gt; of your app, and we are going to upload the manifest itself to your team. &lt;br&gt;
If you click &lt;code&gt;Download&lt;/code&gt; on &lt;code&gt;Test and Distribute&lt;/code&gt;, you will see a zip file downloaded to your local Downloads folder. &lt;/p&gt;

&lt;p&gt;If you click &lt;code&gt;Download&lt;/code&gt; on &lt;code&gt;Test and Distribute&lt;/code&gt;, you will see a zip file downloaded to your local Downloads folder. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa6yorjtgt72dq3vmpri6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa6yorjtgt72dq3vmpri6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 18: Go to &lt;code&gt;Apps&lt;/code&gt; page and click &lt;code&gt;Upload a custom app&lt;/code&gt;, and upload your manifest.
&lt;/h3&gt;

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

&lt;p&gt;When you click &lt;code&gt;Upload a custom app&lt;/code&gt;, you will see File Explorer Dialogue pops up. Click your zip file to upload it. After the upload is done, you will see your custom app on the App page. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5hevskusfr13pheb2w2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5hevskusfr13pheb2w2i.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 19: Then click your testing bot, then you will see a popped out dialogue. Click &lt;code&gt;Add&lt;/code&gt;.
&lt;/h3&gt;

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

&lt;p&gt;For our testing purpose, installing the bot in a personal chat (you:bot) is enough. If you click the top-down arrow, you can also add a bot to a different scope (ex: team, a group chat). &lt;/p&gt;

&lt;p&gt;When you click &lt;code&gt;Add&lt;/code&gt;, your bot is going to create a 1:1 chat between you and itself by sending a &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages?tabs=dotnet" rel="noopener noreferrer"&gt;proactive welcome message&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 20: Congratulations! You officially built your own bot and installed it on Teams Platform!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8od2lxs2im0i1sdeiy74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8od2lxs2im0i1sdeiy74.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
The bot should echo back whatever you type on the chat. &lt;/p&gt;

&lt;p&gt;In this post, I shared the complete guide to build your own bot and install in on Teams Platform. I hope this guidance can be a great starting point for you to build many different apps on Teams platform. &lt;/p&gt;

&lt;p&gt;Teams provides many rich APIs for developers to develop amazing applications on its platform. You can learn more about how to build different capabilities of apps on Teams here: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/overview" rel="noopener noreferrer"&gt;Build apps for Microsoft Teams&lt;/a&gt;: a good place to get an overview of Teams Platform development ecosystem&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/#pivot=sdk-tools" rel="noopener noreferrer"&gt;Microsoft Teams developer documentation&lt;/a&gt;: the centralized place for all documentation and resources for development on Teams Platform. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are looking for more bot APIs that you can use for Teams bot, please check out &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/?view=botbuilder-dotnet-stable" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;There are a few APIs that I contributed to as well 😊 &lt;/p&gt;

&lt;p&gt;P.S: If you would like to work on a product that makes an impact on millions of users and you love working with amazing and cool people, my org, Microsoft Teams Platform, is hiring! &lt;/p&gt;

&lt;p&gt;Please find positions listed at &lt;a href="https://careers.microsoft.com/us/en" rel="noopener noreferrer"&gt;Careers at Microsoft&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microsoftteams</category>
      <category>bot</category>
    </item>
    <item>
      <title>What is the “Internet”? (Part 3-2)</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Wed, 23 Dec 2020 02:50:00 +0000</pubDate>
      <link>https://dev.to/yunicorn/what-is-the-internet-part-3-2-4cdn</link>
      <guid>https://dev.to/yunicorn/what-is-the-internet-part-3-2-4cdn</guid>
      <description>&lt;p&gt;(You want to read this post in Korean? Check out &lt;a href="https://velog.io/@theyunicorn/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EC%A3%A0-Part-3-1"&gt;here!&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/yunicorn/what-is-the-internet-part-3-1-4d5j"&gt;my last post&lt;/a&gt;, I learned about how the Internet sends information at a high level. The Internet uses a method called ‘packet switching’, which means breaking down data into smaller segments (packets) and sending each of them via different routes’. This packet switching method is used as it contributes to the reliability and the efficiency of communication on the Internet. &lt;/p&gt;

&lt;p&gt;I also learned more about a packet. The structure of a packet is described by a very popular protocol, ‘Internet Protocol’ or IP. As such, we interchangeably call a packet an IP packet. The IP packet has three segments – a set of headers, payload, and footer. Among them, a set of headers has the most important data for communication on the Internet, such as addresses of the sender and the receiver. &lt;/p&gt;

&lt;p&gt;Today I am going to focus more on IP addresses – how an IP address looks like, what information that an IP address contains, and what fields in an IP header are related to an IP address. &lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3-2: Can we talk more about the IP address?
&lt;/h2&gt;

&lt;p&gt;An IP address is &lt;strong&gt;a unique identification of each device on the Internet&lt;/strong&gt;. All devices on the Internet have unique IP addresses and this fact allows the Internet to accurately exchange data between two entities. Then how does an IP address look like? &lt;/p&gt;

&lt;p&gt;An IP address is just a bunch of numbers in a human’s eye. On the Internet, an IP address is a string of bits as every data is represented in bits there. Like how the format of our postal address has a certain hierarchy (ex: street, address, state, country), the numbers in an IP address are organized in a hierarchy. &lt;/p&gt;

&lt;p&gt;This hierarchical structure of an IP address is slightly different depending on which version of IP is used. There are two major versions of IP: IPv4 and IPv6. &lt;/p&gt;

&lt;h3&gt;
  
  
  (1) What is IPv4? And what is an IPv4 address?
&lt;/h3&gt;

&lt;p&gt;IPv4 is the fourth version of IP and this is the version that was selected as a formal standard version of the IP for the first time in the early 1980s. Previous versions of IP were experimental and had design issues to be used at scale. &lt;/p&gt;

&lt;p&gt;IPv4 describes the address of a device as a &lt;strong&gt;32 bits&lt;/strong&gt; long integer value. An IPv4 address is written in a dot-decimal notation, which consists of four 8 bits(octets) as such total of four 4 bytes. Each octet is expressed in a decimal number and is separated by a period. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2oP238mP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ujfv90zanac659au3jdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2oP238mP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ujfv90zanac659au3jdp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bytes of the IPv4 address are further classified into two parts: the network part and the host part&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--205sperW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ukpxzxg5kmsq3yut4pc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--205sperW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ukpxzxg5kmsq3yut4pc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  (A) What information does an IPv4 address contain?
&lt;/h4&gt;

&lt;h4&gt;
  
  
  (a) Network Part
&lt;/h4&gt;

&lt;p&gt;Let’s take a look into each part to understand what information that each part contains. The network part specifies &lt;strong&gt;the unique number assigned to a network&lt;/strong&gt;. This part is used to route your packets to a network that the destination server is located in. Though the image above mentions the first two bytes of the IPv4 address represent the network information, the size can vary depending on what type of class that your network is in. &lt;/p&gt;

&lt;h4&gt;
  
  
  (a)-1: What is the network class/network address class?
&lt;/h4&gt;

&lt;p&gt;This &lt;strong&gt;network address class&lt;/strong&gt; concept comes from the network addressing architecture calls ‘Classful Network’. This architecture divides the IPv4 address space into five address classes (Class A, Class B, Class C, Class D, and Class E). &lt;/p&gt;

&lt;p&gt;This concept was introduced &lt;em&gt;due to the expansion of the network&lt;/em&gt;. Initially, using the first 8 bits was enough to indicate all existing networks as there were only a few large networks and it was before local area networks were popular. Yet as time passed by, people realized that they need another way to address the scalability issue with the network address. As such, the idea of expanding the definition of the network part to include more bits came up. &lt;/p&gt;

&lt;p&gt;This idea allowed &lt;em&gt;the expression of more networks&lt;/em&gt; while ensuring compatibility with the existing large networks which were using 8 bits to express the network part. Depending on the type of the network class, the network part has more than 8 bits. But this classful network architecture was discontinued as this design was not efficiently using bits to meet the demand of IP addresses. As such this architecture was discontinued and was substituted by another architecture called Classless Inter-Domain Routing (CIDR) in 1993. Though the architecture is discontinued, the concept of address class is still used. &lt;/p&gt;

&lt;p&gt;Let’s take a quick look at different address classes starting with Class E before we learn more about the second part of the IPv4 address, the host part. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Class E&lt;/code&gt; is reserved for future or experimental purposes only for research and development (R&amp;amp;D) or study. (Figure 3)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Class D&lt;/code&gt; is reserved for Multicasting. Multicasting is a method of sending packets to a group of interested receivers in a single transmission. There can be one sender and a group of receivers (one to many) or many receivers and a group of receivers (many to many). The opposite concept is Unicasting where there are one sender and one receiver in the data transmission process. And Class A, B, and C are reserved for unicasting. (Figure 3)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Class C&lt;/code&gt; network addresses are for small organizations. Because the class C network address is for a small organization, which means not many nodes exist in the organization, the class C IPv4 address uses the first 3 bytes to represent the network address and the last byte to represent node addresses. This means there can be up to almost 16.7 million (2^24) networks but each network can have only 256(2^8) nodes. In summary, a Class C IPv4 address contains the information below. (Figure 3)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Net.Net.Net.Node&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Class B&lt;/code&gt; network addresses are for medium-sized organizations. A Class B network address uses the first two bytes for the network, and the last remaining part for the host. A Class B IPv4 address contains the network and the host information in the below format. (Figure 3)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Net.Net. Node.Node&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Class A&lt;/code&gt; network addresses are for large organizations. A Class A network address uses the first byte for the network and the remaining 3 bytes for nodes. As such, each network can have about 16.7 million number (2^24). We can read a class A network address like below. (Figure 3)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Net.Node.Node.Node&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(If you want to learn more about the address class, please check the ‘address class’ section in references) &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e7qpDab2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.velog.io/images/theyunicorn/post/0a8d850f-34f3-4e85-9c2e-871b6456f908/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e7qpDab2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.velog.io/images/theyunicorn/post/0a8d850f-34f3-4e85-9c2e-871b6456f908/image.png" alt=""&gt;&lt;/a&gt;(Figure 3)&lt;/p&gt;

&lt;h4&gt;
  
  
  (b) Host Part
&lt;/h4&gt;

&lt;p&gt;Okay, as we learned about what kind of information the network part contains, let’s look at the host part. The host part &lt;strong&gt;uniquely identifies a particular machine on a specific network&lt;/strong&gt;. Let’s say you have five different machines connected to your network. Each of the devices will have the same value for the network part, but it has a different value for the host part. &lt;/p&gt;

&lt;h3&gt;
  
  
  (2) What is IPv6? What is an IPv6 address?
&lt;/h3&gt;

&lt;p&gt;Since its creation, the IPv4 address served its purpose well; it uniquely identified each device on the Internet. But as the Internet usage expanded unprecedentedly, &lt;strong&gt;the number of addresses that IPv4 can generate started to run out&lt;/strong&gt;. The number of discrete IPv4 address values is about 4.3 billion. Yet, people started to see more and more devices being rapidly added to the Internet and realized that 4.3 billion unique address values would not be sufficient. (Officially, all IPv4 addresses were used on November 25th, 2019).&lt;/p&gt;

&lt;p&gt;As such, IETF (Internet Engineering Task Force) initiated the development of a suite of protocols, now known as IPv6, around 1992. &lt;/p&gt;

&lt;h4&gt;
  
  
  (A) IPv6 Address Representation &amp;amp; Abbreviation
&lt;/h4&gt;

&lt;p&gt;Then how does IPv6 define the format of a source/destination address? The IPv6 address is &lt;strong&gt;128 bits&lt;/strong&gt; in length and consists of eight 16 bits. Each of 16 bits is expressed in a hexadecimal number and there is a total of 8 groups, each of which is separated by a colon. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WeG4zQs3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0z395ifw83gb5orfe24q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WeG4zQs3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0z395ifw83gb5orfe24q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
(IPv6 address example)&lt;/p&gt;

&lt;p&gt;But as you can see from the above example, the IPv6 address can be quite long and the length can decrease the readability. To solve this issue, we can abbreviate it. The key point here to omit repetitive 0s. If there are leading zeros, like 0001, in the above example, you can remove three zeros in front of 1.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3FFE:0000:0000:1:0200:F8FF:FE75:50DF&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also, you can use a two-colon(::) notation to represent contiguous 16-bit fields of zeros. For instance, the above example can be shortened one more time after removing any leading zeros in each section.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3FFE::1:0200:F8FF:FE75:50DF&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Usually, when only one group consists of zeros and if it is not the last group, a single zero is used instead of a two-colon. When the last group is all zeros, you can use a two colon. For instance, let’s say there is an IPv6 address that looks like this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;2001:0db8:3c4d:0015:0000:d234::3eee:0000&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This can be shortened as &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;2001:0db8:3c4d:0015:0:d234::3eee::&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  (B) What information does an IPv6 address contain?
&lt;/h4&gt;

&lt;p&gt;As we learned about how an IPv6 address is represented, let’s learn about what information this address contains. Similar to an IPv4 address, the IPv6 address is also split into two components: a network component and a host(node) component. &lt;/p&gt;

&lt;p&gt;This time the first 64 bits are the network part, and the lower 64 bits are the node part. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g67V9WFI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cb0zu7xmzz6t9v45imzq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g67V9WFI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/cb0zu7xmzz6t9v45imzq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  (a) Network Part
&lt;/h4&gt;

&lt;p&gt;The network part contains information about the network. As I briefly mentioned above, the classful networking architecture was deprecated around 1993 due to its inefficient usage of bits. In other words, this architecture was discontinued as it was not suitable to meet the demand of scalability that the Internet needs. As the whole point of IPv6 is to give a unique address to all devices that exist and will exist in the world, IPv6 didn’t use the classful networking architecture. As such the networking part does not contain the address class information. &lt;/p&gt;

&lt;p&gt;Instead, the upper 64 bits contain a &lt;strong&gt;global network address&lt;/strong&gt; that is used for routing over the Internet and &lt;strong&gt;the id of a subnet&lt;/strong&gt; on an internal network which is controlled by the admin of the internal network. The first 48 bits are for the global network address and the remaining 16 bits are to hold the id of a subnet. &lt;/p&gt;

&lt;h4&gt;
  
  
  (b) Host Part
&lt;/h4&gt;

&lt;p&gt;The host part, the lower 64 bits, contains &lt;strong&gt;the address of a physical device(node), MAC address&lt;/strong&gt;. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ymVzEf5P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3sp7gl1ufnwnftz0ka7i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ymVzEf5P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3sp7gl1ufnwnftz0ka7i.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As IPv6 uses 128 bits to represent an address, this protocol can generate about 340 undecillion (2^128) unique addresses. How big this number is? Apparently, this is more than enough for every grain of sand on Earth to have its own IP address. &lt;/p&gt;

&lt;p&gt;Currently, IPv4 is more commonly used, but the adoption of IPv6 is increasing fast. We are still in the middle of the migration process, and this process is going to take a while (expected to take one or two more decades). Most of the recently created devices support both IPv4 and IPv6. &lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this post, I deep dived into the IP address – different versions of IP (IPv4 and IPv6), how each IP version defines the structure of an address, and what information that an IP address contains. If you remember my last post, I shared an image of an IP packet (below image) and mentioned that the header contains all fields that are related to an address. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w0GeqTJe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s11pbbuhscia6uinua25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w0GeqTJe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/s11pbbuhscia6uinua25.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Can you now guess what fields are related to IP address? &lt;/p&gt;

&lt;p&gt;Yes, the first one, &lt;code&gt;Version&lt;/code&gt;, &lt;code&gt;Source IP Address&lt;/code&gt; and &lt;code&gt;Destination IP address&lt;/code&gt; are the ones. &lt;code&gt;Version&lt;/code&gt; contains 4 or 6 depending on which version of IP protocol was used in a packet, and source &amp;amp; destination IP address fields contain the address of a sender and of a receiver respectively. &lt;/p&gt;

&lt;p&gt;In my next post, I am going to connect what we just learned about IP address with a bigger picture of how the Internet sends and receives data. &lt;/p&gt;

&lt;h2&gt;
  
  
  Next Topic
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Part 3-3: 

&lt;ul&gt;
&lt;li&gt;What is Domain Name System (DNS) and how is it used on the Internet?&lt;/li&gt;
&lt;li&gt;How does a router use an IP address? &lt;/li&gt;
&lt;li&gt;What are the problems with IP?&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h2&gt;
  
  
  References:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;IP Address 

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ipv6.com/general/ipv6-the-history-and-timeline/"&gt;https://www.ipv6.com/general/ipv6-the-history-and-timeline/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;IPv4 Address&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.oracle.com/cd/E19455-01/806-0916/6ja85399u/index.html#:%7E:text=The%20IPv4%20address%20is%20a,byte%20of%20the%20IPv4%20address"&gt;https://docs.oracle.com/cd/E19455-01/806-0916/6ja85399u/index.html#:~:text=The%20IPv4%20address%20is%20a,byte%20of%20the%20IPv4%20address&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;Address Space&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tutorialspoint.com/ipv4/ipv4_address_classes.htm"&gt;https://www.tutorialspoint.com/ipv4/ipv4_address_classes.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.steves-internet-guide.com/ipv4-basics/"&gt;http://www.steves-internet-guide.com/ipv4-basics/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tutorialspoint.com/ipv4/ipv4_address_classes.htm"&gt;https://www.tutorialspoint.com/ipv4/ipv4_address_classes.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Classful_network"&gt;https://en.wikipedia.org/wiki/Classful_network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing"&gt;https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dummies.com/programming/networking/cisco/network-basics-ip-network-classes/"&gt;https://www.dummies.com/programming/networking/cisco/network-basics-ip-network-classes/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;IPv6 address&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.steves-internet-guide.com/ipv6-guide/"&gt;http://www.steves-internet-guide.com/ipv6-guide/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.oracle.com/cd/E18752_01/html/816-4554/ipv6-overview-10.html#:%7E:text=to%20the%20sender.-,Parts%20of%20the%20IPv6%20Address,the%20x's%20represent%20hexadecimal%20numbers"&gt;https://docs.oracle.com/cd/E18752_01/html/816-4554/ipv6-overview-10.html#:~:text=to%20the%20sender.-,Parts%20of%20the%20IPv6%20Address,the%20x's%20represent%20hexadecimal%20numbers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.juniper.net/documentation/en_US/junos/topics/concept/interface-security-logical-property-ipv6-addressing-understanding.html"&gt;https://www.juniper.net/documentation/en_US/junos/topics/concept/interface-security-logical-property-ipv6-addressing-understanding.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


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

</description>
      <category>khanacademy</category>
      <category>internet</category>
      <category>personallearning</category>
    </item>
    <item>
      <title>What is the “Internet”? (Part 3-1)</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sat, 12 Dec 2020 07:18:24 +0000</pubDate>
      <link>https://dev.to/yunicorn/what-is-the-internet-part-3-1-4d5j</link>
      <guid>https://dev.to/yunicorn/what-is-the-internet-part-3-1-4d5j</guid>
      <description>&lt;p&gt;(You want to read this post in Korean? Check out &lt;a href="https://velog.io/@theyunicorn/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EC%A3%A0-Part-3-1"&gt;here&lt;/a&gt;!)&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/yunicorn/what-is-the-internet-part-2-1530"&gt;my last post&lt;/a&gt;, I learned about what physical infrastructure is needed for the Internet to send and receive information at a global scale. If you remember, this was my first sub-question to a bigger one, ‘How does the Internet work?’.  &lt;/p&gt;

&lt;p&gt;My first question was to understand how the Internet sends and receives the information, which is made of bits, between two devices. Now my second sub-question is  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How does the Internet reliably send and receive information? How does it guarantee that it sent the correct information to the right receiver? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Part 3: How does the Internet reliably send and receive information?
&lt;/h2&gt;

&lt;p&gt;To answer this question, we need to remember the first characteristics of the Internet that we discussed in &lt;a href="https://dev.to/yunicorn/what-is-the-internet-part-1-1ldj"&gt;my first post&lt;/a&gt; about the Internet. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Communication &lt;br&gt;
The Internet is essentially a communication system. As such, there are a sender of the data and a receiver of that data. Both should know how to talk to each other (ex: if there are rules/processes, both should know).  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key point here is that &lt;strong&gt;there are agreed-upon rules and standards that both a sender and a receiver follow&lt;/strong&gt; to talk to each other. In other words, when you use the Internet to communicate with your friends, there are a set of rules that you need to follow, and you are actually following. (Technically, your device is following, but you still get my point :)). We call this set of rules and standards ‘protocols’.  &lt;/p&gt;

&lt;p&gt;To understand how these protocols play an important role on the Internet, we need to understand how the information is sent and received on the Internet at a high level.  &lt;/p&gt;

&lt;p&gt;When you send a message to your friend over the Internet, this message(information) is broken down into smaller blocks. Each of these blocks is sent to the receiver. An interesting fact is that each of these blocks takes a different path to go to its destination, instead of taking the same route. On the receiver side, the receiver device reassembles these blocks into the whole message as each block arrives.  &lt;/p&gt;

&lt;p&gt;Each of these blocks is called a &lt;strong&gt;‘packet’&lt;/strong&gt;, and we call the method of breaking the information into smaller packets and sending each packet over different routes 'packet switching'. A network that uses this &lt;strong&gt;packet switching method&lt;/strong&gt; to transfer data, like the Internet, is called a packet-switched network. Then why does the Internet use this method? &lt;/p&gt;

&lt;h3&gt;
  
  
  (A) Why do we use the packet switching method?
&lt;/h3&gt;

&lt;p&gt;I mainly think about two reasons behind this decision choice. The first reason is &lt;strong&gt;to improve fault tolerance&lt;/strong&gt;. In the first post about the Internet, we talked about the background of the Internet invention. The intent of the Internet creation was to create a communication system that can survive under nuclear attack. &lt;/p&gt;

&lt;p&gt;This means that the Internet aims to send and receive information between two entities in an accurate and efficient manner even if some parts of the network are broken. By sending packets over many different routes, the Internet can route packets around problems, if there are ones, and ensures the delivery of the information. As such, this method increases the robustness of communication.  &lt;/p&gt;

&lt;p&gt;The second reason is that we can &lt;strong&gt;minimize transmission latency&lt;/strong&gt; by efficiently using the network. It is true that sending smaller size information is generally faster than sending the whole message. But this is not the only reason why the packet switching method makes the transmission of the data fast. &lt;/p&gt;

&lt;p&gt;On the Internet, when each packet is sent off its destination, routers control each packet to take the best available route. Here, the best available route does not always necessarily mean that it is the most direct path. Considering non-technical factors such as politics and relationships between companies, and time it would take for data to reach the destination, the cost of using certain paths, the state of the path (whether it is congested) and more, the best available route for each packet would be determined. Since routers on the Internet controls the traffic of the data, it makes the whole network to be more efficient as the network can balance the load across various paths.  &lt;/p&gt;

&lt;p&gt;Now as we understand the advantages of using packet switching for data transmission, let’s learn more about ‘packet’.  &lt;/p&gt;

&lt;h3&gt;
  
  
  (B) The Structure of Packet
&lt;/h3&gt;

&lt;p&gt;I briefly mentioned the definition of the packet above – a small segment of a larger message. A packet is the basic unit communication on the Internet. ‘A datagram’, ‘a network packet’, and ‘a datagram packet’ are all interchangeable with a packet. A packet has information that contains instructions for where the data needs to go and what the destination system should do once it arrives. How are these instructions are coded?&lt;/p&gt;

&lt;p&gt;Like all other information, a packet is a string of bits divided into three main sections: &lt;strong&gt;A set of headers, the payload (the data), and the trailer (the footer)&lt;/strong&gt;. A set of headers and the trailer contains the control information, which provides data for delivering the payload, and the payload contains the user data, which is the actual data that is being transmitted.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3U7rY2jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b2j9613y7i88yt2ipyat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3U7rY2jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/b2j9613y7i88yt2ipyat.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Among three sections, a set of headers is the one that we are most interested in as it contains the important information that controls the transmission of the data that a sender wants to deliver. The trailer contains some bits signaling the end of the packet, but it does not contain more than this information.  &lt;/p&gt;

&lt;h3&gt;
  
  
  (C) IP Packet header
&lt;/h3&gt;

&lt;p&gt;Let’s deep dive into the header of the packet here. We know a packet is a package of data to be sent and received between two entities. What information do we need to provide when we send a package to our friends? Address!  &lt;/p&gt;

&lt;p&gt;A packet needs to have the address of a sender and that of a receiver like a normal package in our world. As we have to follow a certain format of an address to send a package or a mail by using the postal system, there is a rule for addresses on the packet. The structure of the address is defined by Internet Protocol (IP), and we call the address that followed rules defined by IP ‘IP address’. IP describes not only IP address but also other information needed to route a packet in the packet header such as  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Header Length &lt;/li&gt;
&lt;li&gt;Packet Length &lt;/li&gt;
&lt;li&gt;Time To Live (TTL) (the maximum number of network hops a packet can make before it is discarded) &lt;/li&gt;
&lt;li&gt;Which protocol to use to transport the data &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of information in IP allows devices in different networks to transfer data by relaying packets (we call this action ‘packet forwarding’). We call a packet whose structure is defined by IP ‘IP packet’. Simply put, the IP packet looks like this: &lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--89ZJv7LC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gfkpey4oz7yja4944760.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--89ZJv7LC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gfkpey4oz7yja4944760.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;IP records a total of 14 fields in the header and the IP header length is about 20 or 24 bytes. The below image shows well what all fields in the header are and how they are structured. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L_C7tdCF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eyfmqx5zjbcrfi1rxql0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L_C7tdCF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eyfmqx5zjbcrfi1rxql0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Among these fields, I am going to mainly focus on fields that are related to IP addresses, and those that are needed to transport the data reliably to the destination in coming up posts. In this post, let’s just remember that  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Packets, small segments of a larger message, are transferred on the Internet to increase the efficiency of transmission of the data.
&lt;/li&gt;
&lt;li&gt;Each packet can take different routes to arrive at the same destination to increase the reliability of transferring the data from a source to a destination.
&lt;/li&gt;
&lt;li&gt;Each packet is defined by IP to be routed to its destination.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next post, we are going to learn more about different versions of IP, how each version of IP defines the structure of IP address and what information does each different version of IP address contains. &lt;/p&gt;

&lt;p&gt;Stay Tuned! &lt;/p&gt;

&lt;h2&gt;
  
  
  Next Topic
&lt;/h2&gt;

&lt;p&gt;Part 3-2:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can we talk more about the IP address? &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  References:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.khanacademy.org/computing/computers-and-internet/xcae6f4a7ff015e7d:the-internet/xcae6f4a7ff015e7d:routing-with-redundancy/a/ip-packets"&gt;https://www.khanacademy.org/computing/computers-and-internet/xcae6f4a7ff015e7d:the-internet/xcae6f4a7ff015e7d:routing-with-redundancy/a/ip-packets&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kb.iu.edu/d/anyq%20"&gt;https://kb.iu.edu/d/anyq%20&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.cloudflare.com/learning/network-layer/internet-protocol/"&gt;https://www.cloudflare.com/learning/network-layer/internet-protocol/&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>khanacademy</category>
      <category>internet</category>
      <category>personallearning</category>
    </item>
    <item>
      <title>What is the “Internet”? (Part 2)</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sat, 28 Nov 2020 22:12:41 +0000</pubDate>
      <link>https://dev.to/yunicorn/what-is-the-internet-part-2-1530</link>
      <guid>https://dev.to/yunicorn/what-is-the-internet-part-2-1530</guid>
      <description>&lt;p&gt;(You want to read this post in Korean? Check out &lt;a href="https://velog.io/@theyunicorn/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EC%A3%A0-Part-2"&gt;here&lt;/a&gt;!)&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/yunicorn/what-is-the-internet-part-1-1ldj"&gt;my last post&lt;/a&gt;, I learned about what the Internet is. After that, the next question came up to my mind was “how does it work?”. I thought this simple question should have a very simple and straightforward answer. Yet the more I researched, the more I felt that the question needs to be broken down further. So I did. &lt;/p&gt;

&lt;p&gt;My first sub-question was “what basic physical facilities (infrastructure) are needed for the Internet to send and receive information?”. &lt;/p&gt;

&lt;h3&gt;
  
  
  Part 2: What is the infrastructure that the Internet needs to operate?
&lt;/h3&gt;

&lt;p&gt;To answer this question, I would like to first explain briefly what is the information that the Internet is sending and receiving among different entities. Information in this context is in binary form – it consists of a bunch of 1s or 0s, which we call ‘bit’ for each individual 1 or 0. Bits are the atoms of the information.&lt;/p&gt;

&lt;p&gt;As we know the Internet is a network of computer connected at a global scale, we can modify the above-mentioned question to be:&lt;br&gt;
“what basic physical facilities (infrastructure) are needed for computers to send and receive these bits?”. &lt;/p&gt;

&lt;p&gt;Throughout history, different physical mediums were used to send and receive these bits between computers. But nowadays, we are mainly using three mediums. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Electricity&lt;/li&gt;
&lt;li&gt;Light&lt;/li&gt;
&lt;li&gt;Radio Wave&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s visit each medium to understand how it transfers the bits at a high level, the pros and the cons. &lt;/p&gt;

&lt;h4&gt;
  
  
  (1) Electricity
&lt;/h4&gt;

&lt;p&gt;First, how does electricity can be used to represent the bits? &lt;/p&gt;

&lt;p&gt;It is pretty simple – the operators in transmitting these bits agreed that when there is voltage, it represents 1 and when there is no voltage, the state represents 0. Upon this agreement, the sender can represent ‘1010’ and send it to the other side. But how can we represent bits which consist of consecutive 1s and 0s? Like 10000? How can the receiver count the number of zeros? &lt;/p&gt;

&lt;p&gt;For those scenarios, we need a concept of ‘timer’. Operators agree to send a certain number of bits per the given amount of time (usually in a second). Then, the receiver can calculate how many 1s or 0s one received based on this agreement. As an example, let’s say two operators agreed to send a bit per second. They also agreed to represent 1 as 5v, and 0 as 0v. In this scenario, if the sender sends 0v for 5 seconds, the receiver knows marks ‘00000’ on his/her end. The number of bits that are processed per unit of time is called ‘bit rate’. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pT_DeCJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/djdp61qw1ztcvjopi5yp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pT_DeCJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/djdp61qw1ztcvjopi5yp.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, the second question is what is used to transmit this electricity to send bits? &lt;/p&gt;

&lt;p&gt;Here, a copper wire is usually used. The ethernet cable we see at our home, work, and school is made of strands of copper wire. The main reason that we use copper wires for connecting computers is because of its affordable price. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9aZwZR8b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ht6gbd2ny1hg1plwfjrd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9aZwZR8b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ht6gbd2ny1hg1plwfjrd.jpg" alt="Alt Text"&gt;&lt;/a&gt;(Ethernet Cable)&lt;/p&gt;

&lt;p&gt;However, copper wire is not good for sending signals for a really long distance, because the electrical resistance of a long cable affects performance. As such, there is an upper limit on how long the ether cable can be. Therefore, we see the ether cable for the local network. &lt;/p&gt;

&lt;p&gt;But what if we want to send data from one continent to the other continent? If electricity is an inefficient way to transmit information over long distances, what’s our alternative? What’s the one thing that travels so fast without the signal loss? Light!&lt;/p&gt;

&lt;h4&gt;
  
  
  (2) Light:
&lt;/h4&gt;

&lt;p&gt;We can send bits through the light beam. How we use the light beam to represent 1 or 0 is very similar to how we do so with electricity. When light is off, it means 0. When light is on, it means 1. To send the light beam, we need to use a special cable, called ‘fiber optic’. Fiber optic cable is a specially engineered cable that is made of a thread of glass to reflect light. When the light is sent down the cable, the light is bounce off the walls of the cable and reaches the other end without leaking out at the edges. As such, signals travel farther without signal loss. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xmRC_Kpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xc7hitx3844asx1ae6j8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xmRC_Kpa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xc7hitx3844asx1ae6j8.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
(Fiber optic Cable (&lt;a href="https://global.canon/en/technology/s_labo/light/003/08.html"&gt;Image Ref&lt;/a&gt;))&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rD4_neIy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/aqgrkddznhld5xm9dtba.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rD4_neIy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/aqgrkddznhld5xm9dtba.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
(How the fiber optic cable sends data using light (&lt;a href="https://global.canon/en/technology/s_labo/light/003/08.html"&gt;Image Ref&lt;/a&gt;)) &lt;/p&gt;

&lt;p&gt;For these advantages, fiber optic cables are used to connect the networks across countries. These cables are under the ocean and go across hundreds of miles to connect the continents. Though it seems sending data from one continent to the other magically handled, there are actually physical wires that make the Internet communication possible. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7wRbcM9w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hq2wvzywsmbd42w8zz8o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7wRbcM9w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hq2wvzywsmbd42w8zz8o.png" alt="Alt Text"&gt;&lt;/a&gt;(The map of the submarine cables connecting the world. (&lt;a href="https://theconversation.com/in-our-wi-fi-world-the-internet-still-depends-on-undersea-cables-49936"&gt;Image Ref&lt;/a&gt;))&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bWNixF58--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q9zygd27zg0niier2kcy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bWNixF58--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q9zygd27zg0niier2kcy.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
      (Submarine Cable (&lt;a href="https://acacia-inc.com/blog/undersea-fiber-cables-are-connecting-our-world/"&gt;Image Ref&lt;/a&gt;))&lt;/p&gt;

&lt;p&gt;So, it seems the fiber optics and the light combo seems more efficient in delivering the information. Then why do we use copper wires? Isn’t it better to use fiber optics everywhere? The fiber optics have three major disadvantages. The first disadvantage is that the fiber optic cables are pretty expensive. The second problem is that they are more complicated to use and as such, managing the fiber optic cables requires some level of expertise. Lastly, the fiber optic cables are more fragile and vulnerable to damage than the copper wires as the fiber is made of glass. As such, copper wires can be a more preferable option than fiber optics under different situations.&lt;/p&gt;

&lt;p&gt;Until so far, we have covered two different ways of exchanging data between two entities through physical wires. But we all know there is a way to communicate without wires; using Wi-Fi and cellphone signal. Then how do these Wi-Fi &amp;amp; Cell phone signal work to exchange the data? &lt;/p&gt;

&lt;h4&gt;
  
  
  (3) Radio Signal
&lt;/h4&gt;

&lt;p&gt;To send the bits wirelessly, we use radio waves as they have ideal properties such as they can be easily transmitted through air, and they do not cause damage on the human body if they are absorbed. When a device sends bits to the other device wirelessly, the sending device needs to translate the bits into radio waves in different frequencies. When the receiving device receives those waves, it needs to reverse the process by translating the radio waves into bits (digital wave). &lt;/p&gt;

&lt;p&gt;It is great that the radio waves can make the communication among devices mobile. Yet, radio signal is not the best fit for the worldwide communication as the signal cannot travel that far. So, when we communicate through wi-fi in our daily life, we are not 100% relying on the wireless communication. We are actually using both wireless and wired internet. &lt;/p&gt;

&lt;p&gt;Let’s think about a time when you were in a coffee shop using its wifi. When you are accessing a website, you are sending bits via radio waves to a router located in the shop. This router is a device that accepts the radio signals and translates them into bits again and sends them to other devices via the ethernet cables. If your bits need to be sent through over the ocean, now you know what cables are used to send those bits; fiber optics 😊&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 2 Summary
&lt;/h1&gt;

&lt;p&gt;Until so far, we covered the physical infrastructure needed for the Internet to operate.&lt;/p&gt;

&lt;p&gt;For the next post, I will share how the Internet reliably sends and receive information for each sender and receiver. I will talk about the standardized rules (protocols) between the sender and the receiver of data to communicate via the internet and how those rules work. &lt;/p&gt;

&lt;p&gt;Next Topic: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 3: How does the Internet reliably send and receive data?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>internet</category>
      <category>khanacademy</category>
      <category>personallearning</category>
    </item>
    <item>
      <title>What is the “Internet”? (Part 1)</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sun, 15 Nov 2020 01:33:23 +0000</pubDate>
      <link>https://dev.to/yunicorn/what-is-the-internet-part-1-1ldj</link>
      <guid>https://dev.to/yunicorn/what-is-the-internet-part-1-1ldj</guid>
      <description>&lt;p&gt;(&lt;em&gt;You want to read this post in Korean? Check out &lt;a href="https://velog.io/@theyunicorn/%EC%9D%B8%ED%84%B0%EB%84%B7%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EC%A3%A0-Part-1"&gt;here&lt;/a&gt;!&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;As far as I remember, I have had access to the Internet at home or at school since I was very young. Reflecting back, I was very fortunate. For a long time, however, I just took the Internet for granted. &lt;/p&gt;

&lt;p&gt;When I was young, I understood the Internet as a black box that somehow magically connects my family and myself to our friends. Later, I knew the Internet is a system that allows devices to communicate with each other. But I did not understand how this system actually works. &lt;/p&gt;

&lt;p&gt;A few months ago, I found a resource about the &lt;a href="https://roadmap.sh/backend"&gt;backend developer roadmap&lt;/a&gt;. There, I saw the first recommended step is to learn more about the Internet. I took that guidance as a motivation factor and decided to learn about the fundamentals of the Internet.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vw3TsCI9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/36tpcojb5a7xl8w7vd7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vw3TsCI9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/36tpcojb5a7xl8w7vd7v.png" alt="Backend Developer Roadmap"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are a lot of great resources to learn about the Internet, but for me, I have been mainly using &lt;a href="https://www.khanacademy.org/computing/code-org/computers-and-the-internet#internet-works"&gt;"How the Internet works"&lt;/a&gt; on the Khan Academy. I reconstructed the contents from there in a way that helps me to understand the Internet better. &lt;/p&gt;

&lt;p&gt;In this post, I am going to cover the definition of the Internet and its origin.&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 1: What is the internet?
&lt;/h1&gt;

&lt;h3&gt;
  
  
  (1) Definition
&lt;/h3&gt;

&lt;p&gt;If you google/bing ‘Internet’, you will see its Wikipedia definition. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The Internet (or internet) is the global system of interconnected computer networks that uses the Internet protocol suite (TCP/IP) to communicate between networks and devices.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me paraphrase in a less technical way. I define the Internet as below. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Yunicorn’s Definition&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Internet&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A communication system that enables the exchanging of information between two entities (can be a person or device). &lt;/li&gt;
&lt;li&gt;This communication system is a network of computer networks. 

&lt;ul&gt;
&lt;li&gt;Each computer network generally consists of a group of computers.&lt;/li&gt;
&lt;li&gt;As such, you may think the Internet is a network of a large number of computers. &lt;/li&gt;
&lt;li&gt;As a &lt;a href="https://www.helpnetsecurity.com/2019/05/23/connected-devices-growth/"&gt;reference&lt;/a&gt;, by the end of 2018, the number of devices connected to the internet reached 22 billion worldwide.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;After I learned about the definition, I wanted to know why this communication system was created. It’s mainly because sometimes the ‘why’ of something impacts the design and the architecture of that something. &lt;/p&gt;

&lt;h3&gt;
  
  
  (2) The origin of the Internet
&lt;/h3&gt;

&lt;p&gt;For the Internet to work as it is today, there have been numerous scientists who contributed to the invention of the Internet. Among them, the well known major pioneers of this invention are Vint Cert and Robert E.Kahn (or Bob Kahn). In the Khan Academy videos, Vint shares the origin and its architecture in a quite simple and comprehendible manner. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fnxd0e94--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/esa6bjjw0588hru40tm4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fnxd0e94--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/esa6bjjw0588hru40tm4.png" alt="Right: Vint Cert, Left: Bob Khan in the early 1970s"&gt;&lt;/a&gt;&lt;br&gt;
     (Right: Vint Cert, Left: Bob Khan in the early 1970s)&lt;/p&gt;

&lt;p&gt;Vint explains that the Internet was originally created for military purpose. It was a result of ARPANET (&lt;strong&gt;A&lt;/strong&gt;dvanced &lt;strong&gt;R&lt;/strong&gt;esearch &lt;strong&gt;P&lt;/strong&gt;roject &lt;strong&gt;A&lt;/strong&gt;gency &lt;strong&gt;NET&lt;/strong&gt;work), which was a Defense Department research project. The intent of the project was to create a communication system that can survive under nuclear attack. &lt;/p&gt;

&lt;p&gt;So, the other pioneer, Bob Khan, came up with an idea to create a system&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;that does not have a centralized control by connecting many networks,&lt;/li&gt;
&lt;li&gt;that sends messages (information) as fast as possible by “breaking each message up into blocks (aka packets) and sending them in every possible direction through the mesh of network”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a result, they created a national wide experimental distributed packet network and validated that the system effectively transferred the information between two entities without a risk of the complete failure of the network. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2VWbnHga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o28ta6fv5tpbexusivbg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2VWbnHga--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/o28ta6fv5tpbexusivbg.jpg" alt="ARPANET 1969-1977"&gt;&lt;/a&gt;&lt;br&gt;
(ARPANET 1969-1977 (&lt;a href="https://theconversation.com/how-the-internet-was-born-from-the-arpanet-to-the-internet-68072"&gt;Image Ref&lt;/a&gt;))&lt;/p&gt;

&lt;p&gt;After I learned about the origin of the internet, I identified three important characteristics of the Internet: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Communication 

&lt;ul&gt;
&lt;li&gt;The Internet is essentially a communication system. As such, there are a sender of the data and a receiver of that data. Both should somehow know how to talk to each other (ex: if there are rules/processes, both should know.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reliability

&lt;ul&gt;
&lt;li&gt;The Internet should transfer the data no matter what kind of situation it encounters. As such, it should have many options for sending data from point A to point B. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scalability 

&lt;ul&gt;
&lt;li&gt;The Internet is a network of computer networks. It should be able to handle new networks getting connected to the existing network of networks. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We will see how these characteristics are reflected as we learn more about the Internet. As of now, let’s remember that the Internet is a &lt;strong&gt;distributed communication system&lt;/strong&gt; that is made of lots of &lt;strong&gt;computers connected&lt;/strong&gt; to each other to exchange information reliably on a global scale.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BrshpUi4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1wavgp1omkkazq4rjo4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BrshpUi4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1wavgp1omkkazq4rjo4k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Part 1 Summary
&lt;/h1&gt;

&lt;p&gt;Until so far, we covered,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The definition of the Internet&lt;/li&gt;
&lt;li&gt;The origin of the Internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the next post, I will share more about the infrastructure needed for the Internet to operate. &lt;/p&gt;

&lt;p&gt;Next Topic: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 2: What is the infrastructure that the Internet needs to operate? (Wires, Cables and Wifi)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>internet</category>
      <category>khanacademy</category>
      <category>personallearning</category>
    </item>
    <item>
      <title>TeamsTab01.log</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sun, 31 May 2020 19:28:36 +0000</pubDate>
      <link>https://dev.to/yunicorn/teamstab01-log-1gi6</link>
      <guid>https://dev.to/yunicorn/teamstab01-log-1gi6</guid>
      <description>&lt;p&gt;For June, my husband and I are going to start a new learning experiment. Every sunday morning, we are going to prioritize personal learning. Since the quarantine life started, we designated our morning time for workout. As this habit became sticky to our life styles, we decided to change the priority. Learning -&amp;gt; workout. &lt;/p&gt;

&lt;p&gt;I did have some personal learning initiatives before. I did Sunday Learning project where I woke up every morning around 5:45am and did learning from 6-8am with one of my coworkers. We texted each other to make sure the other side was awake and ready to go. This worked pretty well. But as always, there is always some room for improvement. &lt;/p&gt;

&lt;p&gt;1) My learning was not very active. I took a udemy course. The course itself was great. But I wanted to have more active learning where I just jump onto a project and just figure out what I don't know along the way.&lt;br&gt;
2) Time - I was just so obsessed with 6-8am. This strict schedule was not sustainable especially when you are going through a lot of life changes. I got married, I had to apply for a different visa, I was on my process to change a team etc. There were several nights during weekdays and Saturday that I couldn't have enough sleep. And having an early Sunday morning responsibility didn't help me to catch up my sleep. I felt like my focus level went down and more importantly, the engagement level went down. &lt;/p&gt;

&lt;p&gt;This time, the only rules I have to myself are &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The first thing I do on Sunday Morning is personal learning. &lt;/li&gt;
&lt;li&gt;I do personal learning for 3 hours. The last half an hour is for wrapping up time. &lt;/li&gt;
&lt;li&gt;Then I exercise (most likely running as we are following our running schedules)&lt;/li&gt;
&lt;li&gt;And enjoy your rest of Sunday :D &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I will see how this new schedule can help me to build a learning habit that works for me. &lt;/p&gt;

&lt;p&gt;Well, the intro got longer than I expected. So today, I wanted to try out how to build a tab in Microsoft Teams. &lt;/p&gt;

&lt;p&gt;Whenever I just want to try out how things work in Microsoft Teams, I always go to &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/"&gt;Microsoft Teams Developer Platform&lt;/a&gt; to see whether there are any contingent topics that I can check out. And ah-ha, I found the &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/tabs/what-are-tabs"&gt;tabs section&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I don't have any ideas how to build tabs, I just wanted to play around with some existing code. Quick Start is always a good section for this purpose. As I am more comfortable with C#, I chose a &lt;a href="https://docs.microsoft.com/en-us/microsoftteams/platform/tabs/quickstarts/create-channel-group-tab-dotnet-core"&gt;quickstart guideline for C#/ASP.NET Core&lt;/a&gt;. For the first time users for .NET, I recommend using ASP .NET core as this is the framework that has more benefits for web development (ex: cross-platform support). &lt;/p&gt;

&lt;p&gt;While I was reading the quickstart, I wanted to check whether I have a M365 Developer Program subscription. As I am an employee there, I wanted to check whether I can receive a subscription. And it was true. You can find more information about your eligibility for the subscription here. &lt;a href="https://docs.microsoft.com/en-us/office/developer-program/microsoft-365-developer-program-faq"&gt;Microsoft 365 Developer Program FAQ&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Afterward, I just followed the quickstart instruction step by step. But there were several gotta points that I want to note for future self. I also filed some issues as well. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The example uses ASp.NET Core 2.2. I believe this project is locked to use this version. As you will see, this version is not in active support anymore. So I wanted to migrate to the latest one (at this point, 3.1). But I couldn't find out a way. To move on, I just installed ASP.Net Core 2.2 If you don't have it, you will see an error message when you run the application. &lt;/li&gt;
&lt;li&gt;The endpoint for the app is not 44355. It is 51175. You can find the URL in launchSettings.json.&lt;/li&gt;
&lt;li&gt;Update your application - 

&lt;ul&gt;
&lt;li&gt;You can find the latest Microsoft Teams Javascript API here: &lt;a href="https://www.npmjs.com/package/@microsoft/teams-js"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;You can find the jQuery script for the latest Microsoft Ajax Content Delivery Network here: &lt;a href="https://docs.microsoft.com/en-us/aspnet/ajax/cdn/overview"&gt;Link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ngrok - It seems there are several ways you can expose your web sever to the internet. For instance,

&lt;ul&gt;
&lt;li&gt;ngrok http &lt;a href="https://localhost:51175"&gt;https://localhost:51175&lt;/a&gt; -host-header="localhost:51175" &lt;/li&gt;
&lt;li&gt;ngrok http -host-header=localhost 51175 &lt;/li&gt;
&lt;li&gt;ngrok http 51175&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Interestingly, I got 400 when I tried the first two. When I set up the tunneling in a third way, I could make my content page loaded via the ngork HTTPS URL. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload your tab to Teams with App Studio

&lt;ul&gt;
&lt;li&gt;The file path where you can find your tab.zip is {the folder path to ChannelGroupTab.sln}/bin/Debug/netcoreapp2.2/tab.zip. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I think these were the only points that made me slightly confused to figure out. Other than these points, the doc was up to date :)&lt;/p&gt;

&lt;p&gt;After I installed this sample app with the Tab capability in Microsoft Teams, &lt;br&gt;
I could see the following result in my testing teams like this: &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CKWQfxwM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u3l9gk6qnu382pfcwxxg.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CKWQfxwM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/u3l9gk6qnu382pfcwxxg.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next time, I am going to try to create a Teams app with the Tab capability from the scratch. My ultimate goal is showing Feedly website in my Teams channel. :D &lt;/p&gt;

</description>
      <category>learing</category>
      <category>notestoself</category>
      <category>teams</category>
    </item>
    <item>
      <title>[BookReview] StrategyPattern01.log</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sat, 23 May 2020 06:27:43 +0000</pubDate>
      <link>https://dev.to/yunicorn/bookreview-strategypattern01-log-1h3b</link>
      <guid>https://dev.to/yunicorn/bookreview-strategypattern01-log-1h3b</guid>
      <description>&lt;p&gt;I started to read &lt;a href="https://www.amazon.com/Head-First-Design-Patterns-Brain-Friendly/dp/0596007124"&gt;Head First Design Patterns&lt;/a&gt;. I highly recommend this book to anyone who wants to explore design patterns in such an engaging way. I allocated 2 hours every week to deep dive into the contents. Every time I finish learning about one design pattern, I am going to write about what I understood about the pattern.&lt;/p&gt;

&lt;p&gt;First of all, let's start with a very important question as this is my first post about this book. What is the design pattern? The author of the book defines it really well. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Design pattern is the best practice that professional OOP developers have found. design patterns are the solutions to many common problems that developers have encountered. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;According to &lt;a href="https://www.tutorialspoint.com/design_pattern/design_pattern_overview.htm"&gt;Tutorial Point&lt;/a&gt;, generally, the design patterns can be categorized into three types. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creational pattern&lt;/li&gt;
&lt;li&gt;Structural Pattern&lt;/li&gt;
&lt;li&gt;Behavior Pattern. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The design pattern that I am going to talk about today is a behavior pattern. &lt;br&gt;
Before I talk more about that design pattern, let's first answer this question; what is a behavior pattern? &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A behavior pattern is a design pattern that is mainly concerned with the interaction between objects. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Taken the definition of the design pattern and that of the behavior pattern together, you can probably guess that today's pattern is a design that somehow solves certain problems that happen when objects interact. So what is it? &lt;/p&gt;

&lt;p&gt;Strategy Pattern (Policy Pattern)&lt;br&gt;
Let's start with its definition. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Strategy pattern is the behavior design pattern that selects strategy at runtime. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Okay.. So it sounds like we need to understand what 'strategy' means here. I interpret strategy as behavior of an object or a program. Broadly speaking, this behavior is an algorithm, a set of instructions that your program follows.   So basically, the Strategy pattern is a design pattern that allows your program to have different behavior at runtime. &lt;/p&gt;

&lt;p&gt;Before we talk about how to implement the strategy pattern, let's discuss why even allowing your program to have different behavior at runtime is important.&lt;br&gt;
When we say we allow our program to have different behavior at runtime, it means we allow our program to react to different inputs. Think about the below case:&lt;/p&gt;

&lt;p&gt;Let's say you want to make a console application that prints out different results based on a user's input. When a user types 'I', a random int data is passed to my program and my program processes the data and shows the sum including the number. When the user inputs 'S', a random string is passed to my program and my program shows the whole strings which consist of random strings generated up to the point. &lt;/p&gt;

&lt;p&gt;This is powerful if you think about how much flexibility your program has. With one program, you can meet so many different customers' demands. You can see the benefit of code reusability here as well. &lt;/p&gt;

&lt;p&gt;Then how does strategy pattern allow my program to have this flexibility? The key in the Strategy pattern is encapsulating* the behavior that changes quite often. Basically, make the behavior that frequently changes as its own class. By doing so, we can (1) make our program to be flexible with changes in that behavior without modifying our program itself and therefore we can stick with the open/close principle*, (2) increase code reusability by allowing other programs to use the behavior class. &lt;/p&gt;

&lt;p&gt;Now we covered the theoretical aspects of Strategy Pattern. It is always helpful to see an actual example to understand the concept better.  We will deep dive into the implementation of the Strategy Pattern with an example from the book in the next post. It will be fun. I promise :)&lt;/p&gt;

&lt;p&gt;*Encapsulation in OOP: Class should contain the data and methods that directly work on the data as a single unit.&lt;br&gt;
*Open/Close Principle: class is open to extend and close to modification.&lt;/p&gt;

</description>
      <category>bookreview</category>
      <category>designpatterns</category>
      <category>learning</category>
    </item>
    <item>
      <title>Kusto01.log</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Mon, 13 Apr 2020 05:44:54 +0000</pubDate>
      <link>https://dev.to/yunicorn/kusto01-log-2lb3</link>
      <guid>https://dev.to/yunicorn/kusto01-log-2lb3</guid>
      <description>&lt;p&gt;I have heard 'Kusto' several times in my workplace or in some technical documentation about Azure. For sure, this concept was related to data as I heard about this word when I was doing something related to data. But I had so many questions as my understanding of this concept was shaky. So I decided to explore 'Kusto' a bit this time. &lt;/p&gt;

&lt;p&gt;These are questions that I started with. &lt;br&gt;
    1) What is Kusto?&lt;br&gt;
    2) What is so special about Kusto?&lt;br&gt;
    3) When should I use Kusto?&lt;br&gt;
    4) How can I have hands-on experience with Kusto? &lt;/p&gt;

&lt;p&gt;Please consider this post as one individual's personal note during the learning process. That being said, the information here is just my understanding and therefore, it might be inaccurate. Hopefully, as I develop a much better understanding of Kusto and start to see a bigger picture, I hope my future self can correct my past self's understanding. &lt;/p&gt;

&lt;p&gt;So the first question first. &lt;/p&gt;

&lt;h3&gt;
  
  
  What is Kusto?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;At this point, I would say Kusto is a service that supports both data ingestion and data query. Kusto can get data from different sources, transform it and save it so that it can be queryable via SQL or SQL-like languages (ex: KQL). I do not have experience with the data ingestion part of Kusto yet. But in terms of querying data, I have seen people using some clients using Kusto Query Language (KQL, which I will cover in a bit) to query data to get some insights. I believe the entity that is responsible for data query service is Kusto. &lt;/li&gt;
&lt;li&gt;Kusto is a codename for Azure Data Explorer. So I believe I can interchangeably use Kusto with &lt;a href="https://azure.microsoft.com/en-us/services/data-explorer/"&gt;Azure Data Exporer&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What is so special about Kusto?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I think Kusto service is used to explore the terabytes of real-time data to get insights. In other words, Kusto is the service that is optimized for streaming data such as logs or telemetry. To understand what it means to be optimized for streaming data, I had to understand what streaming data is. Streaming data is the data that is continuously generated by different sources. The amount of data is huge. As such, the services that query this type of data should be highly performant. And indeed, Kusto is one of those services.&lt;/li&gt;
&lt;li&gt;From the data ingestion perspective, my hypothesis is that Kusto is optimized to get any structure of data (structured, semi-structured or unstructured) from many different sources and can efficiently transform the data to save in their databases (Kusto databases).  I am curious about what are these Kusto databases are. I haven't taken a look into this part this time, but I would explore later this week. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When should I use Kusto?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In the practical world, I would use Kusto when I want to gain sights from logs or telemetry from my applications to debug any issues more effectively. This service capabilities are extended by other services such as Azure Monitor Logs, Application Insights, Time Series Insights, and Windows Defender Advanced Threat Protection. (&lt;a href="https://docs.microsoft.com/en-us/azure/data-explorer/data-explorer-overview"&gt;Ref&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How can I have hands-on experience with Kusto?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;So now I have a better theoretical understanding of Kusto (relatively speaking), I would like to have some hands-on experience with Kusto. There are two options. 

&lt;ul&gt;
&lt;li&gt;If my goal is getting familiar with Kusto Query Language itself, I think starting with &lt;a href="https://dataexplorer.azure.com/clusters/help/databases/Samples"&gt;Azure Data Explorer Web Client&lt;/a&gt; with the sample data is the right way to go. &lt;/li&gt;
&lt;li&gt;If I want to create a testing cluster and testing database, ingest the data and then query that collected data, following &lt;a href="https://docs.microsoft.com/en-us/azure/data-explorer/create-cluster-database-portal"&gt;the start guide&lt;/a&gt; will be the right choice. &lt;/li&gt;
&lt;li&gt;I am wondering whether I can leverage my Azure Cosmos DB for &lt;a href="https://github.com/YunnyChung/YunnyAlfredBotTemplate"&gt;my bot&lt;/a&gt; to see the data. I think this will be more interesting. &lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;So today was my heavy research day for my first learning topic, Kusto. &lt;br&gt;
Today learning gave me a good idea about what I want to prioritize for my learning. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Organize my notes about using Kusto for my work. 
*This will not be sharable. But I can keep it as my private notes. &lt;/li&gt;
&lt;li&gt;Get Familiar with Kusto Query Language. 
Write down useful commands that would be used in my team. 
Apply those commands in Sample Data. &lt;/li&gt;
&lt;li&gt;Learn how a cluster and a database need to be set up to be used for Kusto service, and check whether I can leverage my existing database. If it is possible, I can use KQL to get data from my bot. If not, simply follow the instructions. &lt;/li&gt;
&lt;li&gt;Address remaining questions that I didn't have time to get to. 
a. From today's learning, these are the questions that I didn't have time to find answers. 

&lt;ol&gt;
&lt;li&gt;What sources can be connected to Kusto so Kusto can ingest the data from them? &lt;/li&gt;
&lt;li&gt;What happens when data is ingested in Kusto?&lt;/li&gt;
&lt;li&gt;What are the databases that Kusto uses (Kusto Database)? &lt;/li&gt;
&lt;li&gt;What's the structure of the Kusto database? &lt;/li&gt;
&lt;/ol&gt;


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

</description>
      <category>artifact</category>
      <category>notestoself</category>
      <category>kusto</category>
    </item>
    <item>
      <title>LearnInPublic01.log</title>
      <dc:creator>yunicorn.log</dc:creator>
      <pubDate>Sat, 11 Apr 2020 06:53:43 +0000</pubDate>
      <link>https://dev.to/yunicorn/learninpublic01-log-11c7</link>
      <guid>https://dev.to/yunicorn/learninpublic01-log-11c7</guid>
      <description>&lt;p&gt;Since I started my professional career, I have always wondered how I would establish a sustainable learning system. First, I had to understand how I learn. I had many not-so-good behaviors such as just consuming information first before I actually identified missing pieces in my knowledge base. &lt;/p&gt;

&lt;p&gt;During the process of understanding my own learning habits, I got to experiment with different learning strategies. For instance, my coworker and I piloted a three-month-long program, 'Sunday Learning', after I was inspired by a career talk given by Sophia Velastegui to young Korean professionals at Microsoft. To maintain her personal learning even in a crazily busy schedule, she allocates 2 hours of her early Sunday morning (ex:6am-8zm) solely for her personal learning time. In a similar manner, my coworker and I woke up around 5:30-5:45 am and started our own personal learning from 6 am to 8 am. &lt;/p&gt;

&lt;p&gt;At that time, the goal of this pilot program was to test whether I would be able to build a personal learning habit and stick with it for a longer-term in a more systematic manner. Surprisingly, sticking with the habit itself was not challenging. Challenges came from unexpected areas.&lt;/p&gt;

&lt;p&gt;First, I was not sure whether I was learning effectively. I was taking a Udemy class about c++. Don't get me wrong- the class itself was really good. It has interactive components such as assignments and quizzes. But I felt like the whole process of following the course was not very active learning. I was basically consuming the knowledge of others, not actively making it mine. My measurement of success was the progress I made in that online course. But that measurement didn't capture how effectively I was learning. I need to have a different way of measuring my learning. &lt;/p&gt;

&lt;p&gt;Second, I somehow always thought that I had to have a theme in my learning. Basically, choosing one topic and learning deeper about the topic. When I started my pilot program, I was a developer in Windows. As such having a deep understanding of c++ was necessary. Also, my curiosity about this particular language was pretty high. I wanted to answer all the 'whys' I had while I was reading Windows code. I wanted to theoretically understand C++ and wanted to apply my knowledge to my work. &lt;/p&gt;

&lt;p&gt;Hence, taking a C++ online class was really fun - only in the beginning. As I got a bit more comfortable with C++, and my work project was requiring a different skill set other than c++, my interest level in c++ went down. I wanted to explore other topics. Sometimes, I had a different topic that I wanted to explore more in my personal time each week. But I was not sure that my learning would be effective if I let myself use my Sunday learning time to explore different topics every time. I just felt that option was not systematic and therefore it would be challenging for me to sustain my learning system. &lt;/p&gt;

&lt;p&gt;As such, after this three-month-long pilot program, I spent some time finding that one topic that would make me keep going, still help me to do better at work, and has some hands-on learning opportunities. But finding the ideal topic was really challenging. &lt;/p&gt;

&lt;p&gt;While I was thinking really hard about what to learn next, I stumbled into swyz's post, &lt;a href="https://www.swyx.io/writing/learn-in-public/"&gt;Learn In Public&lt;/a&gt;. There, the author talked about a faster way of learning - learning in public. The post itself was more about the importance of sharing one's learning in public as this tactic helps oneself to learn faster. Strictly speaking, this post itself didn't help me to reach the 'aha' moment. Two other posts that were linked in the post were the ones that provided me important answers to my challenges I tried to solve; one was &lt;a href="https://www.swyx.io/writing/learning-gears/"&gt;Learning Gears&lt;/a&gt;, and the other was &lt;a href="https://www.swyx.io/writing/learn-in-private/"&gt;How to Learn in Private&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;In Learning Gears, swxy defines three modes that he observed from people who successfully did learning in public. One of the modes is 'explorer'. The explorer's main problem to solve is that she does not know what she does not know. Hence, the explorer explores different areas/interests and documents the learning journey like notes to herself. I realized this 'explorer' is the mode that I am currently in. &lt;/p&gt;

&lt;p&gt;From Learning In Private, the author shares effective ways of learning in private. One way that I found out working well for me is very similar to the Feynman Technique. First, I start with the questions that I would like to answer. I write a bunch of questions I have asked myself. Then I try to answer these questions by myself. During this process, I do two things. (1) I shuffle the order of questions so when I answer those questions in order, my answer is presented in a more logical way. (2) I identify any knowledge gap while I am trying to answer my own questions, and come up with better questions. Here, the better questions meaning actionable questions which I can use to search online :)&lt;/p&gt;

&lt;p&gt;These two swyz's two articles helped me a lot to come up with my action plan for my personal learning. &lt;br&gt;
(1) I am going to be in the explorer mode in my personal learning. As an explorer, I am going to pick one topic per week, and I am going to explorer it during the week. &lt;br&gt;
(2) The success metrics of my learning are now going to be like the following:&lt;br&gt;
Was I able to answer all my own questions? &lt;br&gt;
Did I write snippets/notes during my exploration phase? &lt;br&gt;
Can I explain the topic that I explored effectively to others? &lt;/p&gt;

&lt;p&gt;In summary, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every week, I am going to explorer one topic. It can be the same as the previous week. The topic does not need to be technical. &lt;/li&gt;
&lt;li&gt;Considering my daily schedule, it is most likely that I am going to do heavy research on one of the weekends, and do some light research during weekdays. As of now, I am going to designate, my Sunday as the main research day. And I am going to spend at least 30 min every day to do further research on my topic. &lt;/li&gt;
&lt;li&gt;Every week, I am going to write a public note on what I learned for the week. This note doesn't need to be perfect as it is just an artifact during the intermediate process. Tag this type of notes as 'InProcess', and add a mindmap based on what I learn. &lt;/li&gt;
&lt;li&gt;When I feel like I answer all of my own questions and I feel like I reach the point where I can explain a certain concept/ a topic, I am going to make a public post on that topic. The post should be very easily understandable by anyone. Tag the post with 'final', and add a one-page mindmap. 

&lt;ul&gt;
&lt;li&gt;At this point, I think creating a final post and a final mindmap will take a week. &lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;Those above-mentioned rules are the rules that I can think of now. As I run my #LearningInPublic project, I hope I can find a more specific execution plan that works for me. &lt;/p&gt;

&lt;p&gt;I am really excited about this new learning opportunity! &lt;/p&gt;

&lt;p&gt;This week I am going to learn about &lt;a href="https://docs.microsoft.com/en-us/azure/kusto/concepts/"&gt;Kusto&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>personal</category>
      <category>learninpublic</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
