<?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: Mike Barlow</title>
    <description>The latest articles on DEV Community by Mike Barlow (@bardev).</description>
    <link>https://dev.to/bardev</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%2F47791%2F8d81fe80-e9b2-49ae-bb3a-065305ef1700.jpeg</url>
      <title>DEV Community: Mike Barlow</title>
      <link>https://dev.to/bardev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bardev"/>
    <language>en</language>
    <item>
      <title>Why Removing a AWS Security Group Rule Does Not Stop Traffic Flow</title>
      <dc:creator>Mike Barlow</dc:creator>
      <pubDate>Sun, 22 Oct 2017 23:51:58 +0000</pubDate>
      <link>https://dev.to/bardev/why-removing-a-aws-security-group-rule-does-not-stop-traffic-flow-53p</link>
      <guid>https://dev.to/bardev/why-removing-a-aws-security-group-rule-does-not-stop-traffic-flow-53p</guid>
      <description>

&lt;p&gt;Here’s the situation.  I created an AWS Security Group inbound rule to allow Ping, which allows me to ping an EC2 instance from my home computer. The issue is that when I remove the Ping inbound rule, Ping requests are still receiving a response.  I expect that when I remove the Ping inbound rule, the responses should stop.&lt;/p&gt;

&lt;p&gt;In this post, I will reproduce the issue and show you that this is a feature of AWS Security Groups and not a bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Setup:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1 VPC 192.168.0.0 /16&lt;/li&gt;
&lt;li&gt;1 AZ&lt;/li&gt;
&lt;li&gt;1 EC2 Instance with public IP – 54.245.15.244&lt;/li&gt;
&lt;li&gt;Internet Gateway (IGW)&lt;/li&gt;
&lt;li&gt;Route

&lt;ul&gt;
&lt;li&gt;0.0.0.0/0 -&amp;gt; igw-a664ec1&lt;/li&gt;
&lt;li&gt;All traffic can pass through IGW&lt;/li&gt;
&lt;li&gt;192.168.0.0/16 -&amp;gt; local&lt;/li&gt;
&lt;li&gt;All resources can talk to other resources within the IP Range&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Security Group assigned to EC2 Instance is empty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2cZ_O2NY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed1ddfd4ce4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2cZ_O2NY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed1ddfd4ce4.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are no inbound Rules for Security Group WBC-Web.  No traffic will be permitted&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tsGKwFm_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed1fcd59045.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tsGKwFm_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed1fcd59045.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even though this EC2 instance has a Public IP, no inbound traffic should reach this instance since this instance is associated the Security Group WBC-Web with no Inbound Rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DwWWDrzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed1f5c5fef1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DwWWDrzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed1f5c5fef1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s Validate this Setup
&lt;/h2&gt;

&lt;p&gt;From my home computer, if I ping the EC2 instance, I will receive a “request time out.” message&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--njAkD_bp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed209deb3fb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--njAkD_bp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed209deb3fb.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no response since the Security Group has no inbound rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Inbound Ping Rules
&lt;/h2&gt;

&lt;p&gt;In AWS console, I added the inbound rule to Security Group WBC-Web to allow ping from all IP addresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SMXmGcI3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed21b7bf3ab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SMXmGcI3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed21b7bf3ab.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if I try to ping the EC2 instance, I will receive a response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U_sQXiNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed222e6c4fd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U_sQXiNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed222e6c4fd.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Confusion
&lt;/h2&gt;

&lt;p&gt;If I remove the Security Group inbound ping rule, I continue to receive a response, which I do not expect. I expect the ping should timeout.&lt;/p&gt;

&lt;p&gt;To demonstrate this, I will run ping with the -t option. This will keep ping running until I cancel it manually.&lt;/p&gt;

&lt;p&gt;I will start the ping before I remove the ping rule.&lt;/p&gt;

&lt;p&gt;In the image below, the red line marks the point when I removed the ping inbound rule.  After I remove the ping inbound rule, a response is still returned.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q-2lwg8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed22eb0510e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q-2lwg8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed22eb0510e.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I stopped the ping and started the ping to see if I would still receive a response, which I did receive a response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MeVO35dj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed235fd9599.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MeVO35dj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed235fd9599.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I stop the ping again and waited a minute before starting it again. This time the ping finally timed out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CsdQm1Ia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed23ceea22c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CsdQm1Ia--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2017/10/img_59ed23ceea22c.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So What’s Going On
&lt;/h2&gt;

&lt;p&gt;For Security Groups there is a feature called Connection Tracking.  Connection Tracking is used to track information to and from an instance.&lt;/p&gt;

&lt;p&gt;When there’s a flow of traffic, for our example a ping, and the security group inbound rule is removed, the flow of traffic will not be stopped by the removal of the inbound rule.  The traffic is interrupted when it’s stopped on the client or the host for at least a few minutes.&lt;/p&gt;

&lt;p&gt;Removing the ping inbound rule while traffic is flowing will not interrupt or stop the flow of traffic. You must first stop the ping on the client or host and wait at least 1 minute before the removal of the inbound rule will take affect.&lt;/p&gt;

&lt;p&gt;I believe Amazon does a better job of describing this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not all flows of traffic are tracked. If a security group rule permits TCP or UDP flows for all traffic (0.0.0.0/0) and there is a corresponding rule in the other direction that permits all response traffic (0.0.0.0/0) for all ports (0-65535), then that flow of traffic is not tracked. The response traffic is therefore allowed to flow based on the inbound or outbound rule that permits the response traffic, and not on tracking information.&lt;/p&gt;

&lt;p&gt;TCP traffic on port 22 (SSH) to and from the instance is tracked, because the inbound rule allows traffic from &lt;code&gt;203.0.113.1/32&lt;/code&gt; only, and not all IP addresses (&lt;code&gt;0.0.0.0/0&lt;/code&gt;). TCP traffic on port 80 (HTTP) to and from the instance is not tracked, because both the inbound and outbound rules allow all traffic (&lt;code&gt;0.0.0.0/0&lt;/code&gt;). ICMP traffic is always tracked, regardless of rules.&lt;/p&gt;

&lt;p&gt;An existing flow of traffic that is tracked may not be interrupted when you remove the security group rule that enables that flow. Instead, the flow is interrupted when it’s stopped by you or the other host for at least a few minutes (or up to 5 days for established TCP connections). For UDP, this may require terminating actions on the remote side of the flow. An untracked flow of traffic is immediately interrupted if the rule that enables the flow is removed or modified. For example, if you remove a rule that allows all inbound SSH traffic to the instance, then your existing SSH connections to the instance are immediately dropped.&lt;/p&gt;

&lt;p&gt;Security Group – Connection Tracking&lt;/p&gt;

&lt;p&gt;&lt;a href="http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#security-group-connection-tracking"&gt;http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#security-group-connection-tracking&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s important to understand that if the traffic is being tracked and is flowing then removing an allow rule will not stop the traffic.&lt;/p&gt;

&lt;p&gt;The following are a few way to stop the traffic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Network Access Control List (ACL) inbound rule&lt;/li&gt;
&lt;li&gt;On the instance, disable the communication type or block the port&lt;/li&gt;
&lt;li&gt;Delete the Security Group&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While learning about AWS Security Groups, I ran into this situation and was very confused. It took a lot of digging to understand what was going on.  I hope that this will help others and that others will not go through the pain I went through.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update – Saturday, Nov 11, 2017
&lt;/h3&gt;

&lt;p&gt;This does not seem relevavent to SSH connections.  As soon as I remove an SSH inbound rule the SSH connection is terminated.  I assume SSH and RDP rules would function similarly.&lt;/p&gt;

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

&lt;p&gt;The post &lt;a href="http://www.bardev.com/2017/10/22/aws-security-group-stop-traffic-flow/"&gt;Why Removing a AWS Security Group Rule Does Not Stop Traffic Flow&lt;/a&gt; appeared first on &lt;a href="http://www.bardev.com"&gt;Mike Barlow (BarDev)&lt;/a&gt;.&lt;/p&gt;


</description>
      <category>aws</category>
      <category>security</category>
      <category>securitygroup</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Kick-start: Create a Linux(Ubuntu) Environment for Windows Developers using VirtualBox, VSCode, Git, NodeJS</title>
      <dc:creator>Mike Barlow</dc:creator>
      <pubDate>Mon, 20 Feb 2017 03:16:14 +0000</pubDate>
      <link>https://dev.to/bardev/kick-start-create-a-linuxubuntu-environment-for-windows-developers-using-virtualbox-vscode-git-nodejs-8ip</link>
      <guid>https://dev.to/bardev/kick-start-create-a-linuxubuntu-environment-for-windows-developers-using-virtualbox-vscode-git-nodejs-8ip</guid>
      <description>&lt;p&gt;I enjoy working with Visual Studio Code (VSCode). Since it’s available for Linux and Mac, I thought I would give it a try in a different environment. As a Windows developer, I’ve wanted to try out Linux. In the past when I have attempted to work in Linux, I was overwhelmed with all the tools, configuration and such that must be learned to be productive.&lt;/p&gt;

&lt;p&gt;I had a very difficult time finding beginner information that is current of setting up a Linux development environment. I found bits and pieces but nothing that showed end-to-end of how to get started.&lt;/p&gt;

&lt;p&gt;In this post, I will describe how to setup a development environment in Linux (Ubuntu). The main technologies I will work with are the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle VirtualBox – 5.1.14&lt;/li&gt;
&lt;li&gt;Linux Ubuntu 64-bit: 16.04&lt;/li&gt;
&lt;li&gt;Visual Studio Code (VSCode): 1.9.1&lt;/li&gt;
&lt;li&gt;NodeJS: 6.9.5&lt;/li&gt;
&lt;li&gt;Git: 2.7.4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post is about setting up a basic Linux (Ubuntu) development environment.  I assume that the user is familiar with Windows and has very basic knowledge of hypervisor software to manage virtual machines.&lt;/p&gt;

&lt;p&gt;I’m using Windows 10 as my host system. I don’t believe it should matter what host you are using, because other than VirtualBox, everything in this post will be installed on Linux Ubuntu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing VirtualBox
&lt;/h2&gt;

&lt;p&gt;We need somehow to run Ubuntu. To do this we need a Hypervisor. A hypervisor is software that runs virtual machines. There are many hypervisors available (Hyper-V, VMWare, VirtualBox, etc). I have selected Oracle VirtualBox for the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs on Windows&lt;/li&gt;
&lt;li&gt;Free for personal use&lt;/li&gt;
&lt;li&gt;Easy to use&lt;/li&gt;
&lt;li&gt;Very popular&lt;/li&gt;
&lt;li&gt;Large Community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s install VirtualBox by going to VirtualBox webpage:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.virtualbox.org/wiki/Downloads" rel="noopener noreferrer"&gt;https://www.virtualbox.org/wiki/Downloads&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb.png" title="VirtualBaox Download" alt="VirtualBaox Download"&gt;&lt;/a&gt;VirtualBaox Download&lt;/p&gt;

&lt;p&gt;Once at the VirtualBox Download webpage, download VirtualBox&lt;/p&gt;

&lt;p&gt;After downloading VirtualBox,  install it.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-1.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-1.png" title="VirtualBaox Install" alt="VirtualBaox Install"&gt;&lt;/a&gt;VirtualBaox Install&lt;/p&gt;

&lt;h2&gt;
  
  
   Download Linux Ubuntu Desktop
&lt;/h2&gt;

&lt;p&gt;When we create our virtual machine using VirtualBox we will need an image (iso) of Ubuntu to install. We will get this iso from Ubuntu’s website. It’s important that you download the desktop version of Ubuntu. Download Ubuntu Desktop from here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ubuntu.com/download/desktop" rel="noopener noreferrer"&gt;https://www.ubuntu.com/download/desktop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-2.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-2.png" title="Ubuntu Desktop Download" alt="Ubuntu Desktop Download"&gt;&lt;/a&gt;Ubuntu Desktop Download&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Note:&lt;/u&gt;&lt;/strong&gt; We will be running Ubuntu 64-bit. If you are running Windows 10, you may have issues installing 64-bit version of Ubuntu. I’m not sure if Hyper-V is installed by default on Windows 10, but if it is installed, you will need to uninstall it if you want to run 64-bit virtual machines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;  While investigating Docker for Windows, I stumble across this&lt;br&gt;&lt;br&gt;
“Docker for Windows requires Microsoft Hyper-V to run. After Hyper-V is enabled, VirtualBox will no longer work, but any VirtualBox VM images will remain.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FDocker-for-Window-and-Hyper-V.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/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FDocker-for-Window-and-Hyper-V.png" title="Docker for Window and Hyper-V" alt="Docker for Window and Hyper-V"&gt;&lt;/a&gt;&lt;a href="https://docs.docker.com/docker-for-windows/install/#/what-to-know-before-you-install" rel="noopener noreferrer"&gt; &lt;/a&gt;&lt;a href="https://docs.docker.com/docker-for-windows/install/#/what-to-know-before-you-install" rel="noopener noreferrer"&gt;https://docs.docker.com/docker-for-windows/install/#/what-to-know-before-you-install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To uninstall Hyper-V, open “Turn Windows features on or off”. You can do this by going to the start menu and typing “Turn”&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-3.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-3.png" title="Turn Windows features on or off for Hyper-v" alt="Turn Windows features on or off for Hyper-v"&gt;&lt;/a&gt;Turn Windows features on or off for Hyper-v&lt;/p&gt;

&lt;p&gt;Now uncheck Hyper-V and click “OK”. This will require a few restarts.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-4.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-4.png" title="Turn off Hyper-v" alt="Turn off Hyper-v in Windows"&gt;&lt;/a&gt;Turn off Hyper-v in Windows&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Ubuntu Virtual Machine
&lt;/h2&gt;

&lt;p&gt;Now let’s get to the fun part. Lets install Ubuntu as a virtual machine on VirtualBox. Start VirtualBox. Once VirtualBox starts, you should see something like the following image.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/SNAGHTML43b9101.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FSNAGHTML43b9101_thumb.png" title="Oracle VM VirtualBox Manager" alt="Oracle VM VirtualBox Manager"&gt;&lt;/a&gt;Oracle VM VirtualBox Manager&lt;/p&gt;

&lt;p&gt;To create a virtual machine (VM), select the button “New”. You should see a form to create a new Virtual Machine (see image below). In the form enter a Name. The name I used is “UbuntuDemo”. Once you type “Ubuntu”, notice the “Type” and “Version” is automatically selected. Also, notice that the version is “64-bit”. If you do not see “64-bit” then refer to the note above about Windows 10 &amp;amp; Hyper-V.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;  Here, were are not installing Ubuntu on the virtual machine.  This will be done later. Here are just configuring and setting-up the virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Ubuntu Minimum and Recommended System Requirements&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FUbuntu-Desktop-16-Minimum-System-Requirements.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/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FUbuntu-Desktop-16-Minimum-System-Requirements.png" title="Ubuntu Desktop 16 Minimum System Requirements" alt="Ubuntu Desktop 16 Minimum System Requirements"&gt;&lt;/a&gt;&lt;a href="https://help.ubuntu.com/community/Installation/SystemRequirements" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://help.ubuntu.com/community/Installation/SystemRequirements" rel="noopener noreferrer"&gt;https://help.ubuntu.com/community/Installation/SystemRequirements&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FUbuntu-Desktop-16-Recommend-System-Requirements.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/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FUbuntu-Desktop-16-Recommend-System-Requirements.png" title="Ubuntu Desktop 16 Recommend System Requirements" alt="Ubuntu Desktop 16 Recommend System Requirements"&gt;&lt;/a&gt;&lt;a href="https://www.ubuntu.com/download/desktop" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.ubuntu.com/download/desktop" rel="noopener noreferrer"&gt;https://www.ubuntu.com/download/desktop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ubuntu will run on 2 GB of memory, but that is the recommended requirements. I went ahead and set the memory for this Ubuntu virtual machine to 4 GB.&lt;/p&gt;

&lt;p&gt;Set the Hard disk option to “Create a virtual hard disk now” and select “Create” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-5.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-5.png" title="Create Virtual Machine" alt="Create Virtual Machine"&gt;&lt;/a&gt;Create Virtual Machine&lt;/p&gt;

&lt;p&gt;Now let’s create the hard disk. On the next form, for the most part, you can keep all the defaults except for the “File Size” option. Ubuntu recommended requirement is 25 GB for the disk size. To be safe and so that I can install additional software on the Ubuntu virtual machine, I set the file size to 30 GB.&lt;/p&gt;

&lt;p&gt;I leave everything else as default. Now select the “Create” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-6.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-6.png" title="Create Virtual Hard Disk" alt=" Create Virtual Hard Disk"&gt;&lt;/a&gt;Create Virtual Hard Disk&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;  I just looked at VirtualBox Virtual Media Manager for the actual size of disk spaced used by Ubuntu.  It was only 4.86 GB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FVirtualBox-Virtual-Media-Manager-300x246.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/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2FVirtualBox-Virtual-Media-Manager-300x246.png" alt="VirtualBox Virtual Media Manager"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Ubuntu Virtual Machine
&lt;/h2&gt;

&lt;p&gt;Here we will make some basic changes to the virtual machine configuration. We will change the number of processors the virtual machine uses and enable the ability to share the clipboard between our Windows 10 host and the Ubuntu virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Note:&lt;/u&gt;&lt;/strong&gt; For these changes to take affect the virtual machine will need to be stopped or if the virtual machine is running, it will need to be restarted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Note:&lt;/u&gt;&lt;/strong&gt;  In the following images for Oracle VM VirtualBox Manager, there are two virtual machines. Please ignore the first “ubuntu” vm.  We will be creating the “UbuntuDemo” vm.&lt;/p&gt;

&lt;p&gt;To change virtual machine settings, select “UbuntuDemo” from Virtual Box, and then select “Settings” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-7.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-7.png" title="Configure Oracle VM VirtualBox Managaer Settings" alt=" Configure Oracle VM VirtualBox Managaer Settings"&gt;&lt;/a&gt;Configure Oracle VM VirtualBox Managaer Settings&lt;/p&gt;

&lt;p&gt;To enable the ability to enable clipboard sharing, select the “General” from the left navigation. Then select the “Advanced” tab. Now change the settings for “Shared Clipboard” and “Drag’n Drop” to Bidirectional.&lt;/p&gt;

&lt;p&gt;This feature comes in handy when you want to copy and pasted text from your host to the virtual machine or visa-verse.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-8.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-8.png" title="Configure Oracle VM VirtualBox Manager Settings Shared Clipboard &amp;amp; Drag n' Drop" alt="Configure Oracle VM VirtualBox Manager Settings Shared Clipboard &amp;amp; Drag n' Drop"&gt;&lt;/a&gt;Configure Oracle VM VirtualBox Manager Settings Shared Clipboard &amp;amp; Drag n’ Drop&lt;/p&gt;

&lt;p&gt;By default, the Ubuntu virtual machine is configured to use only one processor. On my computer the Ubuntu VM runs a little sluggish with only one processor, so I went ahead and up the processor to 3. Depending on your computer, you may want to change this setting.&lt;/p&gt;

&lt;p&gt;To change the number of processors, in settings dialog select the “System” in the left-side navigation. Then select the “Processor” tab. At this point, you can change the number of processors that the VM will use&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-9.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-9.png" title="Configure Oracle VM VirtualBox Manager Settings Processor Count" alt="Configure Oracle VM VirtualBox Manager Settings Processor Count"&gt;&lt;/a&gt;Configure Oracle VM VirtualBox Manager Settings Processor Count&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Ubuntu
&lt;/h2&gt;

&lt;p&gt;Now that we have the virtual machine configured, let’s start the VM and install Ubuntu.&lt;/p&gt;

&lt;p&gt;To start a virtual machine, in VirtualBox Manager select “UbuntuDemo” and then select the “Start” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-10.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-10.png" title="Start Ubuntu Virtual Machine from Oracle VM VirtualBox Manager" alt="Start Ubuntu Virtual Machine from Oracle VM VirtualBox Manager"&gt;&lt;/a&gt;Start Ubuntu Virtual Machine from Oracle VM VirtualBox Manager&lt;/p&gt;

&lt;p&gt;The virtual machine will start in a new window. The first screen you will see is a dialog to select the start-up disk. This is where we install Ubuntu on the virtual machine. We need to tell the virtual machine where the Ubuntu Desktop installation file is located.&lt;/p&gt;

&lt;p&gt;On “Select start-up disk” dialog, select the small folder icon in the bottom right corner. Another dialog (not shown) will be displayed to select the Ubunto .iso file to install. My iso file was called “ubuntu-16.04.2-desktop-amd64.iso”; the name of your file may be a little different.&lt;/p&gt;

&lt;p&gt;Once you find the Ubuntu .iso file, select the “Start” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-11.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-11.png" title="Select Ubuntu file image to install on Virtual Machine" alt="Select Ubuntu file image to install on Virtual Machine"&gt;&lt;/a&gt;Select Ubuntu file image to install on Virtual Machine&lt;/p&gt;

&lt;p&gt;After you click “Start”, you should be prompted to install Ubuntu. Select “Install Ubuntu” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-12.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-12.png" title="Setup Ubuntu Welcome " alt="Setup Ubuntu Welcome"&gt;&lt;/a&gt;Setup Ubuntu Welcome “Install Ubuntu&lt;/p&gt;

&lt;p&gt;The following dialogs are fairly straight forward. I will not step you through these next few dialogs, but for your convenience, I have included the screenshots of the dialogs.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-13.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-13.png" title="Ubuntu setup and Install - Preparing to install Ubuntu" alt=" Ubuntu setup and Install - Preparing to install Ubuntu"&gt;&lt;/a&gt;Ubuntu setup and Install – Preparing to install Ubuntu&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-14.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-14.png" title="Ubuntu setup and Install - Installation Type" alt="Ubuntu setup and Install - Installation Type"&gt;&lt;/a&gt;Ubuntu setup and Install – Installation Type&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-15.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-15.png" title="Ubuntu setup and Install - Installation Type confirmation" alt="Ubuntu setup and Install - Installation Type confirmation"&gt;&lt;/a&gt;Ubuntu setup and Install – Installation Type confirmation&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-16.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-16.png" title="Ubuntu setup and Install - Where are you" alt="Ubuntu setup and Install - Where are you"&gt;&lt;/a&gt;Ubuntu setup and Install – Where are you&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-17.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-17.png" title="Ubuntu setup and Install - Keyboard Layout" alt="Ubuntu setup and Install - Keyboard Layout"&gt;&lt;/a&gt;Ubuntu setup and Install – Keyboard Layout&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-18.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-18.png" title="Ubuntu setup and Install - Who Are you" alt="Ubuntu setup and Install - Who Are you"&gt;&lt;/a&gt;Ubuntu setup and Install – Who Are you&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-19.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-19.png" title="Ubuntu setup and Install - Welcome to Ubuntu" alt="Ubuntu setup and Install - Welcome to Ubuntu"&gt;&lt;/a&gt;Ubuntu setup and Install – Welcome to Ubuntu&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-20.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-20.png" title="Ubuntu setup and Install - Installation Complete - Restart" alt="Ubuntu setup and Install - Installation Complete - Restart"&gt;&lt;/a&gt;Ubuntu setup and Install – Installation Complete – Restart&lt;/p&gt;

&lt;p&gt;After you select “Restart Now”, you may get a message “Please remove the installation medium…”. If you get this message, it means that the Ubuntu .iso file is still attached to the virtual machine optical drive. If you continue without detaching the Ubuntu .iso file from the virtual machine, you will go through the installation process again.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-21.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-21.png" title="VirtualBox Ubuntu. Please remove installation medium, then press ENTER" alt="VirtualBox Ubuntu. Please remove installation medium, then press ENTER"&gt;&lt;/a&gt;VirtualBox Ubuntu. Please remove installation medium, then press ENTER&lt;/p&gt;

&lt;p&gt;To detach (remove) the Ubuntu .iso from the virtual machine, on the virtual machine window select “Devices” –&amp;gt; “Optical Drives” –&amp;gt; “Remove disk from virtual drive”. Now press “Enter” on your keyboard. Now Ubuntu will start.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-22.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-22.png" title="How to remove installation medium from VirtualBox" alt="How to remove installation medium from VirtualBox"&gt;&lt;/a&gt;How to remove installation medium from VirtualBox&lt;/p&gt;

&lt;p&gt;Once Ubuntu starts, you should see a screen like the following. Ubuntu is now successfully installed.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-23.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-23.png" title="Ubuntu installation complete first screen" alt="Ubuntu installation complete first screen"&gt;&lt;/a&gt;Ubuntu installation complete first screen&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To shut down Ubuntu from Ubuntu, in the top right corner of the desktop is the current time, misc buttons, and a power button. Selecting the power button will show you a menu with “Shut Down” as an option.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-24.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-24.png" title="Ubuntu Power Button" alt="Ubuntu Power Button"&gt;&lt;/a&gt;Ubuntu Power Button&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-25.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-25.png" title="Ubuntu shut down" alt="Ubuntu shut down"&gt;&lt;/a&gt;Ubuntu shut down&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Google Chrome
&lt;/h2&gt;

&lt;p&gt;First thing I do after I install Ubuntu is to install Google Chrome browser. Firefox is installed by default on Ubuntu, but you can install another browser if you want. By installing Google Chrome, I present some of the dialogs that will be show when installing software on Ubuntu.&lt;/p&gt;

&lt;p&gt;Google Chrome Desktop Download&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com/chrome/browser/desktop/" rel="noopener noreferrer"&gt;https://www.google.com/chrome/browser/desktop/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-26.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-26.png" title="Download Google Chrome" alt="Download Google Chrome"&gt;&lt;/a&gt;Download Google Chrome&lt;/p&gt;

&lt;p&gt;Once you select download, you will prompted to select what type of Linux you are running. We are running a derivative of Debian. Therefore, select the option that includes “.deb”&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-27.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-27.png" title="Download Google Chrome for Linux - 64 bit .deb for Debian and Ubuntu" alt="Download Google Chrome for Linux - 64 bit .deb for Debian and Ubuntu"&gt;&lt;/a&gt;Download Google Chrome for Linux – 64 bit .deb for Debian and Ubuntu&lt;/p&gt;

&lt;p&gt;Once you select “Accept and install”, you will be prompted what to do with the file. I usually just open the file, but if you want, you can save the file.&lt;/p&gt;

&lt;p&gt;Since I don’t expect I will need to install Google Chrome again, I will select the “Open with” option.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-28.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-28.png" title="Chrome Download options on Ubuntu" alt="Chrome Download options"&gt;&lt;/a&gt;Chrome Download options&lt;/p&gt;

&lt;p&gt;When installing software, Ubuntu will prompt you to confirm that you trust the software you are installing. If you do trust the software you are installing, select the “install” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-29.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-29.png" title="Confirm installing software on Ubuntu" alt=" Confirm installing software"&gt;&lt;/a&gt;Confirm installing software&lt;/p&gt;

&lt;p&gt;Now enter your password “demo” in the Authenticate dialog to continue to install your software. Your password may be different.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-30.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-30.png" title="Authenticate installing software on Ubuntu" alt="Authenticate installing software"&gt;&lt;/a&gt;Authenticate installing software&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Applications – Google Chrome
&lt;/h2&gt;

&lt;p&gt;I want to install Visual Studio Code (VSCode). But to do this I need to download it first using Chrome. There are a few ways to start an application. I’m going to show you the main way I start programs that are not on the application bar.&lt;/p&gt;

&lt;p&gt;In the top left corner of the desktop, there is a purple icon (see image below). This icon opens “Dash”. Dash provides the ability to search for applications, files, music and etc. Since we want to start Chrome, select the “Dash” icon and type “chrome” in the text box. An icon for Chrome will display. Select the Chrome icon to start Chrome.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/u&gt; You can open “Dash” search prompt by using the win key on your keyboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Note:&lt;/u&gt;&lt;/strong&gt; The icons that are displayed can be dragged-n-dropped to the application toolbar.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-31.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-31.png" title="Run Chrome Application with Ubuntu Dash" alt="Run Chrome Application with Ubuntu Dash"&gt;&lt;/a&gt;Run Chrome Application with Ubuntu Dash&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Visual Studio Code (VSCode)
&lt;/h2&gt;

&lt;p&gt;Now let’s install Visual Studio code. But first, we need to download it.&lt;/p&gt;

&lt;p&gt;In Chrome or browser of choice, navigate to:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;https://code.visualstudio.com/download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select to download the .deb (Debian) version of VSCode&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-32.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-32.png" title="Download Visual Studio Code (VSCode) for Ubuntu .dib" alt="Download Visual Studio Code (VSCode) for Ubuntu .dib"&gt;&lt;/a&gt;Download Visual Studio Code (VSCode) for Ubuntu .dib&lt;/p&gt;

&lt;p&gt;The installation process of VSCode is the same as installing Chrome, which we did above. I will go ahead and provide images of the installation process.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-33.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-33.png" title="Ubuntu Install Application" alt="Ubuntu Install Application"&gt;&lt;/a&gt;Ubuntu Install Application&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-34.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-34.png" title="Authenticate installation with password on Ubuntu" alt="Authenticate installation with password"&gt;&lt;/a&gt;Authenticate installation with password&lt;/p&gt;

&lt;p&gt;Now that VSCode is installed, we can now run it. The process to run VSCode is the same as running any other application. Open “Dash” search and type “Code” in the text box.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-35.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-35.png" title="Run Visual Studio Code (VSCode) in Ubuntu using Dash" alt="Run Visual Studio Code (VSCode) in Ubuntu using Dash"&gt;&lt;/a&gt;Run Visual Studio Code (VSCode) in Ubuntu using Dash&lt;/p&gt;

&lt;p&gt;Now VSCode will launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Node.js
&lt;/h2&gt;

&lt;p&gt;Node.js is very popular these days. I use Node in most of my web development. Since this is a common tool, let’s install it.&lt;/p&gt;

&lt;p&gt;Instead of downloading and installing from a website, we will use a tool similar to Windows Command Prompt or PowerShell to install Node. In Ubuntu, this tool is called Terminal.&lt;/p&gt;

&lt;p&gt;To start the application Terminal. Open “Dash” search, type terminal in the text box. You may get multiple results, but select the application named “Terminal”.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-36.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-36.png" title="Ubuntu terminal using Dash" alt="Ubuntu terminal using Dash"&gt;&lt;/a&gt;Ubuntu terminal using Dash&lt;/p&gt;

&lt;p&gt;Here’s the documentation to install NodeJS using a package manager. Go to the section “Debian and Ubuntu based Linux distributions”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/download/package-manager/" rel="noopener noreferrer"&gt;https://nodejs.org/en/download/package-manager/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Node documentation, it shows the following command to run to install Node&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-37.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-37.png" title="Using Curl to install nodejs on Ubuntu" alt="Using Curl to install nodejs on Ubuntu"&gt;&lt;/a&gt;Using Curl to install nodejs on Ubuntu&lt;/p&gt;

&lt;p&gt;If you try to run the commands above, you get an error that ‘curl’ is not installed.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-38.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-38.png" title="Error running curl in Ubuntu terminal" alt="Error running curl in Ubuntu terminal"&gt;&lt;/a&gt;Error running curl in Ubuntu terminal&lt;/p&gt;

&lt;p&gt;Let’s install Curl.&lt;/p&gt;

&lt;p&gt;In the terminal enter the following&lt;/p&gt;

&lt;p&gt;sudo apt install curl&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-39.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-39.png" title="installing curl using terminal in ubuntu" alt="installing curl using terminal in ubuntu"&gt;&lt;/a&gt;installing curl using terminal in ubuntu&lt;/p&gt;

&lt;p&gt;Now that curl is installed, now we can try to install Node.&lt;/p&gt;

&lt;p&gt;First, we need to select what version of Node we want, this is done using Curl. Use the following command in Terminal.&lt;/p&gt;

&lt;p&gt;curl -sL &lt;a href="https://deb.nodesource.com/setup_6.x" rel="noopener noreferrer"&gt;https://deb.nodesource.com/setup_6.x&lt;/a&gt; | sudo -E bash –&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-40.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-40.png" title="using curl using to download nodejs on Ubuntu" alt="using curl using to download nodejs on Ubuntu"&gt;&lt;/a&gt;using curl using to download nodejs on Ubuntu&lt;/p&gt;

&lt;p&gt;Now to install Node, use the following command:&lt;/p&gt;

&lt;p&gt;sudo apt-get install -y nodejs&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-41.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-41.png" title="install nodejs using sudo and apt-get on Ubuntu" alt="install nodejs using sudo and apt-get on Ubuntu"&gt;&lt;/a&gt;install nodejs using sudo and apt-get on Ubuntu&lt;/p&gt;

&lt;p&gt;Now let’s validate that Node was installed successfully.&lt;/p&gt;

&lt;p&gt;In Terminal, type “node”. This will show the “&amp;gt;”. Now type “4+4” and then enter. The answer of 8 should be returned. We have now confirmed that Node is installed. To exit node press [ctrl]+C twice.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-42.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-42.png" title="confirming Nodejs was installed successfully on Ubuntu" alt="confirming Nodejs was installed successfully on Ubuntu"&gt;&lt;/a&gt;confirming Nodejs was installed successfully on Ubuntu&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Git
&lt;/h2&gt;

&lt;p&gt;Another common tool that is used by developers, is Git. Git is a source code repository.&lt;/p&gt;

&lt;p&gt;We are going to install Git similarly to how we installed Node, but without using Curl. To install Git, enter the following:&lt;/p&gt;

&lt;p&gt;sudo apt-get install git&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-43.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-43.png" title="installing git using terminal, sudo, and apt-get on Ubuntu" alt="installing git using terminal, sudo, and apt-get on Ubuntu"&gt;&lt;/a&gt;installing git using terminal, sudo, and apt-get on Ubuntu&lt;/p&gt;

&lt;p&gt;Enter the following to confirm that Git was installed:&lt;/p&gt;

&lt;p&gt;git –version&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2017/02/image-44.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fwww.bardev.com%2Fwp-content%2Fuploads%2F2017%2F02%2Fimage_thumb-44.png" title="confirming git install successfully using git --version on Ubuntu" alt="confirming git install successfully using git --version on Ubuntu"&gt;&lt;/a&gt;confirming git install successfully using git –version on Ubuntu&lt;/p&gt;

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

&lt;p&gt;If you never have used Linux and want to get started developing in a Linux environment, it can be difficult. Hopefully this post has helped you kick-start your software development in Linux Ubuntu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resource
&lt;/h2&gt;

&lt;p&gt;Comparison of platform virtualization software&lt;br&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Comparison_of_platform_virtualization_software" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Comparison_of_platform_virtualization_software&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How To Install Git on Ubuntu 16.04&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-git-on-ubuntu-16-04" rel="noopener noreferrer"&gt;https://www.digitalocean.com/community/tutorials/how-to-install-git-on-ubuntu-16-04&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installing Node.js via package manager&lt;br&gt;&lt;br&gt;
&lt;a href="https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions" rel="noopener noreferrer"&gt;https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ubuntu – Package management with APT&lt;br&gt;&lt;br&gt;
&lt;a href="https://help.ubuntu.com/community/AptGet/Howto" rel="noopener noreferrer"&gt;https://help.ubuntu.com/community/AptGet/Howto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Running VS Code on Linux&lt;br&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/setup/linux" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/setup/linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="http://www.bardev.com/2017/02/19/kick-start-linux-ubuntu-visual-studio-code-vscode-for-windows-developers/" rel="noopener noreferrer"&gt;Kick-start: Create a Linux(Ubuntu) Environment for Windows Developers using VirtualBox, VSCode, Git, NodeJS&lt;/a&gt; appeared first on &lt;a href="http://www.bardev.com" rel="noopener noreferrer"&gt;Mike Barlow (BarDev)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>configuration</category>
      <category>tutorial</category>
      <category>ubuntu</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Duck Typing</title>
      <dc:creator>Mike Barlow</dc:creator>
      <pubDate>Sun, 26 Jun 2016 22:16:18 +0000</pubDate>
      <link>https://dev.to/bardev/duck-typing-84l</link>
      <guid>https://dev.to/bardev/duck-typing-84l</guid>
      <description>&lt;p&gt;In this post I will describe Duck Typing in regards to dynamic languages (JavaScript, PHP, Python, Ruby).&lt;/p&gt;

&lt;p&gt;If you ever read or heard about Duck Typing, you have probably seen the following quote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If it walks like a duck and quacks like a duck, it must be a duck.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without context, this quote doesn’t mean much.  Hopefully at the end of this post the previous quote will make much more sense.&lt;/p&gt;

&lt;p&gt;Below is an excerpt from Wikipedia.  Without understanding Duck Typing, the following excerpt doesn’t make much sense either.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Duck Typing requires that type checking is deferred to runtime, and is implemented by means of dynamic typing or reflection.&lt;/p&gt;

&lt;p&gt;Duck typing is concerned with establishing the suitability of an object for some purpose. With normal typing, suitability is assumed to be determined by an object’s type only. In duck typing, an object’s suitability is determined by the presence of certain &lt;em&gt;methods and properties&lt;/em&gt; (with appropriate meaning), rather than the actual type of the object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Duck_typing"&gt;https://en.wikipedia.org/wiki/Duck_typing&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Duck Typing in JavaScript – Dynamic Language
&lt;/h3&gt;

&lt;p&gt;In the following examples, we are going to create following 3 different objects in JavaScript&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;point2D&lt;/li&gt;
&lt;li&gt;point3D &lt;/li&gt;
&lt;li&gt;me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three objects  will include properties: name,  x and y, they  also include a calculate() function.  The Me object will include the properties occupation and birthDate. See image below for a visualization for object model.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.bardev.com/wp-content/uploads/2016/06/image-14.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--loCm3p8---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://www.bardev.com/wp-content/uploads/2016/06/image_thumb-14.png" alt="image" title="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the code below, I created the three object (point2D, point3d, me).  I also created a function called calculate() for each object.  The calculate() function for all the objects returns a string. &lt;/p&gt;

&lt;p&gt;There is a displayPoint() function defined.  This function could just have been called display().  The function displayPoint() has one parameter called “point”.   The function signature looks like this:&lt;/p&gt;

&lt;p&gt;function displayPoint(point)&lt;/p&gt;

&lt;p&gt;The parameter name “point” doesn’t mean anything.  I could have called it “obj”.  I called the function “displayPoint” and the parameter “point” because contextually the function is created to work with points.  Even though I created the function displayPoint(point) to work with points, but I can pass any type of object as a parameter in to the function.&lt;/p&gt;

&lt;p&gt;In function displayPoint(point) the code accesses the property “name” and the method “calculate()” of the object “point”. It doesn’t matter what type of object is passed in to the function “displayPoint”, but the object must have the property “name” and the method “calculate()” to run without an error.&lt;/p&gt;

&lt;p&gt;This is Duck Typing.&lt;/p&gt;

&lt;p&gt;What is the “me” object? Is it a person or a point – both, neither?  What do the properties x and y represents.  The properties x and y could represent a point, but they could also be pointers (reference) to XY chromosomes.  But in this context of the method “displayPoint”, the object “me”, and the properties x and y are points and treated like points.&lt;/p&gt;

&lt;p&gt;Now, the following quote has context. I hope it makes more sense now.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If it walks like a duck and quacks like a duck, it must be a duck.&lt;/p&gt;
&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx/"&gt;How Duck Typing Benefits C# Developers – Phil Haack&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Duck_typing"&gt;Wikipedia – Duck Typing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://basarat.gitbooks.io/typescript/content/docs/why-typescript.html"&gt;Why TypeScript&lt;/a&gt; – See Section: Types are Structural &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="http://www.bardev.com/2016/06/26/duck-typing/"&gt;Duck Typing&lt;/a&gt; appeared first on &lt;a href="http://www.bardev.com"&gt;Mike Barlow (BarDev)&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
  </channel>
</rss>
