<?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: Rajiv Thummala</title>
    <description>The latest articles on DEV Community by Rajiv Thummala (@rajivthummalapsu).</description>
    <link>https://dev.to/rajivthummalapsu</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%2F794990%2F198587cb-6651-4d40-8ab8-9d1853b954be.png</url>
      <title>DEV Community: Rajiv Thummala</title>
      <link>https://dev.to/rajivthummalapsu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rajivthummalapsu"/>
    <language>en</language>
    <item>
      <title>Vercel Based Development Workflows: The Next Advent in the Rise of Microservice Architecture</title>
      <dc:creator>Rajiv Thummala</dc:creator>
      <pubDate>Mon, 14 Mar 2022 01:12:56 +0000</pubDate>
      <link>https://dev.to/rajivthummalapsu/vercel-based-development-workflows-the-next-advent-in-the-rise-of-microservice-architecture-2d33</link>
      <guid>https://dev.to/rajivthummalapsu/vercel-based-development-workflows-the-next-advent-in-the-rise-of-microservice-architecture-2d33</guid>
      <description>&lt;p&gt;When it comes to application deployment, there are a myriad of tools that can be explored and leveraged. With a field as non-static as software development and deployment, however, it is vital to consistently survey the tools on the market to optimize your projects. &lt;/p&gt;

&lt;p&gt;Perhaps one of the most potent and swift tools to use in website deployment currently is &lt;strong&gt;&lt;a href="//vercel.com"&gt;Vercel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vercel totes a multitude of benefits such as free domain names, automatic deployments, a marketplace, serverless functions, and the ability to connect teams. In my opinion, it is one of the easiest and non-taxing platforms to deploy a website. &lt;/p&gt;

&lt;p&gt;As adumbrated by &lt;a href="https://medium.com/nerd-for-tech/5-reasons-why-vercel-is-the-best-for-application-deployment-92009b17e601"&gt;medium.com&lt;/a&gt;, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By connecting the GitHub repository in the Vercel you can simply deploy the master or main branch to the Vercel domains.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Functions as a Service Architecture&lt;/strong&gt;&lt;br&gt;
What exactly is meant by &lt;em&gt;functions as a service architecture&lt;/em&gt;? &lt;a href="https://searchitoperations.techtarget.com/definition/function-as-a-service-FaaS"&gt;Searchitoperations &lt;/a&gt;explains it quite well. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Function as a service (FaaS) is a cloud computing model that enables cloud customers to develop applications and deploy functionalities and only be charged when the functionality executes. FaaS is often used to deploy microservices and may also be referred to as serverless computing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essentially, in layman's terms, the functions as a service architecture is a format in which you can create an application that enables you to sell its individual functions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FePTpp85--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbtse2hr89m1u3zdv8nf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FePTpp85--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fbtse2hr89m1u3zdv8nf.png" alt="Image description" width="300" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When leveraging the function as a service architecture, developers do not have to worry about things such as server allocation and backend services. This is because the serverless provider takes care of all these extra tasks. Thus, all you have to do is write the code for your application and you can let Vercel handle the rest. &lt;/p&gt;

&lt;p&gt;There are numerous other pros to using this architecture as well. They are outlined by &lt;a href="https://www.cloudflare.com/learning/serverless/glossary/function-as-a-service-faas/"&gt;CloudFlare &lt;/a&gt;as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Improved developer velocity&lt;/strong&gt;&lt;br&gt;
With FaaS, developers can spend more time writing application logic and less time worrying about servers and deploys. This typically means a much faster development turnaround.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in scalability&lt;/strong&gt;&lt;br&gt;
Since FaaS code is inherently scalable, developers don’t have to worry about creating contingencies for high traffic or heavy use. The serverless provider will handle all of the scaling concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost efficiency&lt;/strong&gt;&lt;br&gt;
Unlike traditional cloud providers, serverless FaaS providers do not charge their clients for idle computation time. Because of this, clients only pay for as much computation time as they use, and do not need to waste money over-provisioning cloud resources.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thus, now you may start to get an understanding of why microservice software engineering is so vital to learn currently. With architectures such as function as a service lowering the amount of resources that must be consumed, it is a no brainer that companies are enticed by this advent. After all, who wouldn't want to save money and lower the stress on developers at the same time?&lt;/p&gt;

&lt;p&gt;Specific Development Challenges that can be solved with leveraging this architecture is outlined quite well by Michael Potter of &lt;a href="https://www.redhat.com/architect/micro-frontend-architecture"&gt;Redhat&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limited deployments:&lt;/strong&gt; Monoliths, not always but typically, opt for long sprints between deployments. This reduces the risk of new features introducing regressions to its extensive feature set but makes it more difficult for teams to plan and launch new features. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature collision:&lt;/strong&gt; Every feature in one bucket sometimes introduces regressions to other functionality (you'd be surprised how often this happens). This is why core teams try to limit the number of new features they introduce concurrently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited technology stack:&lt;/strong&gt; With monoliths, you have to work with the available tools. Integrating new technologies within the monolith is often a significant lift. Also, introducing new technology to the monolith means more responsibility for the team dedicated to ensuring uptime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ownership:&lt;/strong&gt; When you have large teams supporting a monolith, the responsibility for a feature may bounce from one developer to another. This sounds good on the surface but often leads to developers having to maintain product features they aren't entirely familiar with.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Getting started with Vercel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before we go ahead, you can view my live &lt;a href="https://vercel11ty-tutorial-1y9mdbbc9-rajivthummala-psu.vercel.app/"&gt;vercel demo&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;To demonstrate how to get started with Vercel, we are first going to be working with it locally and then we will go over how to deploy your own repository. In particular, pay attention to the contrasts between Vercel and GitHub and how relaxed the deployment functions. &lt;/p&gt;

&lt;p&gt;To start, clone &lt;a href="https://github.com/btopro/ist-vercel-demo"&gt;this repository&lt;/a&gt; to your computer. &lt;/p&gt;

&lt;p&gt;CD into your cloned repository and run &lt;code&gt;vercel dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Open the repo in vscode and make a file called &lt;strong&gt;.env&lt;/strong&gt; in the root. Add &lt;a href="https://gist.github.com/btopro/96bfbd6a5673b98d03d9f64b8f5c5c60"&gt;this &lt;/a&gt;to the contents of the file. &lt;/p&gt;

&lt;p&gt;This is an "environmental variable" file. This is a common thing on these sorts of service to keep security sensitive variables out of version control.&lt;/p&gt;

&lt;p&gt;Once you are done, save and then run npm install. Next, we are going to run the following command: &lt;code&gt;vercel dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rz1-IMks--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/82uc1x0mykcu2j9k1k4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rz1-IMks--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/82uc1x0mykcu2j9k1k4f.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This should build your site in a local host&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oWnCW1uz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qew4fzuzvybnuj9zyzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oWnCW1uz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qew4fzuzvybnuj9zyzm.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thats it! It is very simply to deploy. &lt;/p&gt;

&lt;p&gt;What exactly is vercel dev? The vercel website explains it quite well. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Single-Command Local Development&lt;/em&gt;&lt;br&gt;
Typically, developing a website or application involves a series of steps:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Cloning repositories&lt;/li&gt;
&lt;li&gt;Fetching packages&lt;/li&gt;
&lt;li&gt;Synchronizing and matching ports&lt;/li&gt;
&lt;li&gt;Downloading the right runtime for each programming language
&amp;gt; And so on...
&amp;gt;Even for modern projects, we often need to look up the README.md file for instructions about installing dependencies, and then tell a package manager to run developer scripts. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vercel gives you a different contract. &lt;em&gt;It is always Vercel dev.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Running the command "Vercel dev" will build your application swiftly and with ease. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying publicly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we start, you can look at &lt;a href="https://vercel11ty-tutorial-1y9mdbbc9-rajivthummala-psu.vercel.app/"&gt;my public Vercel repo of the demo we just worked on&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Head over to vercel.com and get your GitHub account connected. &lt;/p&gt;

&lt;p&gt;Go to your dashboard. Select new project&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0wC50jb2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tk7yn9zlqlwv233bupvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0wC50jb2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tk7yn9zlqlwv233bupvg.png" alt="Image description" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Import the repo that you want to deploy. Adjust the build settings if needed. My project builds out of a folder named "public" so I needed to let Vercel know. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fVXEhfQ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ryuu6mlpl60e8nr81950.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fVXEhfQ---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ryuu6mlpl60e8nr81950.png" alt="Image description" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now select deploy and your site should be running!&lt;/p&gt;

&lt;p&gt;**Here is one of my 11ty sites deployed on &lt;a href="https://11ty-scratch.vercel.app/"&gt;Vercel &lt;/a&gt;and &lt;a href="https://rajivthummala-psu.github.io/11tyScratch/"&gt;GitHub Pages&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iMIstS_X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4h7ny973bigp1cv33vuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iMIstS_X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4h7ny973bigp1cv33vuh.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SI5O39Pq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqac1z4zx7quv3d1vxft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SI5O39Pq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqac1z4zx7quv3d1vxft.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;_Vercel was 100x time easier than getting the GitHub pages to function correctly. _&lt;/p&gt;

&lt;p&gt;There are other CD/CI pipelines on the market that can be used as well. For instance, services such as monorepo enable you to easily generate a version controlled repo that contains a lot of projects. However, Vercel is in my opinion better than this service as monorepo often contains logically independent projects that have to be run by different teams/organizations. As stated by &lt;a href="https://semaphoreci.com/blog/cicd-pipeline"&gt;semaphoreci.com&lt;/a&gt;, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Doing CI/CD with a monorepo is a challenge. By default, every code change would launch a pipeline that would build, test, and deploy every single project included in the monorepo. This is time-wasting, costly, and a risky.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How Shoelace uses Vercel to deploy builds per branch
&lt;/h2&gt;

&lt;p&gt;Now we are going to be looking at how Shoelace leverages Vercel to deploy builds per branch. &lt;/p&gt;

&lt;p&gt;Start by cloning &lt;a href="https://github.com/shoelace-style/shoelace"&gt;this repo&lt;/a&gt; and then getting it linked to your Vercel account. Follow the same procedure aforementioned. &lt;/p&gt;

&lt;p&gt;Note that shoelace is building out of dist &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kRim1FME--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lts8v3ya3d7b7jqx4su9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kRim1FME--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lts8v3ya3d7b7jqx4su9.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wodLOCgb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3p8yge2smxb380eo61q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wodLOCgb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3p8yge2smxb380eo61q7.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://vercel.com/docs/concepts/git"&gt;Vercel&lt;/a&gt;, the main branch should essentially be perceived as the production. Every time a pull or merge request is made to a specific branch, Vercel generates a unique deployment. This enables a developer to view these changes in a previewed environment before merging this with the rest of your branches. Now it may start to become clear why shoelace leveraged Vercel in particular, as it enables this large stack of components (see image below) to be deployed and previewed in specific/separate branches. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vqLCX_Nw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k1exxbrsefv7rg8nt8qi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vqLCX_Nw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k1exxbrsefv7rg8nt8qi.png" alt="Image description" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Shoelace also configures Vercel directly by leveraging the vercel.json file. This file as stated by vercel, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The vercel.json configuration file lets you configure, and override the default behavior of Vercel from within your project. This includes settings for:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;cleanUrls&lt;br&gt;
trailingSlash&lt;br&gt;
redirects&lt;br&gt;
rewrites&lt;br&gt;
headers&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rM4d0kwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edflhijeq0t4wq2kinp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rM4d0kwm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edflhijeq0t4wq2kinp3.png" alt="Image description" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You can find my other 11ty deployments with vercel here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://base-blog-attempt1-i8gtgnt1y-rajivthummala-psu.vercel.app/"&gt;base blog with vercel&lt;/a&gt; &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ydp-P_fj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m4kytb6zedldwx38nqcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ydp-P_fj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m4kytb6zedldwx38nqcz.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hax-redo11ty-pqmdqot1b-rajivthummala-psu.vercel.app"&gt;hax with vercel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fa457cRB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qkjhhggtdbscsitcgoge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fa457cRB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qkjhhggtdbscsitcgoge.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is clear that microservice architecture is the future and Vercel is certainly playing a role in this revolution. Thanks for reading my post!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>11ty Introduction and Getting Started</title>
      <dc:creator>Rajiv Thummala</dc:creator>
      <pubDate>Mon, 28 Feb 2022 05:39:24 +0000</pubDate>
      <link>https://dev.to/rajivthummalapsu/11ty-introduction-and-getting-started-4b3h</link>
      <guid>https://dev.to/rajivthummalapsu/11ty-introduction-and-getting-started-4b3h</guid>
      <description>&lt;p&gt;As asserted by Stephanie Eckles of smashingmazine.com, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eleventy (aka 11ty) is rising in the ranks among static site generators. This Node-based builder is attractive due to its zero-config starting point, purely static output, and ease of achieving the coveted top Lighthouse performance score of four perfect 100s. Let’s dive into what else makes it unique, and learn about some essential concepts to help you successfully get started.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well why learn how to use 11ty? With the advent of microservice architecture reaching the forefront in the coming years, it is vital that it is added to your toolkit &lt;/p&gt;

&lt;p&gt;Easy to leverage and deploy with technologies such as Netlify, 11ty can be great for compiling files in your working directory to static HTML files. In fact, the process is barely taxing as there are many templates online to aid in the development process. &lt;/p&gt;

&lt;p&gt;11ty is great for compiling files in your working directory into static HTML files. There are a multitude of templates online that can be leveraged to aid in this process. Many of these templates that you find online are created to function effortlessly with Netlify. However, to get your site up with github pages, it will take a tad bit more effort. In this tutorial we will be making 3 different blogs that leverage 11ty and are hosted on github pages. &lt;/p&gt;

&lt;p&gt;These are my completed blogs that display my different dev.to posts. You can view them before we start learning. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scratch 11ty&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/RajivThummala-psu/11tyScratch"&gt;Source Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://rajivthummala-psu.github.io/11tyScratch/"&gt;Live Github Pages Site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hax 11ty&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/RajivThummala-psu/HaxRedo11ty"&gt;Source Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://rajivthummala-psu.github.io/HaxRedo11ty/"&gt;Live Github Pages Site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With a Template&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/RajivThummala-psu/baseBlogAttempt1"&gt;Source Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://rajivthummala-psu.github.io/baseBlogAttempt1/"&gt;Live Github Pages site&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Building an 11ty Site from Scratch and Deploying to Github Pages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First we are going to be running through how to work with 11ty from scratch. I did this by following this &lt;a href="https://11ty.rocks/posts/create-your-first-basic-11ty-website/"&gt;tutorial&lt;/a&gt;. This &lt;a href="https://www.youtube.com/watch?v=BKdQEXqfFA0"&gt;video&lt;/a&gt; was also of great help and offered insight into the inner workings of 11ty. &lt;/p&gt;

&lt;p&gt;Start by creating a new folder and then CD to it in the terminal. Run the following command: &lt;br&gt;
&lt;code&gt;npm install @11ty/eleventy&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;From here you want to open up the folder in Vscode or your preferred IDE. &lt;/p&gt;

&lt;p&gt;Open up package.json and change your scripts to match this screenshot. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fno55gpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jv6wxomxgyvtylw016zf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fno55gpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jv6wxomxgyvtylw016zf.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next create a new file in the root of your project called ".eleventy.js"&lt;/p&gt;

&lt;p&gt;Add the following into this file. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2MLzAIjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpl048b78f9hw7ke6x2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2MLzAIjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hpl048b78f9hw7ke6x2p.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;_Make sure your output is set to public because this where your index.html files will be generated. _&lt;/p&gt;

&lt;p&gt;Your next step is to make a source folder (src) with a markdown file named index.md. Github pages looks for an index when deploying so make sure that everything is lowercase as this process is case-sensitive. Addd some content to this file and npm start to check if everything is working. If you are getting the cannot get error, trace back your steps to see if you have made any mistakes with the naming of your index file. &lt;/p&gt;

&lt;p&gt;In order for 11ty to function, it looks for a folder called _includes. Create a folder called "_includes" in the src folder.&lt;/p&gt;

&lt;p&gt;Now we are going to add 2 njk files in this includes folder: base and post. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J77frspk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2x3kldaqkrcfu0qxjjqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J77frspk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2x3kldaqkrcfu0qxjjqc.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For VSCODE users: if your code is in all white look for plaintext at the bottom in the blue bar and type in HTML&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--whBnbzsd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yxljsq8eokgwdmc8jp51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--whBnbzsd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yxljsq8eokgwdmc8jp51.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go back into index.md and make sure the layout is set to your new base.njk file as it is in my repo. &lt;/p&gt;

&lt;p&gt;Now make a blog posts folder in your src folder and add a json file called blogPosts.json  --&amp;gt; fil the content as I have done here&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qMox_ofI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wovzsdgsfxtd3sxochr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qMox_ofI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4wovzsdgsfxtd3sxochr.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can make your posts as well inside of this folder but I opted to make them in the root to make it easier with the deployment to github pages. &lt;/p&gt;

&lt;p&gt;Make markdowns for your different posts and then head into your index markdown. Link to your different posts that you created as depicted in this screenshot. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zQXqgTlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nu8ggdvfon1g43tccu6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zQXqgTlU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nu8ggdvfon1g43tccu6t.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What follows is really important if you are deploying to github&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;Make a .github folder in the root with a folder named "workflows" inside of it. In this workflows folder create a yml file "main.yml"&lt;/p&gt;

&lt;p&gt;Fill the file with the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Build and Deploy
on: [push]
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: ACTIONS_ALLOW_UNSECURE_COMMANDS
        id: ACTIONS_ALLOW_UNSECURE_COMMANDS
        run: echo 'ACTIONS_ALLOW_UNSECURE_COMMANDS=true' &amp;gt;&amp;gt; $GITHUB_ENV

      - name: set env variable actor
        run: echo 'GITHUB_ACTOR=$GITHUB_ACTOR' &amp;gt;&amp;gt; $GITHUB_ENV

      - name: set env variable repo
        run: echo 'GITHUB_REPOSITORY=$GITHUB_REPOSITORY' &amp;gt;&amp;gt; $GITHUB_ENV
      - name: Checkout 🛎️
        uses: actions/checkout@v2.3.1 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly.
        with:
          persist-credentials: false        
      - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
        run: |
          npm install
          npm run build
      - name: Deploy 🚀
        uses: JamesIves/github-pages-deploy-action@3.5.7
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          BRANCH: gh-pages # The branch the action should deploy to.
          FOLDER: _site # The folder the action should deploy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lRrSHryT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bupy0d0ffuhozstcu275.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lRrSHryT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bupy0d0ffuhozstcu275.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cS6x1JT5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bu26nytuvw3j0yuqds75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cS6x1JT5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bu26nytuvw3j0yuqds75.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thats it! Not too much of a hassle considering you will rarely be leveraging 11ty from scratch. Push to github, go into settings &amp;gt;&amp;gt; pages &amp;gt;&amp;gt; and enable github pages. If you are running into errors with jekyll, add a .nojekyll file into the root and that should fix the issue. You can add a .gitignore file if you would like as well like I did --&amp;gt; check my repo for assistance with this. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with hax11ty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we are going to be working with hax11ty. &lt;/p&gt;

&lt;p&gt;Start by running the following command:&lt;br&gt;
&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/elmsln/hax11ty/master/hax11tyme.sh -o hax11tyme.sh &amp;amp;&amp;amp; sh hax11tyme.sh&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
CD to the folder in your terminal and run:&lt;/p&gt;

&lt;p&gt;yarn install&lt;br&gt;
yarn start&lt;/p&gt;

&lt;p&gt;Start by heading into src &amp;gt;&amp;gt; settings.js and filling in your metadata.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5j0OtwN5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g7glv1isx3kjcwwhlmbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5j0OtwN5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g7glv1isx3kjcwwhlmbp.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here on everything is quite easy as we have a template. Just exchange the markdowns in src &amp;gt;&amp;gt; content &amp;gt;&amp;gt; posts with yours. The main problems you may run into is with getting github pages to work with this, which is what I had to spend most of my time figuring out. Fortuantely, I was able to get it to work and can guide you through the main errors you will encounter. &lt;/p&gt;

&lt;p&gt;First and foremost, you must ensure that you have the main.yml file in the .github &amp;gt;&amp;gt; workflows folder. Check my repo for more guidance. Without this file github CANNOT build your site correctly. &lt;/p&gt;

&lt;p&gt;Next, you must let github pages know that you are using 11ty and not jekyll. Add a filed named ".nojekyll" into your root. You can leave it empty. Now deploy to Github pages and it should look like &lt;a href="https://rajivthummala-psu.github.io/HaxRedo11ty/content/posts/"&gt;this&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--II72IXIB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x3eqg1bql86q6q97akeh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--II72IXIB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x3eqg1bql86q6q97akeh.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11ty with a template&lt;/strong&gt;&lt;br&gt;
Now is the easy part. Since we will be working with a template, most of the work is already done for you. All you have to do is exchange the existing content with your own metadata and then push to github. For my attempt I leveraged the &lt;a href="https://github.com/11ty/eleventy-base-blog"&gt;base blog&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Clone the repo and install npm. Next edit the metadata in _data/metadata.json. &lt;/p&gt;

&lt;p&gt;Run eleventy with npx elevnty. &lt;/p&gt;

&lt;p&gt;Now to deploy you must again ensure that you are creating the .github folder with the workflows and main.yml file. Add a .nojekyll file into the root as well. Once you are done just push to github and enable github pages. If you are running into a 404 error, make sure that your index is visible in the root. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hp1MZSV---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rabv3ydvueoc09105048.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hp1MZSV---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rabv3ydvueoc09105048.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BpJn4n0g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2a5ahxbu3qae85kcqoe4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BpJn4n0g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2a5ahxbu3qae85kcqoe4.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Generating a Docker File for your NASA Image Search Repo</title>
      <dc:creator>Rajiv Thummala</dc:creator>
      <pubDate>Thu, 24 Feb 2022 01:08:21 +0000</pubDate>
      <link>https://dev.to/rajivthummalapsu/generating-a-docker-file-for-your-nasa-image-search-repo-100l</link>
      <guid>https://dev.to/rajivthummalapsu/generating-a-docker-file-for-your-nasa-image-search-repo-100l</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ATljzf7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2kuu6bmcqr4975els0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ATljzf7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2kuu6bmcqr4975els0h.png" alt="Image description" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First started in 2013, Docker is a set of platform as a service products that leverage OS-level virtualization to deliver software in containers. &lt;/p&gt;

&lt;p&gt;Containers make it easy to put new versions of software, with new business features, into production quickly-and to quickly roll back to a previous version if you need to. A form of virtualization, one single container can be utilized to run anything from a small microservice or software process to a larger application. Inside a container are all the necessary executables, binary code, libraries, and configuration files. Thus, docker is so powerful due to its ability to facilitate the microservice deployment process by leveraging containers to run across different computing environments. &lt;/p&gt;




&lt;p&gt;To begin, lets ensure that you have a rudimentary understanding of how docker functions. Please run through &lt;a href="https://www.docker.com/play-with-docker"&gt;this tutorial&lt;/a&gt; if you are not familiar with docker. &lt;/p&gt;

&lt;p&gt;If you are not running through the tutorial, ensure that you have your own server through Docker. If you are stuck on this, please run through the aforementioned tutorial. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EUIYS32h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxuec84i6jwn9ka0ltkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EUIYS32h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxuec84i6jwn9ka0ltkq.png" alt="Your screen should like like this" width="880" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The NASA Image Search Repository already has some adequate functionality. Leveraging microservices, the application can be deployed in a non-taxing way that does not increase in complexity as it is transferred between computing environments. However, there is one way to optimize this deployment: containers. Docker will help us integrate our microservices into containers and will consequently avoid becoming a monolithic application. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create ADD NEW INSTANCE in the Docker Playground. Run the following command in the new instance console.&lt;br&gt;
&lt;code&gt;git clone https://github.com/IST402-Group-E/ip project/blob/master/src/Nasa.js &amp;amp;&amp;amp; cd Nasa.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we ran any Docker commands, we need to configure our custom settings for this application. These settings will be an API key and the url of your Play With Docker instance.&lt;/p&gt;

&lt;p&gt;Run the following command to set up a fresh copy of your environment settings.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp dot.env.example dot.env&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What we just done is created a new file called dot.env. Following the configuration as code principle, we are going to add our applications custom settings via environment variables. Docker relies on this pattern to ensure the application thats running inside of it is stateless.&lt;/p&gt;

&lt;p&gt;Now we need to populate those settings.&lt;/p&gt;

&lt;p&gt;Select the EDITOR button in your docker lab (it is to the right of the orange DELETE button)&lt;/p&gt;

&lt;p&gt;Now we need to obtain our api key, which will be our unique password for requesting a new query. Head over to api.nasa.gov to signup and generate an api key for NASA Image search. &lt;/p&gt;

&lt;p&gt;Obtain this key and then insert it into dot.env (replace it with XXXXXXX)&lt;/p&gt;

&lt;p&gt;Now select open port in docker&lt;br&gt;
Type 4000 into the prompt and click "Ok".&lt;/p&gt;

&lt;p&gt;You should see a new page that is blank since there is no running application yet. COPY the url that blank page. That's were our server will be accessible when we get this thing running.&lt;/p&gt;

&lt;p&gt;Now that we have the public url we can add it to our dot.env and click "Save"&lt;/p&gt;

&lt;p&gt;Now just head over to docker and start up the application&lt;/p&gt;

&lt;p&gt;Run the following command in your terminal: docker-compose-up. Select port 80 to view our application!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Feeding IP addresses into the API of GeoIP to Obtain Geographic Coordinates (Lat/Long)</title>
      <dc:creator>Rajiv Thummala</dc:creator>
      <pubDate>Mon, 31 Jan 2022 04:45:51 +0000</pubDate>
      <link>https://dev.to/rajivthummalapsu/feeding-ip-addresses-into-the-api-of-geoip-to-obtain-geographic-coordinates-latlong-2o2d</link>
      <guid>https://dev.to/rajivthummalapsu/feeding-ip-addresses-into-the-api-of-geoip-to-obtain-geographic-coordinates-latlong-2o2d</guid>
      <description>&lt;p&gt;This will be a brief synopsis and run through on how latitude and longitude coordinates can be detected via GeoIP. Particularly, by feeding IP addresses into the GeoIP API. You can follow along with my &lt;a href="https://github.com/RajivThummala-psu/ip-project/blob/master/src/LocationFromIP.js"&gt;github repo&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Before we get started, let's import the necessary dependencies within your project. Since we are going to be wiring up the data to a wikipedia-query tag, we will need to import the following dependency: @lrnwebcomponents/wikipedia-query/wikipedia-query.js&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Make sure you are using the right syntax&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y6UB2uNp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8ycv2suy22w095bxten.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y6UB2uNp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8ycv2suy22w095bxten.png" alt="Image description" width="880" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To complete the setup process we will also need to do npm install @lrnwebcomponents/wikipedia-query&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nzwBkGOy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/csmpiw6tqrlsky52cf0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nzwBkGOy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/csmpiw6tqrlsky52cf0y.png" alt="Image description" width="880" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you parse through the constructor repo, you will notice that the first API you run into is: &lt;strong&gt;&lt;a href="https://freegeoip.app/json/"&gt;https://freegeoip.app/json/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the GeoIP API. Unfortunately, at the time of this writing, the server is down so I am unable to provide an overview of all the services this API offers in particular. However, you can head over to this link to poke around. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deciphering the GeoIP API?&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wQDZ5bXX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s433cvg4apylswqwr78k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wQDZ5bXX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s433cvg4apylswqwr78k.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will notice that the geoip is set to the locationEndpoint. &lt;/p&gt;

&lt;p&gt;An endpoint, as adumbrated by &lt;a href="https://smartbear.com/learn/performance-monitoring/api-endpoints/#:~:text=Each%20endpoint%20is%20the%20location,to%20carry%20out%20their%20function.&amp;amp;text=The%20place%20that%20APIs%20send,lives%2C%20is%20called%20an%20endpoint."&gt;smartbear.com&lt;/a&gt;, enables  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;APIs to transfer vital information, processes, transactions, and more. API usage will only increase as time goes on, and making sure that each touchpoint in API communication is intact is vital to the success of each API. Endpoints specify where resources can be accessed by APIs and play a key role in guaranteeing the correct functioning of the software that interacts with it.  In short, API performance relies on its ability to communicate effectively with API Endpoints.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thus, this will serve as an endpoint in which the GeoAPI will retrieve information regarding the client's location to carry out an operation. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5g7ZBINk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcs1fkmabm1x55j3lrhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5g7ZBINk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fcs1fkmabm1x55j3lrhg.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will also notice that GeoIP is referenced in the async getGeoIPData() method. Let's take some time to pick apart what is going on here.&lt;/p&gt;

&lt;p&gt;`async getGEOIPData() {&lt;br&gt;
    const IPClass = new UserIP();&lt;br&gt;
    const userIPData = await IPClass.updateUserIP();&lt;br&gt;
    return fetch(this.locationEndpoint + userIPData.ip)&lt;br&gt;
      .then(resp =&amp;gt; {&lt;br&gt;
        if (resp.ok) {&lt;br&gt;
          return resp.json();&lt;br&gt;
        }&lt;br&gt;
        return false;&lt;br&gt;
      })&lt;br&gt;
      .then(data =&amp;gt; {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    console.log(data);
    this.state = data.region_name; //avoided making the same mistake as last time (reminder --&amp;gt; region name)
    this.city = data.city;
    this.location = `${data.city}, ${data.state}`;
    this.lat = data.latitude; 
    this.long = data.longitude;

    console.log(`Your coordinates: ${this.lat} ${this.long}`);
    return data;
  });`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To make it easier, lets split this up into 2 parts to get a better understanding: Obtain information from the API &amp;amp; Feed into LitElement based web component to provide stateful updating of the DOM&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obtain information from the API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lets begin by taking a look at this segment:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;async getGEOIPData() {&lt;br&gt;
    const IPClass = new UserIP();&lt;br&gt;
    const userIPData = await IPClass.updateUserIP();&lt;br&gt;
    return fetch(this.locationEndpoint + userIPData.ip)&lt;br&gt;
      .then(resp =&amp;gt; {&lt;br&gt;
        if (resp.ok) {&lt;br&gt;
          return resp.json();&lt;br&gt;
        }&lt;br&gt;
        return false;&lt;br&gt;
      })&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The fetch command in particular should strike you as new if you have not worked with this language much. It was for me atleast. However, you will quickly learn from a google search that it works similar to the throw and catch commands from java. &lt;/p&gt;

&lt;p&gt;What is happening here is that the program is essentially throwing out a mandatory request for the program to provide information regarding the location endpoint, which we instantiated in the constructor. If the program does not get a response, it will catch it (through returning false in this case). As stated earlier, the location endpoint serves as a checkpoint for the API to retrieve information regarding the client's location. &lt;/p&gt;

&lt;p&gt;What you will notice also is that "userIPData.ip" is also being fetched. Lets take a look at this further. You can follow along in my repo if that is easier!&lt;/p&gt;

&lt;p&gt;`async updateUserIP() {&lt;br&gt;
    return fetch(this.ipLookUp)&lt;br&gt;
      .then(resp =&amp;gt; {&lt;br&gt;
        if (resp.ok) {&lt;br&gt;
          return resp.json();&lt;br&gt;
        }&lt;br&gt;
        return false;&lt;br&gt;
      })&lt;br&gt;
      .then(data =&amp;gt; {&lt;br&gt;
        this.ip = data.ip;&lt;br&gt;
        this.cityYouAreIn = data.city;&lt;br&gt;
        this.countryYouAreIn = data.country;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    this.location = `${data.city}, ${data.country}`;

    // this.location = "Your location is: " + data.cityYouAreIn+ ", " + data.countryYouAreIn; //understood that the data. references the getproperties method
    return data;
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}`&lt;/p&gt;

&lt;p&gt;We will notice here that the updateUserIP method is being used to retrieve information regarding the user's ip address and listing readable info regarding their whereabouts (city &amp;amp; country). It is also fetching ipLookUP (&lt;a href="https://ip-fast.com/api/ip/?format=json&amp;amp;location=True"&gt;https://ip-fast.com/api/ip/?format=json&amp;amp;location=True&lt;/a&gt;), which can be found in the constructor in this file. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7cY3drq9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa1uuy43jdvn5qx14amy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7cY3drq9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa1uuy43jdvn5qx14amy.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ipLookup references an API called ip-fast. ip-fast is an API that analyzes the client's network activity to approximate their location. In case of error, it will return false to catch. &lt;/p&gt;

&lt;p&gt;Both of these API's are thus added together to obtain the geoIPdata. Therefore, what we essentially have here in the async getGEOIPData() method enables us to leverage 2 APIs to retrieve the information that we need. But what do we do now that the data has been fetched?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feed into LitElement based web component to provide stateful updating of the DOM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;`  })&lt;br&gt;
      .then(data =&amp;gt; {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    this.state = data.region_name; //avoided making the same mistake as last time (reminder --&amp;gt; region name)
    this.city = data.city;
    this.location = `${data.city}, ${data.state}`;
    this.lat = data.latitude; 
    this.long = data.longitude;

    console.log(`Your coordinates: ${this.lat} ${this.long}`);
    return data;
  });`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now if we take a look at this second half of the method, we will notice that the data is actually being entered into the console for use. When I first ran into this section of the program, I actually found it quite easy to interpret despite being unfamiliar with this syntax. &lt;/p&gt;

&lt;p&gt;We start of with "then the data"...&lt;/p&gt;

&lt;p&gt;Is used to retrieve information regarding the client's state. You must call for state through region_name as opposed to just data.state (don't make the same mistake I did). Next you can see that the city and location are retrieved. We also add both latitude and longitude into our instances so that we can obtain the geographical coordinates. Ensure that you are doing data.latitude and data.longitude NOT data.lat and data.long. &lt;/p&gt;

&lt;p&gt;These instances are then simply fed into the console.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.log(&lt;/code&gt;Your coordinates: ${this.lat} ${this.long}&lt;code&gt;);&lt;br&gt;
        return data;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;From here, all you have to do is render. I referenced &lt;a href="https://codepen.io/btopro/pen/yLNmVbw"&gt;btopro's codepen&lt;/a&gt; to do this, as you can see in my repo. &lt;/p&gt;

&lt;p&gt;After copious efforts getting all the bugs out of my code, I am close to getting an accurate solution. I will continue to update the repo as I optimize the program.&lt;/p&gt;

&lt;p&gt;As you can see, leveraging public API's to perform functions are seamless and potent. There are a multitude of micro services across the web that can be utilized to achieve a goal in a non-taxing manner. &lt;/p&gt;

&lt;p&gt;NASA Rendering in particular is a great one, which provides the ability to render images from NASA by leveraging their &lt;a href="https://api.nasa.gov/api.html#apod"&gt;public api&lt;/a&gt;. This enables individuals that are not affiliated with NASA to easily access this large stack of information with ease. &lt;/p&gt;

&lt;p&gt;As highlighted by &lt;a href="https://wilsjame.github.io/how-to-nasa/"&gt;wilsjame&lt;/a&gt;, these are just some of the &lt;a href="https://api.nasa.gov/api.html#apod"&gt;many APIs&lt;/a&gt; that can be used: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Near Earth Object Web Service (NeoWs): Access to near Earth asteroid information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Earth Polychromatic Imaging Camera (EPIC): Full disc imagery of the Earth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Earth Observatory Natural Event Tracker (EONET): Prototype web service providing continuously updated natural event metadata, such as storm imagery, gathered from the Earth’s surface.&lt;br&gt;
NASA Image and Video Library: Access to the NASA Image and Video Library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sounds (beta): Access to space sounds via SoundClound with some of the hassle abstracted away.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;NASA rendering; render images from NASA using their public API to render the data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good luck on your attempt and I thank you for taking your time to read this post. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>An introduction to open-wc</title>
      <dc:creator>Rajiv Thummala</dc:creator>
      <pubDate>Mon, 17 Jan 2022 20:47:47 +0000</pubDate>
      <link>https://dev.to/rajivthummalapsu/an-introduction-to-open-wc-27i3</link>
      <guid>https://dev.to/rajivthummalapsu/an-introduction-to-open-wc-27i3</guid>
      <description>&lt;p&gt;Upon dipping your feet into the behemoth that is web development, you will quickly realize how non-static this field is. Everything is constantly changing and evolving, from updates to web protocols to constant syntax alterations. Consequently, a 1337 developer must periodically update their toolkit with the new fads and revolutions within the industry. &lt;/p&gt;

&lt;p&gt;With a sector that is never static, it is vital that the fundamentals of web development are mastered to provide a base in expanding a developer's toolkit. Perhaps one of the most important fundamentals to grasp is the basics of JavaScript. As adumbrated by tutorialspoint:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Javascript is the most popular programming language in the world and that makes it a programmer’s great choice. Once you learnt Javascript, it helps you developing great front-end as well as back-end softwares using different Javascript based frameworks like jQuery, Node.JS etc. Javascript is everywhere, it comes installed on every modern web browser and so to learn Javascript you really do not need any special environment setup. For example Chrome, Mozilla Firefox , Safari and every browser you know as of today, supports Javascript.Javascript helps you create really beautiful and crazy fast websites. You can develop your website with a console like look and feel and give your users the best Graphical User Experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article will provide a beginners perspective on how to begin to interact with JavaScript and will facilitate the setup process to begin exploring the language. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NodeJS &amp;amp; NPM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our first journey together in the world of JavaScript will begin by installing a software named "NodeJS". What exactly is NodeJS?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In simple terms, it’s a JavaScript free and open source cross-platform for server-side programming that allows users to build network applications quickly. &lt;a href="https://medium.com/@LindaVivah/the-beginners-guide-understanding-node-js-express-js-fundamentals-e15493462be1"&gt;Click here to learn more about NodeJS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Follow the listed steps closely and don't hesitate to scour the internet further to diagnose any challenges you encounter. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1)&lt;/strong&gt; Head over to &lt;a href="https://nodejs.org/en/"&gt;&lt;/a&gt; and select the big green button on the left that reads LTS. In my case, the version is 16.13.2 LTS. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xSP0f5v3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acy4bjyhnybk6x2ujpqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xSP0f5v3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acy4bjyhnybk6x2ujpqc.png" alt="Image description" width="624" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you finish downloading, proceed to the next step. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2)&lt;/strong&gt; Next, hold the windows key + R and type "cmd" in the run box that pops up. You can also type "command prompt" into the search bar in your computer if you prefer. This should open up a black box. This is called the terminal or command prompt. &lt;/p&gt;

&lt;p&gt;Type node-v into your terminal. This will be used to check what version of NodeJS you have downloaded. Moreover, it will be used to check if you have actually downloaded NodeJS. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e3h4jIdA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/evw47bt1u8jvcv3c1gju.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e3h4jIdA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/evw47bt1u8jvcv3c1gju.png" alt="You should get something like this" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should have something like this. The number following the "v" is your version number. (Don't worry if it is different than what I have you may proceed to the next step). If you are encountering issues, head over to YouTube to search for a NodeJS download tutorial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3)&lt;/strong&gt; Next we are going to make sure that npm downloaded correctly. Npm is a package manner that JavaScript leverages to facilitate the runtime environment. &lt;/p&gt;

&lt;p&gt;Run the command npm-v to see what version of npm you have downloaded. Again, the same thing applies here. Don't worry if the numbers following the v are different than the following image. This indicates your version number. If you do not have npm installed, try running the following commmand in your terminal:&lt;/p&gt;

&lt;p&gt;npm install -g npm&lt;/p&gt;

&lt;p&gt;If you are still running into trouble, head over to YouTube to search for installation tutorials for npm. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ivUBEq0b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10lhy60b79hxkwxj0bpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ivUBEq0b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10lhy60b79hxkwxj0bpb.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing ohmyzsh&lt;/strong&gt;&lt;br&gt;
Next we will work on installing ohmyzsh. Zsh will aid tremendously in operating the terminal. Head over to &lt;a href="https://dev.to/vsalbuq/how-to-install-oh-my-zsh-on-windows-10-home-edition-49g2"&gt;&lt;/a&gt; for any extra explanations on the following steps. &lt;/p&gt;

&lt;p&gt;1) To start, type "windows powershell" into the search bar in your computer. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hacOFgcx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x93a14lwcckpj4s8thw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hacOFgcx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x93a14lwcckpj4s8thw6.png" alt="Image description" width="880" height="764"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select "run as administrator" as depicted in the image. If you do not have windows powershell, I would advise downloading it from the Microsoft Store. Otherwise, you can try running the following steps from your regular terminal/command prompt. &lt;/p&gt;

&lt;p&gt;2) Run the following command in windows powershell: &lt;/p&gt;

&lt;p&gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart&lt;/p&gt;

&lt;p&gt;3) This leads us into our next step which is to install debian. Head over to the microsoft store on your windows machine and search for "debian". Install the application as depicted in the following image. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vt-4z0sx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dbo1mhm13bqdtpfin1yh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vt-4z0sx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dbo1mhm13bqdtpfin1yh.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) Next open up debian either through the microsoft store or by searching for it in the search bar. &lt;/p&gt;

&lt;p&gt;Run the following commands in order. &lt;/p&gt;

&lt;p&gt;$ sudo apt-get update&lt;br&gt;
$ sudo apt-get upgrade&lt;br&gt;
$ sudo apt-get install zsh&lt;br&gt;
$ zsh&lt;br&gt;
$ sudo apt-get install curl&lt;br&gt;
sh -c "$(curl -fsSL &lt;a href="https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"&gt;https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;5) Restart debian and make sure that you see .zsh somewhere in the terminal. This lets you know that you have installed zsh correctly. &lt;/p&gt;

&lt;p&gt;6) Next we will be installing the node within zsh. &lt;/p&gt;

&lt;p&gt;Understanding how Node works and its primary function is important. As referenced on medium.com, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Node allows you to execute Javascript code outside of the browser, in a computing environment (such as a server or local development environment) rather then a browser environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In laymans terms, node essentially enables an individual to execute their code in a sandbox environment. (Without causing any real damage). Think of it like practicing an idea for a painting on a sheet of printer paper before starting on the canvas. &lt;/p&gt;

&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;$ sudo apt-get install build-essential&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wvrx6F8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u91t9kbyz8ik6mtt095g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wvrx6F8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u91t9kbyz8ik6mtt095g.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7) Run the following command:&lt;/p&gt;

&lt;p&gt;curl -o- &lt;a href="https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh"&gt;https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh&lt;/a&gt; | bash&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i6QD6R5z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sxhwjmcpojq8nhm0y0x4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i6QD6R5z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sxhwjmcpojq8nhm0y0x4.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8) Make sure that you have VSCODE installed before you proceed. If you do not have vscode installed, follow the steps linked in this video and then come back. --&amp;gt; &lt;a href="https://www.youtube.com/watch?v=V3o57MU5eoE"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;code ~/.zshrc&lt;/p&gt;

&lt;p&gt;This will open up vscode with a file. Click on the .zshrc tab and paste the following code after the last line. &lt;/p&gt;

&lt;p&gt;export NVM_DIR="$HOME/.nvm"&lt;br&gt;
[ -s "$NVM_DIR/nvm.sh" ] &amp;amp;&amp;amp; . "$NVM_DIR/nvm.sh"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M5QD-zJO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sew4kw6zxfohtk9usi9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M5QD-zJO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sew4kw6zxfohtk9usi9g.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the VSCODE file (Ctrl + S), then exit VSCODE. &lt;/p&gt;

&lt;p&gt;9) Open up debian and run the following command:&lt;/p&gt;

&lt;p&gt;nvm install --lts&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qn-tWKpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6w7p1c72fsyxrm9bqhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qn-tWKpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6w7p1c72fsyxrm9bqhd.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next run this command: nvm use --lts&lt;/p&gt;

&lt;p&gt;Nice Work! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting with open-wc&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we will take our first dive into working with open-wc. &lt;/p&gt;

&lt;p&gt;1) Before we get started, you will need to create your github account and a repository. Follow the steps in this &lt;a href="https://www.youtube.com/watch?v=QUtk-Uuq9nE"&gt;video &lt;/a&gt;then proceed to the next step. &lt;/p&gt;

&lt;p&gt;2) Next, you will need to establish a secure, SSH key based handshake with github. Follow the steps in this &lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh"&gt;article &lt;/a&gt; to complete this task, then proceed to the next step. &lt;/p&gt;

&lt;p&gt;3) Open your terminal (windows key  + r --&amp;gt; type in cmd in run box). Next you will need to navigate your github repo that you created. &lt;/p&gt;

&lt;p&gt;Find your github repo in your file explorer and right click the file to copy the path to your clipboard. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---u_DhW3x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wphs8dkl3icm74w31mcl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---u_DhW3x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wphs8dkl3icm74w31mcl.png" alt="Image description" width="458" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your terminal, type cd then paste in the file path. &lt;br&gt;
This should change your directory to your github repo that you created. &lt;/p&gt;

&lt;p&gt;4) In the terminal type npm init @open-wc. Wait for the terminal to complete its processing. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8-jj3EkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcf0ai8ykt9xqxhdoqtn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8-jj3EkN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcf0ai8ykt9xqxhdoqtn.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5) You should now see a gui that prompts you with some options. &lt;br&gt;
Navigate through the UI to select the following options:&lt;/p&gt;

&lt;p&gt;What would you like to do today? &amp;gt;&amp;gt; Scaffold a new project&lt;br&gt;
What would you like to scaffold?&amp;gt;&amp;gt; Web Component&lt;br&gt;
What would you like to add &lt;em&gt;(just click enter)&lt;/em&gt; &amp;gt;&amp;gt; &lt;br&gt;
Would you like to use typescript? &amp;gt;&amp;gt; No&lt;/p&gt;

&lt;p&gt;_for the following option, replace what follows hello-world with whatever you would like _&lt;/p&gt;

&lt;p&gt;What is the tagname of your web component &amp;gt;&amp;gt; hello-world_RajivLab1&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w84HEY5R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7nm9jm448nhcgl6ojvj2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w84HEY5R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7nm9jm448nhcgl6ojvj2.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write the file to disk and install dependencies. &lt;/p&gt;

&lt;p&gt;6) Follow the instructions in the terminal. &lt;br&gt;
Change the directory to your web component and then run the following command:&lt;/p&gt;

&lt;p&gt;npm run start &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ds2WI8TS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9lecqublj3pv5k8y0b2m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ds2WI8TS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9lecqublj3pv5k8y0b2m.png" alt="Image description" width="880" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7) A browser should pop up with localhost in the address. Right click this page and click "view page source"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JncfzSQt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u1r3y5j4itpiqyf63zca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JncfzSQt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u1r3y5j4itpiqyf63zca.png" alt="Image description" width="724" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You now have access to the source code of this page. &lt;/p&gt;

&lt;p&gt;8) Now lets go ahead and begin to decipher what this code is asking of us. Right click and select "Save as" to download the page. &lt;/p&gt;

&lt;p&gt;9) Drag this downloaded file into vscode so that we can comment on the file and start to decipher what the code is doing.&lt;/p&gt;

&lt;p&gt;If this is your first time with JavaScript, start by copy and pasting each line of code into google to try and make sense of it. Leave a comment by typing //your_comment_goes_here to annotate what you believe the code is doing. &lt;/p&gt;

&lt;p&gt;This &lt;a href="https://lit.dev/playground/#sample=examples/full-component"&gt;article &lt;/a&gt;will help.    &lt;/p&gt;




&lt;p&gt;You can access my first ever interaction with this code snippet on my Github which is linked &lt;a href="https://github.com/RajivThummala-psu/ist402_lab1/blob/main/localhost.htm"&gt;here&lt;/a&gt;. Thank you for reading this article and I wish you good luck on the rest of your JavaScript journey. &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
